Dans Oracle, les instructions réussissent complètement ou échouent complètement (elles sont atomiques). Cependant, vous pouvez ajouter des clauses dans certains cas pour journaliser les exceptions au lieu de générer des erreurs :
- en utilisant
BULK COLLECT - SAVE EXCEPTIONS
, comme démontré dans ce fil sur askTom , - ou en utilisant
DBMS_ERRLOG
(disponible depuis 10g je crois).
La deuxième méthode est entièrement automatique, voici une démo (utilisant 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
Vous pouvez utiliser le LOG ERROR
clause avec INSERT ALL
(merci @Alex Poole
), mais vous devez ajouter la clause après chaque tableau :
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.