oracle insert 并发避免重复,Oracle 'INSERT ALL'忽略重复项

在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) violated

SQL> 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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值