Можно ли вернуться в строку после ошибки в PL/SQL?

У меня есть тонны операторов вставки.

Я хочу игнорировать ошибки во время выполнения этих строк и предпочитаю не переносить каждую строку отдельно.

Пример:

try
    insert 1
    insert 2
    insert 3
exception
    ...

Я хочу, чтобы, если во вставке 1 было выбрано исключение, оно проигнорировало его и вернулось к выполнению вставки 2 и т. д.

Как мне это сделать?

Я ищу что-то вроде «Возобновить дальше» в VB.


person Matan    schedule 04.06.2012    source источник
comment
Обязательно ли использовать PLSQL? Вы не можете запустить эти вставки из sql*plus?   -  person A.B.Cade    schedule 04.06.2012
comment
Я могу, но я должен позволить ему работать, даже если более раннее утверждение не удалось.   -  person Matan    schedule 04.06.2012
comment
Я имею в виду запуск скрипта, а не анонимного блока. если вы можете, то каждый статус будет работать сам по себе   -  person A.B.Cade    schedule 04.06.2012
comment
Проверьте Продолжение вставок в Oracle при возникновении исключения для получения ответа о регистрации ошибок DML.   -  person Sathyajith Bhat    schedule 05.06.2012


Ответы (3)


Если вы можете переместить все вставки в сценарий sql, а затем запустить их в sql*plus, то каждая вставка будет выполняться сама по себе, а сценарий будет продолжать выполняться.

Если вы используете plsqldeveloper (вы отметили его тегом), откройте новое командное окно (которое точно похоже на сценарий sql, запускаемый sql*plus) и поместите свои инструкции следующим образом:

insert into table your_table values(1,'aa');
insert into table your_table values(2/0,'bb');
insert into table your_table values(3,'cc');
commit;

Несмотря на то, что оператор (2) вызовет исключение, поскольку он не находится в блоке, он продолжит следующую команду.

ОБНОВЛЕНИЕ: Согласно комментарию @CheranShunmugavel, добавьте

WHENEVER SQLERROR CONTINUE NONE

в верхней части скрипта (особенно если вы используете sql * plus, который имеет значение exit).

person A.B.Cade    schedule 05.06.2012
comment
На всякий случай вы можете добавить строку WHENEVER SQLERROR CONTINUE NONE вверху скрипта (документация), если поведение по умолчанию отличается. (Согласно документу, поведение по умолчанию — выход) - person Cheran Shunmugavel; 05.06.2012

Вам нужно будет обернуть каждый оператор INSERT своим собственным обработчиком исключений. Однако, если у вас есть «тонны» операторов вставки, где любой из операторов может завершиться ошибкой, я склонен подозревать, что вы неправильно подходите к проблеме. Откуда такие заявления? Не могли бы вы извлечь данные непосредственно из этой исходной системы? Не могли бы вы выполнить операторы в цикле, а не перечислять каждый из них? Не могли бы вы сначала загрузить данные в набор промежуточных таблиц, которые обеспечат выполнение всех операторов INSERT (т. е. без ограничений, все столбцы определены как VARCHAR2 (4000) и т. д.), а затем написать один оператор SQL, который перемещает данные в фактическая таблица назначения с соответствующими проверками и обработкой исключений?

person Justin Cave    schedule 04.06.2012
comment
Я пытаюсь добавить в таблицы жестко закодированные значения. Но поскольку есть вероятность, что часть скрипта запустится раньше, ограничение может привести к сбою некоторых операторов... - person Matan; 04.06.2012
comment
Согласен - загружать в промежуточные таблицы и ловить ошибки при истинной вставке в таблицы. При необходимости используйте несколько наборов таблиц. - person Clockwork-Muse; 04.06.2012
comment
@MattanLevy - Не могли бы вы удалить жестко закодированные строки, а затем снова вставить их? Не могли бы вы написать операторы MERGE, а не операторы INSERT? Не могли бы вы загрузить жестко закодированные значения в промежуточную таблицу, а затем написать один INSERT для загрузки данных из промежуточной таблицы в рабочую таблицу? - person Justin Cave; 04.06.2012