Я довольно новичок в PL / SQL и пытаюсь реализовать некоторую обработку исключений для пакета, который я написал.
Я столкнулся с ситуацией, когда у меня есть несколько исключений, которые могут быть вызваны.
В случае возникновения этих исключений я могу захотеть сделать что-то конкретное для каждого из исключений, напримересли возникает исключение A, тогда закрывайте и удаляйте файл, но если возникает исключение B, тогда мне нужно только закрыть курсор и отправить электронное письмо, чтобы предупредить кого-то о возникновении фатальной ошибки.
Это нормально, и я понимаю, как использовать WHEN <EXCEPTION_NAME> THEN
.
Проблема, с которой я столкнулся, заключается в том, что я не могу написать общий код, который возникает для любого исключенияподнятый, чтобы сделать что-то, что я всегда хочу сделать в случае исключения, например, записи в файл журнала.Это означает, что мне нужно продублировать строки кода для каждого типа исключения, как показано ниже.
DECLARE
test_exception EXCEPTION;
BEGIN
--some code
RAISE test_exception;
--some code
EXCEPTION
WHEN test_exception THEN
SEND_EMAIL('Something went wrong');
WRITE_TO_LOG('Error ' || SQLCODE || ' | ' || SUBSTR(SQLERRM, 1, 200) || ' | ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
WHEN OTHERS THEN
SOME_OTHER_FUNCTION();
WRITE_TO_LOG('Error ' || SQLCODE || ' | ' || SUBSTR(SQLERRM, 1, 200) || ' | ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END;
Я хотел бы добиться чего-то похожего на это, которое не компилируется.
DECLARE
test_exception EXCEPTION;
BEGIN
--some code
RAISE test_exception;
--some code
EXCEPTION
WRITE_TO_LOG('Error ' || SQLCODE || ' | ' || SUBSTR(SQLERRM, 1, 200) || ' | ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
WHEN test_exception THEN
SEND_EMAIL('Something went wrong');
WHEN OTHERS THEN
SOME_OTHER_FUNCTION();
END;
Очевидно, этот пример не завершен, но дает приблизительное представление.Для такой дублированной строки, как эта, это не проблема, но если нужно закрыть много курсоров или файлов или выполнить другую служебную работу, это выглядит несколько многословно / утомительно.
Есть ли предложение WHEN ALL THEN
или подобное?Будет ли это вариант использования для какого-то GOTO
?Или я пытаюсь применить неправильную концепцию здесь.
Кажется, я не могу найти людей, задающих один и тот же вопрос, что для меня означает, что я подхожу к проблеме неправильно или мне не хватает некоторых базовых знаний.
Спасибо