Проверьте оператор MERGE. Это должно делать то, что вы хотите - это предложение WHEN NOT MATCHED
, которое сделает это.
Из-за отсутствия поддержки Oracle для истинного предложения VALUES (), синтаксис для одной записи с фиксированными значениями довольно неуклюжий:
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);
Другой подход (если вы, например, выполняете массовую загрузку из другой таблицы) - это использовать функцию «Регистрация ошибок» в Oracle. Заявление будет выглядеть так:
INSERT INTO your_table (col1, col2, col3)
SELECT c1, c2, c3
FROM staging_table
LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;
Впоследствии все строки, которые вызвали бы ошибку, доступны в таблице errlog
. Вам нужно создать эту таблицу errlog
(или любое другое имя по вашему выбору) перед запуском вставки, используя DBMS_ERRLOG.CREATE_ERROR_LOG
.
Подробнее см. В руководстве