Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа с Oracle / 17 - Обработка ошибок на PL SQL.ppt
Скачиваний:
10
Добавлен:
28.06.2021
Размер:
270.34 Кб
Скачать

Обработка ошибок на 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;

/