Содержание

Слайд 2

Рассматриваемые вопросы Определение исключений PL/SQL Распознавание необработанных исключений Различные типы обработчиков

Рассматриваемые вопросы

Определение исключений PL/SQL
Распознавание необработанных исключений
Различные типы обработчиков исключений PL/SQL и

их использование
Перехват непредусмотренных исключений
Эффект распространения исключения на вызывающую среду во вложенных блоках
Настройка сообщений об исключениях PL/SQL
Слайд 3

Пример SET SERVEROUTPUT ON DECLARE lname VARCHAR2(15); BEGIN SELECT last_name INTO

Пример

SET SERVEROUTPUT ON
DECLARE
lname VARCHAR2(15);
BEGIN
SELECT last_name INTO lname FROM employees

WHERE
first_name='John';
DBMS_OUTPUT.PUT_LINE ('John''s last name is : ' ||lname);
END;
/
Слайд 4

Пример SET SERVEROUTPUT ON DECLARE lname VARCHAR2(15); BEGIN SELECT last_name INTO

Пример

SET SERVEROUTPUT ON
DECLARE
lname VARCHAR2(15);
BEGIN
SELECT last_name INTO lname FROM employees

WHERE
first_name='John';
DBMS_OUTPUT.PUT_LINE ('John''s last name is : ' ||lname);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE (' Команда select вернула несколько строк. Рассмотрите возможность использования курсора.');
END;
/
Слайд 5

Обработка исключений в PL/SQL Исключение – это ошибка PL/SQL, возникающая во

Обработка исключений в PL/SQL

Исключение – это ошибка PL/SQL, возникающая во время

выполнения программы.
Как возникает исключение?
Возбуждается неявно сервером Oracle.
Возбуждается явно программистом.
Как обрабатывать исключение?
Перехватить с помощью обработчика исключений.
Распространить в вызывающую среду.
Слайд 6

Обработка исключений Исключение возбуждено Исключение перехвачено? Завершение без ошибок нет Немедленное

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

Исключение возбуждено

Исключение перехвачено?

Завершение без ошибок

нет

Немедленное завершение

Передача исключения в вызывающую среду

Выполнение

команд в секции EXCEPTION
Слайд 7

Типы исключений Предопределенные, возбуждаемые сервером Oracle Не предопределенные, возбуждаемые сервером Oracle

Типы исключений

Предопределенные, возбуждаемые сервером Oracle
Не предопределенные, возбуждаемые сервером Oracle
Пользовательские

}

Возбуждаются неявно

Возбуждаются явно

Слайд 8

Перехват исключений Синтаксис: EXCEPTION WHEN исключение1 [OR исключение2 . . .]

Перехват исключений

Синтаксис:

EXCEPTION
WHEN исключение1 [OR исключение2 . . .] THEN
команда1;

команда2;
. . .
[WHEN исключение3 [OR исключение4 . . .] THEN
команда1;
команда2;
. . .]
[WHEN OTHERS THEN
команда1;
команда2;
. . .]
Слайд 9

Перехват исключений: указания Секция обработки исключений начинается с ключевого слова EXCEPTION

Перехват исключений: указания

Секция обработки исключений начинается с ключевого слова EXCEPTION
Допускается несколько

обработчиков исключений
Перед выходом из блока выполняется только один обработчик исключений
Предложение WHEN OTHERS является последним
Слайд 10

Перехват предопределенных ошибок сервера Oracle В программе обработки исключений ссылайтесь на

Перехват предопределенных ошибок сервера Oracle

В программе обработки исключений ссылайтесь на стандартное

имя исключения.
Существует 20 предопределенных ошибок сервера БД
Примеры предопределенных исключений:
NO_DATA_FOUND
TOO_MANY_ROWS
INVALID_CURSOR
ZERO_DIVIDE
DUP_VAL_ON_INDEX
Слайд 11

Предопределенные ошибки сервера Oracle

Предопределенные ошибки сервера Oracle

Слайд 12

Предопределенные ошибки сервера Oracle

Предопределенные ошибки сервера Oracle

Слайд 13

Перехват непредопределенных исключений сервера Oracle Декларативная секция Присвоение имени исключению Кодирование

Перехват непредопределенных исключений сервера Oracle

Декларативная секция

Присвоение имени исключению

Кодирование указания компилятору PRAGMA

EXCEPTION_INIT

Секция EXCEPTION

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

Связывание

Ссылка

Слайд 14

SET SERVEROUTPUT ON DECLARE insert_excep EXCEPTION; PRAGMA EXCEPTION_INIT (insert_excep, -01400); BEGIN

SET SERVEROUTPUT ON
DECLARE
insert_excep EXCEPTION;
PRAGMA EXCEPTION_INIT (insert_excep, -01400);
BEGIN
INSERT INTO

