Oracleでは、ステートメントは完全に成功するか、完全に失敗します(アトミックです)。ただし、場合によっては、エラーを発生させる代わりに、例外をログに記録する句を追加できます。
-
BULKCOLLECT-例外を保存
を使用する 、このスレッドに示されているようにaskTomで 、 - または
DBMS_ERRLOG コード> (10gから利用できると思います)
2番目の方法はすべて自動です。これがデモです(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
を含む句 ( @AlexPoole
に感謝します )、ただし、各テーブルの後に句を追加する必要があります:
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.