INSERT ALL INTO ACCESS (DADSNBR,DARolEID) VALUES (68,1) INTO ACCESS (DADSNBR,2) INTO ACCESS (DADSNBR,3) INTO ACCESS (DADSNBR,4)SELECT 1 FROM DUAL
由于语句中的某些条目与数据库中已存在的条目重复,因此整个插入失败并且未插入任何行.
有没有办法忽略唯一约束失败的情况,只需插入唯一的那些,而不必将其拆分成单独的INSERT语句?
编辑:我意识到我可能不想这样做,但我仍然很好奇它是否可能.
在Oracle中,语句要么完全成功要么完全失败(它们是原子的).但是,您可以在某些情况下添加子句来记录异常而不是引发错误:>使用BulK ColLECT – SAVE EXCEPTIONS,如this thread on askTom所示,
>或使用DBMS_ERRLOG
(我认为10g以后可用).
第二种方法都是自动的,这是一个演示(使用11gR2):
sql> CREATE table test (pk1 NUMBER,2 pk2 NUMBER,3 CONSTRAINT pk_test PRIMARY KEY (pk1,pk2));table created.sql> /* Statement fails because of duplicate */sql> INSERT into test (SELECT 1,1 FROM dual CONNECT BY LEVEL <= 2);ERROR at line 1:ORA-00001: unique constraint (VNZ.PK_TEST) violatedsql> BEGIN dbms_errlog.create_error_log('TEST'); END; 2 /PL/sql procedure successfully completed.sql> /* Statement succeeds and the error will be logged */sql> INSERT into test (SELECT 1,1 FROM dual CONNECT BY LEVEL <= 2) 2 LOG ERRORS REJECT liMIT UNliMITED;1 row(s) inserted.sql> select ORA_ERR_MESG$,pk1,pk2 from err$_test;ORA_ERR_MESG$ PK1 PK2--------------------------------------------------- --- ---ORA-00001: unique constraint (VNZ.PK_TEST) violated 1 1
您可以将LOG ERROR子句与INSERT ALL一起使用(感谢@Alex Poole),但您必须在每个表之后添加子句:
sql> INSERT ALL 2 INTO test VALUES (1,1) LOG ERRORS REJECT liMIT UNliMITED 3 INTO test VALUES (1,1) LOG ERRORS REJECT liMIT UNliMITED 4 (SELECT * FROM dual);0 row(s) inserted.总结
以上是内存溢出为你收集整理的Oracle’INSERT ALL’忽略重复项全部内容,希望文章能够帮你解决Oracle’INSERT ALL’忽略重复项所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)