Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle 'INSERT ALL' ignore les doublons

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.