departments (department_id, department_name) VALUES (280, NULL);
EXCEPTION
WHEN insert_excep THEN
DBMS_OUTPUT.PUT_LINE('INSERT OPERATION FAILED');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END; /

Непредопределенное исключение

Перехват ошибки сервера Oracle с номером –01400, невозможно вставить NULL.

1

2

3

Слайд 15

Функции для перехвата исключений SQLCODE: возвращает числовой код ошибки SQLERRM: возвращает сообщение, связанное с кодом ошибки

Функции для перехвата исключений

SQLCODE: возвращает числовой код ошибки
SQLERRM: возвращает сообщение, связанное

с кодом ошибки
Слайд 16

Функции для перехвата исключений Пример: DECLARE error_code NUMBER; error_message VARCHAR2(255); BEGIN

Функции для перехвата исключений

Пример:

DECLARE
error_code NUMBER;
error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN

ROLLBACK;
error_code := SQLCODE ;
error_message := SQLERRM ;
INSERT INTO errors (e_user, e_date, error_code,
error_message) VALUES(USER,SYSDATE,error_code,
error_message);
END;
/
Слайд 17

Перехват пользовательских исключений Декларативная секция Присвоение имени исключению Исполняемая секция Явное

Перехват пользовательских исключений

Декларативная секция

Присвоение имени исключению

Исполняемая секция

Явное возбуждение исключения с помощью

команды RAISE

Секция обработки исключений

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



Ссылка

Объявление

Возбуждение

Слайд 18

Перехват пользовательских исключений ... ACCEPT deptno PROMPT 'Please enter the department

Перехват пользовательских исключений

...
ACCEPT deptno PROMPT 'Please enter the department number:' ACCEPT

name PROMPT 'Please enter the department name:' DECLARE
invalid_department EXCEPTION;
name VARCHAR2(20):='&name';
deptno NUMBER :=&deptno;
BEGIN
UPDATE departments
SET department_name = name
WHERE department_id = deptno;
IF SQL%NOTFOUND THEN
RAISE invalid_department;
END IF;
COMMIT;
EXCEPTION
WHEN invalid_department THEN
DBMS_OUTPUT.PUT_LINE('No such department id.');
END;
/

1

2

3

Слайд 19

Распространение исключений, возникших в подблоке DECLARE . . . no_rows exception;

Распространение исключений, возникших в подблоке

DECLARE
. . .
no_rows exception;
integrity exception;
PRAGMA

EXCEPTION_INIT (integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
BEGIN
SELECT ...
UPDATE ...
IF SQL%NOTFOUND THEN
RAISE no_rows;
END IF;
END;

END LOOP;
EXCEPTION
WHEN integrity THEN ...
WHEN no_rows THEN ...
END;
/

Подблоки могут обрабатывать исключение или распространять его во внешний блок.

Слайд 20

Процедура RAISE_APPLICATION_ERROR Синтаксис: Процедура, которая позволяет посылать пользовательские сообщения об исключениях

Процедура RAISE_APPLICATION_ERROR

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

подпрограмм.
Можно сообщать приложению об исключениях и избежать возврата необработанных исключений.

raise_application_error (номер_исключения,
сообщение[, {TRUE | FALSE}]);

Слайд 21

Процедура RAISE_APPLICATION_ERROR Может использоваться в двух местах: Исполняемая секция Секция исключений

Процедура RAISE_APPLICATION_ERROR

Может использоваться в двух местах:
Исполняемая секция
Секция исключений
Возвращает пользователю информацию об

исключении тем же способом, которым пользуется сервер Oracle при возврате необработанного исключения
Слайд 22

RAISE_APPLICATION_ERROR BEGIN ... DELETE FROM employees WHERE manager_id = v_mgr; IF

RAISE_APPLICATION_ERROR

BEGIN
...
DELETE FROM employees
WHERE manager_id = v_mgr;
IF SQL%NOTFOUND THEN

RAISE_APPLICATION_ERROR(-20202,
'This is not a valid manager');
END IF;
...

Исполняемая секция:

Секция обработки исключений:

...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201,
'Manager is not a valid employee.');
END; /

Слайд 23

Итоги Определение исключений PL/SQL Добавление в блок PL/SQL секции EXCEPTION, предназначенной

Итоги

Определение исключений PL/SQL
Добавление в блок PL/SQL секции EXCEPTION, предназначенной для обработки

исключений во время выполнения кода
Обработка различных типов исключений:
предопределенные, возбуждаемые сервером Oracle
непредопределенные, возбуждаемые сервером Oracle
пользовательские
Эффект распространения исключения на вызывающую среду во вложенных блоках