Sprawdź oświadczenie MERGE. Powinno to zrobić to, co chcesz — to WHEN NOT MATCHED
klauzula, która to zrobi.
Jeśli chodzi o brak obsługi przez Oracle prawdziwej klauzuli VALUES(), składnia pojedynczego rekordu ze stałymi wartościami jest jednak dość niezgrabna:
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);
Innym podejściem (jeśli np. wykonujesz ładowanie zbiorcze z innej tabeli) jest użycie funkcji „Rejestrowanie błędów” Oracle. Oświadczenie wyglądałoby tak:
INSERT INTO your_table (col1, col2, col3)
SELECT c1, c2, c3
FROM staging_table
LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;
Następnie wszystkie wiersze, które spowodowałyby błąd, są dostępne w tabeli errlog
. Musisz utworzyć ten errlog
tabeli (lub dowolnej wybranej nazwy) ręcznie przed uruchomieniem wstawiania przy użyciu DBMS_ERRLOG.CREATE_ERROR_LOG
.
Szczegółowe informacje znajdziesz w instrukcji