Bekijk de MERGE-instructie. Dit zou moeten doen wat je wilt - het is de WHEN NOT MATCHED
clausule die dit zal doen.
Vanwege Oracle's gebrek aan ondersteuning voor een echte VALUES()-clausule is de syntaxis voor een enkel record met vaste waarden echter behoorlijk onhandig:
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);
Een andere benadering (als u bijvoorbeeld bulksgewijs laadt vanuit een andere tabel) is om de "Error logging"-faciliteit van Oracle te gebruiken. De verklaring zou er als volgt uitzien:
INSERT INTO your_table (col1, col2, col3)
SELECT c1, c2, c3
FROM staging_table
LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;
Daarna zijn alle rijen die een fout zouden hebben gegenereerd beschikbaar in de tabel errlog
. U moet die errlog
. maken tabel (of welke naam u ook kiest) handmatig voordat u de insert uitvoert met DBMS_ERRLOG.CREATE_ERROR_LOG
.
Zie de handleiding voor details