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