DeepEdit!

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

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

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

Как только инициировано исключение, нормальное исполнение текущего PL/SQL-блока прекращается, и управление передается в раздел исключений. Исключение обрабатывается обработчиком исключений текущего PL/SQL-блока или передается для обработки в родительский блок.
Для того чтобы обеспечить перехват и обработку исключений, необходимо написать соответствующий обработчик исключений. Обработчики исключений должны размещаться после всех исполняемых операторов вашей программы, но до оператора END блока. Ключевое слово EXCEPTION обозначает начало раздела исключений и отдельных обработчиков исключений. Синтаксическая конструкция обработчика исключений выглядит так:

Предложение WHEN OTHERS является необязательным. Если оно отсутствует, то все необработанные исключения сразу же передаются в родительский блок (если он имеется). Предложение WHEN OTHERS должно быть последним обработчиком исключений в разделе исключений.
Встроенные функции обработки ошибок
Oracle поддерживает ряд встроенных функций, которые призваны помочь вам выявить, проанализировать и отреагировать на ошибки вашего PL/SQL-приложения.

Функция SQLCODE возвращает код ошибки для последнего (текущего) исключения в блоке. При отсутствии ошибок SQLCODE возвращает 0. Функция SQLCODE также возвращает 0 в случае, если она вызывается извне обработчика исключений.

Функция SQLERRM возвращает сообщение об ошибке по ее коду. Если не передать SQLERRM код ошибки, то будет выдано сообщение об ошибке с кодом, возвращенным функцией SQLCODE. Максимальная длина строки, возвращаемой SQLERRM, составляет 512 байт (в некоторых более ранних версиях Oracle - всего 255 байт).

Эта встроенная функция, как и SQLERRM, возвращает полное сообщение, соответствующее текущей ошибке (то есть значению, возвращенному функцией SQLCODE). Как правило, следует вызывать эту функцию внутри обработчика ошибок для того, чтобы получить полное сообщение об ошибке.

Эта функция, появившаяся в версии Oracle Database 10^ Release 1, возвращает форматированную строку, которая отображает стек программ и номера строк, ведущие к месту возникновения ошибки.
Необработанные исключения
Если инициированное в программе исключение не обработано обработчиком исключений ни в текущем, ни в одном из родительских блоков, то это необработанное исключение. PL/SQL возвращает ошибку, породившую необработанное исключение, обратно в среду приложения, откуда был запущен PL/SQL. Затем соответствующие действия предпринимаются уже этой средой (программой SQL*Plus, Oracle Forms или Java). В случае с SQL*Plus автоматически выполняется откат (ROLLBACK) всех DML-изменений, выполненных в блоке верхнего уровня.
Передача необработанного исключения
Правила для области действия исключений определяют блок, в котором исключение может быть инициировано. Правила передачи исключений определяют способ их обработки после инициирования.
Когда порождается исключение, PL/SQL ищет обработчик исключений в текущем блоке (анонимном блоке, процедуре или функции). Если обработчик не найден, то PL/SQL передает исключение в родительский блок текущего блока. Затем PL/SQL пытается обработать исключение, инициировав его еще раз в родительском блоке. Процесс продолжается до тех пор, пока не закончатся все последовательные родительские блоки, в которых можно было бы инициировать исключение (рис. 1.3).
Когда все блоки исчерпаны, PL/SQL возвращает необработанное исключение в среду приложения, которое исполняло самый внешний блок PL/SQL. Необработанное исключение прекращает исполнение вызывающей программы.
PROCEDURE list_my_faults IS

BEGIN

DECLARE
Вложенный блок 1
too_many_faults EXCEPTION;

BEGIN

... executable statements before new block ...

BEGIN
Вложенный блок 2
SELECT SUM (faults) INTO num_faults FROM profile
■■ !
IF num_faults > 100

THEN


       RAISE too_many_faults;


END IF;


EXCEPTION


WHEN N0_DATA_FOUND THEN ... ;


END;


... executable statements after Nested Block 1 ...


EXCEPTION


WHEN too_many_faults THEN ... ;

END;

END list_my_faults;

Рис. 1.3. Передача необработанного исключения
 









jAntivirus