In Oracle, statements are either fully completed or fully completed (they are atomic). However, you can add suggestions in some cases to register exceptions instead of raising errors:
The second method is all automatic, here is a demo (using 11gR2):
SQL> CREATE TABLE test (pk1 NUMBER, 2 pk2 NUMBER, 3 CONSTRAINT pk_test PRIMARY KEY (pk1, pk2)); Table created. SQL> 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> 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
You can use the LOG ERROR clause with INSERT ALL (thanks @Alex Poole ), but you must add a clause after each table:
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.
Vincent malgrat
source share