Обработка исключений Гудов А.М., Завозкин С.Ю. 2005
Общие понятия Что такое исключение? Переменная в PL/SQL, возбуждаемая во время выполнения. Как возникает исключение? –Возбуждается сервером. –Возбуждается явно. Как его обрабатывать? –Перехватывать с помощью обработчика исключений. –Распространить в вызывающую среду.
Обработка исключений [DECLARE] BEGIN EXCEPTION END; [DECLARE] BEGIN EXCEPTION END; Перехват исключения Распространение в вызывающую среду Возбуждение исключения Перехват Возбуждение исключения Исключение не перехвачено
Типы исключений Предопределенные, возбуждаемые сервером. Непредопределенные, возбуждаемые сервером. пользовательские Возбуждаются неявно Возбуждаются явно
Перехват исключений EXCEPTION When исключение1 [or исключение2 …] Then оператор1;... [When исключение3 [or исключение4 …] Then оператор1;... When OTHERS Then оператор1;...]
Перехват предопределенных исключений В секции обработки ссылка на стандартное имя. Некоторые стандартные имена исключений: –NO_DATA_FOUND –TOO_MANY_ROWS –INVALID_CURSOR –ZERO_DIVIDE –DUP_VAL_OF_INDEX
Предопределенные исключения: пример Procedure test_exception_1 (v_product_id IN s_product.id%type) IS V_id s_product.id%type; BEGIN Select id into v_idfrom s_product where id=v_product_id; Delete from s_invertory where product_id=v_product_id; Commit; EXCEPTION When NO_DATA_FOUND Then rollback; text_io.put_line(Product number is invalid); When TOO_MANY_ROWS Then rollback; text_io.put_line(Data corraption in table S_PRODUCT); When OTHERS Then rollback; text_io.put_line(Other error occurred); END;
Перехват непредопределенных исключений Объявление Связывание Ссылка Присвоение имени Включение в предложение PRAGMA EXCEPTION_INIT Обработка исключения Декларативная секция Секция обработчика
Непредопределенное исключение: пример DECLARE E_product_rEXCEPTION; PRAGMA EXCEPTION_INIT (E_product_r, -2222); … BEGIN … EXCEPTION When E_product_r Then Text_io.put_line(Integrity constraint violated); … END;
Перехват пользовательских исключений Объявление Возбуждение Ссылка Присвоение имени Явное возбуждение с помощью оператора RAISE Обработка исключения Декларативная секция Секция обработчика Исполняемая секция
Пользовательское исключение: пример DECLARE E_product_rEXCEPTION; … BEGIN … RAISE E_product_r; … EXCEPTION When E_product_r Then Text_io.put_line(Integrity constraint violated); … END;
Функции перехвата исключений Обработчик исключения WHEN OTHERS –Перехватывает все необработанные исключения. –Должен быть последним обработчиком. SQLCODE –Возвращает числовой код ошибки. –Значения: 0 Исключений не было 1 Пользовательское исключение +100 Исключение NO_DATA_FOUND -n Номер ошибки сервера SQLERRM –Возвращает стандартное сообщение об ошибке.
Функции перехвата исключений: пример … BEGIN … EXCEPTION When OTHERS Then rollback; Text_io.put_line(Unknown error: ||SQLCODE|| ||SQLERRM); … END;
Распространение исключений в вызывающую среду DECLARE E_product_rEXCEPTION; E_integrityEXCEPTION; PRAGMA EXCEPTION_INIT (E_product_r, -2222); … BEGIN FOR I IN emp_cursor LOOP begin select …; update …; … RAISE E_integrity; … exception WHEN E_product_r THEN … WHEN E_integrity THEN end; END LOOP; EXCEPTION When NO_DATA_FOUND Then … When OTHERS Then … … END;
Практическое занятие 1. Создайте процедуру, которая бы обновляла номера регионов для служащих отделов. (Входные данные – название региона и новый номер отдела для данного служащего). а) Напишите обработчик исключений, который будет выдавать сообщение о том, что указанный регион не существует б) Напишите обработчик исключений, который бы выдавал пользователю сообщение о том, что для указанного региона уже есть отдел с таким названием в) Напишите обработчик исключений, который выдавал бы пользователю сообщение о том, что указанный номер отдела не существует (используйте атрибут SQL%NOTFOUND и возбудите исключение вручную)
2. Напишите процедуру для вывода на фамилии и названия отдела для служащих, чья заработная плата лежит в диапазоне плюс-минус 100$ от введенного значения. а) Напишите обработчик исключений, который будет выдавать сообщение о том, что служащих с такой зарплатой нет. б) Напишите обработчик исключений, который будет выдавать сообщение о том, что служащих с такой зарплатой несколько. Сообщение должно указывать, сколько сотрудников попадает в этот диапазон зарплат.