Oracle INSERT报expecting SELECT错误原因排查及修复咨询
问题修复说明
错误根因
ignore_row_on_dupkey_index是Oracle的INSERT语句专用提示,语法要求必须紧跟在INSERT关键字之后,绝大多数expecting SELECT报错都是因为提示放置位置错误,放到了INTO子句后面或者SELECT子句前面,导致SQL解析器无法识别语句结构。- 少数情况为提示参数格式错误:需要严格按照
/*+ ignore_row_on_dupkey_index(目标表名, 唯一索引/唯一约束名) */格式书写,表名、索引名不需要加引号,拼写要和数据库中实际定义完全一致(如果创建时用了双引号指定大小写,参数也要对应大小写)。
修复方案
正确语法示例
-- 提示紧跟INSERT关键字之后是核心要求 INSERT /*+ ignore_row_on_dupkey_index(test_table, test_table_uk) */ INTO test_table (id, name, create_time) SELECT id, name, create_time FROM test_source_table WHERE is_valid = 1;
常见错误写法对照
-- 错误写法1:提示放在INTO之后,会触发expecting SELECT报错 INSERT INTO test_table /*+ ignore_row_on_dupkey_index(test_table, test_table_uk) */ (id, name, create_time) SELECT id, name, create_time FROM test_source_table; -- 错误写法2:提示参数加引号,会导致提示失效或语法报错 INSERT /*+ ignore_row_on_dupkey_index('test_table', 'test_table_uk') */ INTO test_table (id, name, create_time) SELECT id, name, create_time FROM test_source_table;
内容的提问来源于stack exchange,提问作者Beefstu
相关产品推荐
相关产品推荐

