На ваш комментарий:
каждая процедура говорит «исключение, когда другие тогда» и вставляет информацию об ошибке в таблицу журнала. поэтому, когда я запускаю описанную выше процедуру, он сообщает, что процедура 1 завершилась неудачно, процедуры 2 и 3 завершены
Эти обработчики исключений не позволяют распространяться исключению, и вызывающая процедура не может знать, что вызванная процедура завершилась неудачно.
Два самых простых способа изменить это:
(1) Измените обработчики исключений в вызываемых процедурах, чтобы повторно вызвать исключение:
EXCEPTION
WHEN OTHERS THEN
/* Do the INSERT into log table */
RAISE;
Необработанное исключение тогда вызовет go вызывающей процедуры для своего обработчика исключений, который выполнит ROLLBACK
. Тогда процедура заканчивалась. Вызывающая процедура по-прежнему не сообщит об ошибке, если вы не добавите RAISE
в свой обработчик исключений.
(2) Измените каждую из вызываемых процедур на функцию, которая возвращает некоторый индикатор успеха или неудачи. Затем вы должны внести значительные изменения в вызывающую процедуру, чтобы проверить статус возврата каждой функции и решить, как действовать дальше. Я не рекомендую этот подход; Это в основном то, чего предназначены исключения.
Кстати, будьте осторожны с КОГДА ДРУГИЕ. Это перехватит буквально любое исключение, которое могло произойти при выполнении кода в Oracle. Повреждение данных? Исключение в ловушке. Стол не удлиняется? Исключение в ловушке. База данных закрывается? Исключение в ловушке. Некоторые из этих исключений могут означать, что logi c в вашем обработчике исключений не сможет выполняться.
Использование WHEN OTHERS для перехвата всех исключений для ведения журнала может быть полезным, но в таком случае я бы настоятельно рекомендую всегда повторно вызывать исключение, если вы не знаете, что можете исправить это.