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

Oracle-Äquivalent zu MySQL INSERT IGNORE?

Sehen Sie sich die MERGE-Anweisung an. Dies sollte tun, was Sie wollen - es ist der WHEN NOT MATCHED Klausel, die dies tun wird.

Aufgrund der fehlenden Unterstützung von Oracle für eine echte VALUES()-Klausel ist die Syntax für einen einzelnen Datensatz mit festen Werten jedoch ziemlich ungeschickt:

MERGE INTO your_table yt
USING (
   SELECT 42 as the_pk_value, 
          'some_value' as some_column
   FROM dual
) t on (yt.pk = t.the_pke_value) 
WHEN NOT MATCHED THEN 
   INSERT (pk, the_column)
   VALUES (t.the_pk_value, t.some_column);

Ein anderer Ansatz (wenn Sie z. B. Massenladen aus einer anderen Tabelle durchführen) besteht darin, die Funktion "Fehlerprotokollierung" von Oracle zu verwenden. Die Anweisung würde wie folgt aussehen:

 INSERT INTO your_table (col1, col2, col3)
 SELECT c1, c2, c3
 FROM staging_table
 LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;

Danach sind alle Zeilen, die einen Fehler ausgelöst hätten, in der Tabelle errlog verfügbar . Sie müssen dieses errlog erstellen Tabelle (oder welchen Namen Sie auch immer wählen) manuell, bevor Sie die Einfügung mit DBMS_ERRLOG.CREATE_ERROR_LOG ausführen .

Einzelheiten finden Sie im Handbuch