- •Обработка ошибок на PL/SQL
- •Исключения (1)
- •Исключения (2)
- •Исключения (3)
- •Системные исключения (1)
- •Системные исключения (2)
- •Системные исключения (3)
- •Выдача информации об ошибке
- •Пример (1)
- •Пример (2)
- •Исключения, определяемые программистом
- •Пример исключения, определенного программистом (1)
- •Пример исключения, определенного программистом (2)
- •Исключения, определяемые программистом
Обработка ошибок на PL/SQL
Исключения
Исключения (1)
Исключение — состояние ошибки, которое активизиру- ется при возникновении проблемы.
Существует много разных исключений, каждое из кото- рых связано с определенным типом проблем.
При возникновении исключительной ситуации:
выполнение кода останавливается на операторе, который возбудил исключение;
управление передается той части блока, которая обрабатывает это исключение.
Исключения (2)
Если блок не содержит выполняемой секции, PL/SQL пытается найти выполняемую секцию во включающем базовом блоке (внешнем по отношению к коду, возбудив- шему исключение).
Если в непосредственном включающем блоке отсутствует обработчик данного исключения, то поиск продолжается в блоках следующих уровней.
Если подходящий обработчик найти не удается, то выпол- нение программы прекращается с выдачей сообщения о
необрабатываемой ошибке.
Исключения (3)
Часть блока, обрабатывающая исключения, — идеальное место для выдачи информативных сообщений об ошибках и выполнения очистки, позволяющей избавиться от всего, что могло бы в дальнейшем вызвать проблемы.
Если исключение возбуждено при выполнении процедуры, вставляющей строки в таблицу, то очистка может включать оператор ROLLBACK.
После передачи управления обработчику исключения, оно не возвращается оператору, ставшему причиной исключе-ния. Управление передается оператору включающего базо-вого блока, который следует за вызовом вложенного блока или процедуры.
Системные исключения (1)
CURSOR_ALREADY_OPEN — попытка открыть уже открытый курсор.
DUP_VAL_ON_INDEX — попытка вставить повторяю- щееся значение в столбец, имеющий уникальный индекс (ограничение уникальности).
INVALID_CURSOR — попытка применить команду FETCH к неоткрытому курсору или попытка закрыть курсор, который не открывался.
NO_DATA_FOUND — попытка выполнить SELECT INTO, когда SELECT возвращает нулевое количество строк (и другие причины).
Системные исключения (2)
PROGRAM_ERROR — внутренняя ошибка, нужно обратиться в службу поддержки Oracle.
STORAGE_ERROR — программе не хватает системной памяти.
TIME_OUT_ON_RESOURCE — программа слишком долго ожидала доступности некоторого ресурса.
TOO_MANY_ROWS — оператор SELECT INTO в PL/SQL вернул более одной строки.
Системные исключения (3)
VALUE_ERROR — PL/SQL встретил неправильное преобразование или усечение данных, или неправильное ограничение на данные.
ZERO_DIVDE — попытка деления на нуль.
OTHERS — все прочие исключения и внутренние ошиб- ки, которые не охватываются исключениями, определен- ными в базовом блоке. Используется в тех случаях, когда вы точно не знаете, какое именованное исключение предстоит обрабатывать, и хотите обрабатывать любые возбуждаемые исключения.
Выдача информации об ошибке
Реализуется двумя способами:
команда SQLCODE — возвращает код ошибки (отри- цательное число, равное номеру ошибки ORA, выво-димой при завершении приложения, если исключение осталось необработанным);
команда SQLERRM — возвращает текстовое сообще- ние, описывающее ошибку.
В обработчике исключения можно использовать как SQLCODE, так и SQLERRM. Замечание: не у всех системных исключений есть имена.
Пример (1)
SET SERVEROUTPUT ON; DECLARE
Num_a NUMBER := 6; Num_b NUMBER;
BEGIN Num_b := 0;
Num_a := Num_a / Num_b ; Num_b := 7;
dbms_output .put_line ( ' Значение Num_b ' || Num_b) ;
Пример (2)
EXCEPTION
WHEN ZERO_DIVIDE THEN
DECLARE
err_num NUMBER := SQLCODE; err_msg VARCHAR2(512) := SQLERRM;
BEGIN
dbms_output.put_line ('ORA Error Number ' || err_num ) ; dbms_output.put_line ('ORA Error message ' || err_msg) ; dbms_output.put_line (' Value of Num_a ' || Num_a) ;
dbms_output.put_line (' Value of Num_b ' || Num_b) ; END;
END;
/