Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle 'ALLE EINFÜGEN' ignoriert Duplikate

In Oracle sind Anweisungen entweder vollständig erfolgreich oder schlagen vollständig fehl (sie sind atomar). Sie können jedoch in bestimmten Fällen Klauseln hinzufügen, um Ausnahmen zu protokollieren, anstatt Fehler auszulösen:

Die zweite Methode ist komplett automatisch, hier ist eine Demo (unter Verwendung von 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

Sie können den LOG ERROR verwenden -Klausel mit INSERT ALL (danke @Alex Poole ), aber Sie müssen die Klausel nach jeder Tabelle hinzufügen:

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.