DeepEdit!

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

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

Универсальный обработчик ошибок

Одна из проблем, возникающих при использовании исключительных си­туаций, заключается в том, что довольно трудно определить, какой имен­но фрагмент программы выполняется в момент появления конкретной исключительной ситуации. PL/SQL предлагает функцию DBMS_UTILITY. FORMAT_CALL_STACK, которая возвращает значение типа VARCHAR2, являющееся текущим значением в стеке вызовов (call stack). Рассмотрим пример, в котором используются процедуры А, В и С:
Обратите внимание на то, что процедура А вызывает процедуру В, которая в свою очередь вызывает процедуру С. При вызове процедуры А будут получены результаты:
Подобно FORMAT_CALL_STACK, функция DBMS_UTILITY.FORMAT_ ERROR_STACK возвращает текущую последовательность ошибок. С по­мощью этих функций можно создать универсальный обработчик ошибок, регистрирующий как местонахождение ошибки, так и ее тип.
Для создания программного модуля нам понадобятся следующие


Теперь создадим для таблицы триггер (для этого необходима привилегия CREATE TRIGGER), устанавливающий исключительнук ситуацию ZERO_DIVTDE, и модифицируем процедуры А, В и С следующим образом:
Следует заметить, что, кроме самого высокого уровня вложения (проце­дура А), все обработчики исключительных ситуаций выглядят следующим образом:
Это означает, что модуль        должен записать в таблицы (если необходимо) стеки вызовов и ошибок, а затем передать сведения об ошибке в вызывающую процедуру. На самом высоком уровне процедура HandleAll должна вызываться с параметром TRUE. Это сообщает модулю ErrorPkg о том, что достигнут самый верхний уровень вложения и передавать даль­ше сведения об ошибке не нужно. После этого процедура StoreStacks со­храняет стеки вызовов и ошибок в таблицах errors, error_stacks и call stacks, индексированных по имени модуля. В качестве имени модуля (module) должно использоваться имя программного модуля (package) или другой идентификатор. Каждая ошибка сохраняется с указанием как имени модуля, так и номера ошибки, которые возвращаются процедурой StoreStacks. При вызове PrintStacks запрашивается таблица errors, и резуль­таты выводятся на экран с помощью модуля DBMS_OUTPUT. Например, если вызвать из SQL*Plus процедуру А, то на экране будет отображена следующая информация:

Итоги
В этой главе рассказывалось о том, как обнаруживаются ошибки при вы­полнении программ PL/SQL и как программы реагируют на ошибки. В ар­сенале PL/SQL имеется специальное средство — исключительные ситуации и обработчики исключительных ситуаций. Было показано, как описываются исключительные ситуации и как устанавливается соответст­вие между ними и различными ошибками: стандартными ошибками Oracle и ошибками, определяемыми пользователями. Кроме того, были рассмот­рены алгоритмы, посредством которых осуществляется передача исключи­тельных ситуаций между разделами блоков PL/SQL. Даны рекомендации по использованию исключительных ситуаций.
 









jAntivirus