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

Oracle équivalent à MySQL INSERT IGNORE ?

Consultez la déclaration MERGE. Cela devrait faire ce que vous voulez - c'est le WHEN NOT MATCHED clause qui fera cela.

En raison du manque de prise en charge d'Oracle pour une vraie clause VALUES(), la syntaxe d'un seul enregistrement avec des valeurs fixes est assez maladroite :

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

Une approche différente (si vous effectuez par exemple un chargement en masse à partir d'une table différente) consiste à utiliser la fonction "Error logging" d'Oracle. La déclaration ressemblerait à ceci :

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

Ensuite toutes les lignes qui auraient généré une erreur sont disponibles dans la table errlog . Vous devez créer ce errlog table (ou quel que soit le nom que vous choisissez) manuellement avant d'exécuter l'insertion à l'aide de DBMS_ERRLOG.CREATE_ERROR_LOG .

Voir le manuel pour plus de détails