Oracle使用IGNORE_ROW_ON_DUPKEY_INDEX提示报ORA-38913错误咨询
ORA-38913报错原因及修复方案
核心错误原因
IGNORE_ROW_ON_DUPKEY_INDEX提示仅支持两种合法传参格式:
- 格式1:
/*+ IGNORE_ROW_ON_DUPKEY_INDEX(表名 索引名) */,表名和索引名直接用空格分隔,不需要括号包裹索引名 - 格式2:
/*+ IGNORE_ROW_ON_DUPKEY_INDEX(表名 (索引对应的列组合)) */,括号内必须填写索引覆盖的全部列,顺序和索引定义一致
你的第一种场景使用格式2时,括号内填写的是主键列t_pk,和主键索引的列完全匹配,因此运行正常。第二种场景你写的ignore_row_on_dupkey_index (t1 ( t1_pk))中,t1_pk是主键约束的名称,不是索引列,数据库找不到对应索引,因此触发ORA-38913报错。
修复方案
两种合法写法任选其一即可:
写法1:指定索引名(推荐)
直接填写你定义的主键约束名t1_pk,不需要加括号:
insert /*+ ignore_row_on_dupkey_index(t1 t1_pk) */ INTO t1( a ,b ,c ,d ,e ,f ,g ,h ) VALUES (1, TO_DATE('2021-08-28 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),1,1, TO_DATE('2021-08-28 13:27:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-08-28 13:30:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-08-28 13:27:20', 'YYYY-MM-DD HH24:MI:SS'), 'G');
写法2:指定索引对应的全量列
按顺序把主键包含的8个列全部写在括号内:
insert /*+ ignore_row_on_dupkey_index(t1 (a,b,c,d,e,f,g,h)) */ INTO t1( a ,b ,c ,d ,e ,f ,g ,h ) VALUES (1, TO_DATE('2021-08-28 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),1,1, TO_DATE('2021-08-28 13:27:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-08-28 13:30:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-08-28 13:27:20', 'YYYY-MM-DD HH24:MI:SS'), 'G');
内容的提问来源于stack exchange,提问作者Pugzly
相关产品推荐
相关产品推荐

