Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle equivalente a MySQL INSERT IGNORE?

Dai un'occhiata alla dichiarazione MERGE. Questo dovrebbe fare quello che vuoi:è il WHEN NOT MATCHED clausola che lo farà.

A causa della mancanza di supporto di Oracle per una vera clausola VALUES(), la sintassi per un singolo record con valori fissi è piuttosto goffa:

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);

Un approccio diverso (se, ad esempio, stai eseguendo il caricamento in blocco da una tabella diversa) consiste nell'utilizzare la funzione "Registrazione errori" di Oracle. La dichiarazione sarebbe simile a questa:

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

Successivamente tutte le righe che avrebbero generato un errore sono disponibili nella tabella errlog . Devi creare quel errlog tabella (o qualsiasi altro nome tu scelga) manualmente prima di eseguire l'inserimento utilizzando DBMS_ERRLOG.CREATE_ERROR_LOG .

Vedere il manuale per i dettagli