DeepEdit!

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

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

Область действия исключительной ситуации

Область действия исключительной ситуации аналогична области дейст­вия переменной. Если исключительная ситуация, определенная пользова­телем, будет передана из блока и окажется вне области своего действия, ссылаться на нее по имени станет невозможно. Рассмотрим пример:
Если сообщение об ошибке, определяемой пользователем, нужно пе­редать из блока, рекомендуется описывать исключительную ситуацию в модуле так, чтобы она была видима вне этого блока, или следует восполь­зоваться функцией RAISE_APPLICATION_ERROR (см. ниже). Если со­здать модуль Globals и описать в нем e_UserDefinedException, то эта исключительная ситуация будет видима и во внешнем блоке. Например:
С учетом созданного модуля Globals можно переписать рассмотрен­ный выше фрагмент программы следующим образом:
помимо исключительных ситуаций, в модуле Globals можно объявить общие таблицы, переменные и типы PL/SQL (см. главы 9 и 10).
Отслеживание всех исключительных ситуаций
Не следует допускать возникновения в программах исключительных ситуа­ций, которые не обрабатываются. Можно воспользоваться обработчиком OTHERS, создав его на самом верхнем уровне программы. Например, если этот обработчик будет регистрировать факт и время возникновения каж­дой ошибки, то ни одна ошибка не будет оставлена без внимания:
Выявление места возникновения ошибки
Иногда трудно определить, какой из SQL-операторов стал причиной ошибки, так как раздел исключительных ситуаций анализируется для всего
блока. Рассмотрим пример:
BEGIN
SELECT . . . SELECT . . .
SELECT . . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
- Какой из операторов SELECT породил эту исключительную ситуацию?
END;
Решить эту проблему можно двумя способами. Первый — создание счетчика, указывающего на SQL-оператор:
DECLARE
— Переменная для хранения номера оператора выбора v_SelectCounter NUMBER :=1; BEGIN
SELECT . . .
v_SelectCounter := 2; SELECT , . .
v_SelectCounter := 3;
SELECT . . . EXCEPTION
WHEN N0_DATA_F0UND THEN
INSERT INTO log_table (info) VALUES ('No data found in select' [ v_SelectCounter);
END;
Второй способ — размещение каждого оператора в собственном внут­реннем блоке:


 









jAntivirus