基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
OceanBase 数据库 V3.x 版本 INSERT SELECT 含 SEQUENCE 列 SQL 执行报错 -4002, Invalid argument 的原因和解决方法
更新时间:2026-05-25 09:11
问题现象
OceanBase 数据库 V3.x 版本老引擎情况下(即 _enable_static_typing_engine 为 false),INSERT SELECT SQL 向 SEQUENCE 填充列插入数据时报错 -4002, Invalid argument。
obclient [SYS]> CREATE SEQUENCE SEQ_ID START WITH 1 INCREMENT BY 1 NOMAXVALUE;
Query OK, 0 rows affected (0.022 sec)
obclient [SYS]> CREATE TABLE TEST01 (ID NUMBER (11) DEFAULT SEQ_ID.NEXTVAL NOT NULL,CASE_ID NUMBER(11) DEFAULT 0 NOT NULL);
Query OK, 0 rows affected (0.059 sec)
obclient [SYS]> INSERT INTO TEST01 (ID, case_id) SELECT 100000001, case_id FROM (SELECT 123456 AS case_id FROM dual);
ORA-00600: internal error code, arguments: -4002, Invalid argument
[127.0.0.1:2882] [2024-08-24 17:55:35.089141] [xxxxx-xxxxx-xxxxx-xxxxx]
关键信息
trace_id 日志。
[2024-08-24 17:55:35.083588] WARN [SQL.ENG] get_next_row (ob_phy_operator.cpp:497) [1574][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=4] [dc=0] get next row failed(ret=-4002, type=84, op="PHY_SEQUENCE") [2024-08-24 17:55:35.083661] WARN [STORAGE] insert_rows (ob_pg_storage.cpp:3528) [1574][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=4] [dc=0] failed to insert rows(ret=-4002, this={this:0xfffe1b64cec0, pkey:{tid:1100611139453777, partition_id:0, part_cnt:0}, meta:0xfffe2136ba60, log_seq_num:0, last_freeze_ts:0}, ctx={mem_ctx:0xfffe048145d0, warm_up_ctx:null, tables:null, tenant_id:0, trans_id:{hash:14691044093640912749, inc:129942, addr:"127.0.0.1:2882", t:1724493335082064}, is_sp_trans:true, isolation:1, sql_no:1, stmt_min_seq_no:1724493335063205, snapshot_info:{snapshot_version:-1, read_seq_no:0, sql_no:0, trans_id:{hash:0, inc:0, addr:"0.0.0.0", t:0}, is_cursor_or_nested:false}, trans_table_guard:0xfffe048163d8, access_type:0, saved_read_snapshot:-1, trans_ctx:null, trans_desc:null, encrypt_meta:null, is_thread_scope:true}) [2024-08-24 17:55:35.083793] WARN [SQL.ENG] open (ob_phy_operator.cpp:167) [1574][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=6] [dc=0] Open this operator failed(ret=-4002, op_type="PHY_INSERT")执行计划。
obclient [SYS]> explain extended INSERT INTO TEST01 (ID, case_id) SELECT 100000001, case_id FROM (SELECT 123456 AS case_id FROM dual)\G *************************** 1. row *************************** Query Plan: ======================================== |ID|OPERATOR |NAME |EST. ROWS|COST| ---------------------------------------- |0 |INSERT | |1 |1 | |1 | SEQUENCE | |1 |1 | |2 | SUBPLAN SCAN|VIEW1|1 |1 | |3 | EXPRESSION | |1 |1 | ======================================== Outputs & filters: ------------------------------------- 0 - output([nextval(1)(0xfffdd90b0d20)], [VIEW1.100000001(0xfffdd90add80)], [VIEW1.CASE_ID(0xfffdd90ae070)]), filter(nil), columns([{TEST01: ({TEST01: (TEST01.__pk_increment(0xfffdd90b0a30), TEST01.ID(0xfffdd9042af0), TEST01.CASE_ID(0xfffdd904c520))})}]), partitions(p0) 1 - output([VIEW1.100000001(0xfffdd90add80)], [VIEW1.CASE_ID(0xfffdd90ae070)]), filter(nil) 2 - output([VIEW1.100000001(0xfffdd90add80)], [VIEW1.CASE_ID(0xfffdd90ae070)]), filter(nil), access([VIEW1.100000001(0xfffdd90add80)], [VIEW1.CASE_ID(0xfffdd90ae070)]) 3 - output([100000001], [123456]), filter(nil) values({100000001, 123456})
问题原因
表中 ID 列的 DEFAULT 值是 SEQ_ID.NEXTVAL,在执行类似 INSERT INTO CASE_HISTORY(ID) VALUE(DEFAULT); 语句时,这个 DEFAULT SEQUENCE 会被用来生成一个自增值作为 ID 列的默认值,所以计划中会生成一个 SEQUENCE 算子。
如插入语句类似于 INSERT INTO TEST01 (ID, case_id) SELECT 100000001, case_id FROM (SELECT 123456 AS case_id FROM dual);, 这种情况下指定了 ID 列的值,不需要生成默认值,所以也就不需要再生成 SEQUENCE 算子,但是当前仍然生成了这个不必要的 SEQUENCE 算子。
在老引擎下,老的 SEQUENCE 算子如果没有生成表达式,它就不能向上传递结果,就会报 -4002。由于这个不必要的 SEQUENCE 算子不需要生成值,实际从执行计划看也没有生成 NEXTVAL 表达式,所以在向上传递结果时,报错了 -4002。
问题的风险及影响
SQL 执行出错。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
适用版本
OceanBase 数据库 V3.x 版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V3.2.3 BP10 Hotfix10(oceanbase-3.2.3.3-110100012024042814)及之后版本。