У меня есть таблица A, которая мне нужна, чтобы вставить ее данные в таблицу B.
Я делаю это с direct path insert
для проблемы производительности:
INSERT /*+ append */ INTO
usr.B (c,d,e)
select c,d,e from usr.A;
Теперь я хочу добавить обработку ошибок на уровне строк.
Я имею в виду, что если есть исключение с некоторыми строками (из-за ограничений), следующие строки будут продолжать вставляться
в A, и конкретные проблемные строки будут сохранены в таблице журнала.
Поэтому я проверил опцию ведения журнала ошибок DML для этой цели, но обнаружил, что он не может работать с ограничениями уникальных дубликатов в инструкциях прямого пути, что является очень основным и важным ограничением в моих таблицах.
Я видел это решение , которое предлагает добавить фиктивный сбой, если есть дубликаты, но это не может быть хорошо для меня по ряду причин:
У меня есть много таблиц (1000), которые должны пройти этот процесс, поэтому добавить столбец для каждой таблицы невозможно.
Решение поможет, если в исходной таблице уже есть дубликаты, но в моем случае в каждой таблице может быть по одной строке, поэтому проверка дубликатов исходных данных недостаточно хороша.
Есть ли идеи, как это сделать правильно?
Я знаю, что есть опция SAVE EXCEPTIONS
с FORALL
, но я действительно предпочитаю использовать INSERT SELECT
для всех строк без цикла.
Спасибо.