Oracle исключение процедуры, останавливающее остальные процедуры - PullRequest
1 голос
/ 06 мая 2020

Я хочу создать хранимую процедуру, которая вызывает хранимые процедуры внутри нее. Если один из них выйдет из строя, я хочу остановить его выполнение любой из процедур, которые последуют за ним. Прямо сейчас, если первая процедура не удалась, она все еще выполняет процедуры 2 и 3. Как я могу заставить ее прекратить это делать?

create or replace PROCEDURE run_three_procedures AS 
BEGIN
Package.procedure1;
Package.procedure2;
Package.procedure3;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;

END run_three_procedures;

1 Ответ

3 голосов
/ 06 мая 2020

На ваш комментарий:

каждая процедура говорит «исключение, когда другие тогда» и вставляет информацию об ошибке в таблицу журнала. поэтому, когда я запускаю описанную выше процедуру, он сообщает, что процедура 1 завершилась неудачно, процедуры 2 и 3 завершены

Эти обработчики исключений не позволяют распространяться исключению, и вызывающая процедура не может знать, что вызванная процедура завершилась неудачно.

Два самых простых способа изменить это:

(1) Измените обработчики исключений в вызываемых процедурах, чтобы повторно вызвать исключение:

EXCEPTION
  WHEN OTHERS THEN
     /* Do the INSERT into log table */
     RAISE;

Необработанное исключение тогда вызовет go вызывающей процедуры для своего обработчика исключений, который выполнит ROLLBACK. Тогда процедура заканчивалась. Вызывающая процедура по-прежнему не сообщит об ошибке, если вы не добавите RAISE в свой обработчик исключений.

(2) Измените каждую из вызываемых процедур на функцию, которая возвращает некоторый индикатор успеха или неудачи. Затем вы должны внести значительные изменения в вызывающую процедуру, чтобы проверить статус возврата каждой функции и решить, как действовать дальше. Я не рекомендую этот подход; Это в основном то, чего предназначены исключения.


Кстати, будьте осторожны с КОГДА ДРУГИЕ. Это перехватит буквально любое исключение, которое могло произойти при выполнении кода в Oracle. Повреждение данных? Исключение в ловушке. Стол не удлиняется? Исключение в ловушке. База данных закрывается? Исключение в ловушке. Некоторые из этих исключений могут означать, что logi c в вашем обработчике исключений не сможет выполняться.

Использование WHEN OTHERS для перехвата всех исключений для ведения журнала может быть полезным, но в таком случае я бы настоятельно рекомендую всегда повторно вызывать исключение, если вы не знаете, что можете исправить это.

...