DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Обработчик исключений OTHERS

PL/SQL определяет специальный обработчик исключительных ситуа­ций — WHEN OTHERS. Обработчик OTHERS (другие) выполняется для всех инициированных исключительных ситуаций, которые не обработа­ны другими предложениями WHEN, определенными в текущем разделе исключений (аналогично базовому классу Exception в Java). Он всегда
должен быть последним обработчиком в блоке, чтобы все предыдущие (и
более специальные) обработчики были перед этим просмотрены. WHEN OTHERS будет перехватывать все исключения, предварительно опреде­ленные и определяемые пользователем. Обработчик OTHERS рекоменду­ется указывать на самом высоком уровне программы (в самом внешнем блоке) для обеспечения распознавания всех возможных ошибок. Иначе ошибка будет распространяться в вызывающую среду (см. ниже раздел "Распространение исключительных ситуаций"). Это может привести к не­желательным последствиям, таким как откат текущей транзакции.
В этом примере обработчик OTHERS регистрирует факт возникнове­ния ошибки, но не определяет ее. Сведения об ошибке, приведшей к уста­новлению исключительной ситуации, обрабатываемой OTHERS, можно получить при помощи предопределенных функций SQLCODE и SQLERRM (см. ниже).
Совет
Не используйте в коде обработчик исключительных ситуаций типа WHEN OTHERS THEN NULL; так как он будет молчаливо перехватывать все неожиданные ошибки, не сообщая о том, что они произошли. Хороший обработчик OTHERS должен регистрировать ошибку и, возможно, дополнительную информацию для последующего анализа.

SQLCODE и SQLERRM При использовании обработчика OTHERS быва­ет полезно знать, какая ошибка Oracle установила исключительную ситуа­цию. Можно регистрировать не только факт возникновения ошибки, но и ее тип, если это необходимо для выполнения конкретных действий. В PL/SQL такие сведения получают при помощи двух встроенных функ­ций: SQLCODE и SQLERRM. SQLCODE возвращает код текущей ошибки, a SQLERRM — текст сообщения об ошибке. Для исключений, определяе­мых пользователем, SQLCODE возвращает 1, a SQLERRM возвращает "User-defined Exception" (определенное пользователем исключение).

Внимание
Функция DBMSUTILITY. FORMAТ_ERROR_STACK также возвращает код текущей ошибки и может быть использована в дополнение к функции SQLERRM (см. приложение А).
Ниже приводится полный текст блока PL/SQL, в котором используется обработчик исключительных ситуаций OTHERS.

сама вызывает стандартную исключительную ситуацию Во избежание этого используется встроенная функция SUBSTR, обеспе­чивающая присваивание переменной v_ErrorText не более чем 200 симво­лов. О SUBSTR и о других встроенных функциях PL/SQL рассказывается в главе 5.
Заметим, что значения функций SQLCODE и SQLERRM сначала при­сваиваются локальным переменным, и только потом эти переменные ука­зываются в SQL-операторе. Данные функции являются процедурными, поэтому их нельзя использовать непосредственно в SQL-операторе.
Функция SQLERRM может принимать числовой аргумент. В этом слу­чае она возвращает текст сообщения об ошибке, код которой равен за­данному числу. Аргумент должен всегда быть отрицательным. Если аргумент SQLERRM равен нулю, возвращается сообщение
Если в SQLERRM передается положительное значение, отличное от
100, выдается сообщение

При вызове в обработчике функция SQLCODE возвращает отрицате­льное число, обозначающее ошибку Oracle. Единственным исключением является ошибка "ORA-1403: no data found", когда SQLCODE возвращает +100. Если SQLERRM без аргументов вызывается из выполняемого раздела
A SQLCODE возвращает 0. Все эти ситуации показаны в следующем примере:
блока, она всегда возвращает сообщение.
Совет
Обычно лучше использовать SQLERRM без параметров (а не передавать такой параметр, как SQLCODE). Версия без параметров вернет полное сообщение об ошибке с любой строкой подстановки, например, с именем ограничения в случае ошибки ORA-1 (см. предыдущий пример).
 









jAntivirus