PL / SQL - Исключения
В этой главе мы обсудим исключения в PL / SQL. Исключением является состояние ошибки во время выполнения программы. PL / SQL помогает программистам отлавливать такие условия, используяEXCEPTIONблокируется в программе, и соответствующее действие предпринимается против состояния ошибки. Есть два типа исключений -
- Системные исключения
- Пользовательские исключения
Синтаксис для обработки исключений
Общий синтаксис для обработки исключений следующий. Здесь вы можете перечислить столько исключений, сколько сможете обработать. Исключение по умолчанию будет обрабатываться с помощьюWHEN others THEN -
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2 THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........
WHEN others THEN
exception3-handling-statements
END;
пример
Напишем код, чтобы проиллюстрировать концепцию. Мы будем использовать таблицу CUSTOMERS, которую мы создали и использовали в предыдущих главах -
DECLARE
c_id customers.id%type := 8;
c_name customerS.Name%type;
c_addr customers.address%type;
BEGIN
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат:
No such customer!
PL/SQL procedure successfully completed.
Приведенная выше программа отображает имя и адрес клиента, чей идентификатор указан. Поскольку в нашей базе данных нет клиента с идентификатором 8, программа вызывает исключение времени выполнения.NO_DATA_FOUND, который зафиксирован в EXCEPTION block.
Вызов исключений
Исключения генерируются сервером базы данных автоматически всякий раз, когда возникает какая-либо внутренняя ошибка базы данных, но исключения могут быть вызваны явно программистом с помощью команды RAISE. Ниже приведен простой синтаксис для создания исключения:
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
statement;
END;
Вы можете использовать приведенный выше синтаксис при возникновении стандартного исключения Oracle или любого пользовательского исключения. В следующем разделе мы дадим вам пример создания пользовательского исключения. Аналогичным образом вы можете вызвать стандартные исключения Oracle.
Пользовательские исключения
PL / SQL позволяет вам определять собственные исключения в соответствии с потребностями вашей программы. Определяемое пользователем исключение должно быть объявлено, а затем вызвано явным образом с помощью оператора RAISE или процедуры.DBMS_STANDARD.RAISE_APPLICATION_ERROR.
Синтаксис объявления исключения:
DECLARE
my-exception EXCEPTION;
пример
Следующий пример иллюстрирует эту концепцию. Эта программа запрашивает идентификатор клиента, когда пользователь вводит недопустимый идентификатор, исключениеinvalid_id Поднялся.
DECLARE
c_id customers.id%type := &cc_id;
c_name customerS.Name%type;
c_addr customers.address%type;
-- user defined exception
ex_invalid_id EXCEPTION;
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
END IF;
EXCEPTION
WHEN ex_invalid_id THEN
dbms_output.put_line('ID must be greater than zero!');
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат:
Enter value for cc_id: -6 (let's enter a value -6)
old 2: c_id customers.id%type := &cc_id;
new 2: c_id customers.id%type := -6;
ID must be greater than zero!
PL/SQL procedure successfully completed.
Предопределенные исключения
PL / SQL предоставляет множество предопределенных исключений, которые выполняются, когда какое-либо правило базы данных нарушается программой. Например, предопределенное исключение NO_DATA_FOUND возникает, когда инструкция SELECT INTO не возвращает строк. В следующей таблице перечислены некоторые из важных предопределенных исключений.
Исключение | Ошибка Oracle | SQLCODE | Описание |
---|---|---|---|
ACCESS_INTO_NULL | 06530 | -6530 | Он возникает, когда нулевому объекту автоматически присваивается значение. |
CASE_NOT_FOUND | 06592 | -6592 | Он возникает, когда не выбран ни один из вариантов в предложении WHEN оператора CASE и отсутствует предложение ELSE. |
COLLECTION_IS_NULL | 06531 | -6531 | Он возникает, когда программа пытается применить методы сбора, отличные от EXISTS, к неинициализированной вложенной таблице или varray, или программа пытается присвоить значения элементам неинициализированной вложенной таблицы или varray. |
DUP_VAL_ON_INDEX | 00001 | -1 | Он возникает, когда повторяющиеся значения пытаются сохранить в столбце с уникальным индексом. |
INVALID_CURSOR | 01001 | -1001 | Он возникает, когда предпринимаются попытки выполнить недопустимую операцию курсора, такую как закрытие неоткрытого курсора. |
НЕПРАВИЛЬНЫЙ НОМЕР | 01722 | -1722 | Он возникает, когда преобразование строки символов в число не удается, потому что строка не представляет допустимое число. |
LOGIN_DENIED | 01017 | -1017 | Он возникает, когда программа пытается войти в базу данных с недопустимым именем пользователя или паролем. |
ДАННЫЕ НЕ НАЙДЕНЫ | 01403 | +100 | Он возникает, когда инструкция SELECT INTO не возвращает строк. |
NOT_LOGGED_ON | 01012 | -1012 | Он возникает при вызове базы данных без подключения к базе данных. |
PROGRAM_ERROR | 06501 | -6501 | Он возникает, когда в PL / SQL возникает внутренняя проблема. |
ROWTYPE_MISMATCH | 06504 | -6504 | Он возникает, когда курсор выбирает значение в переменной с несовместимым типом данных. |
SELF_IS_NULL | 30625 | -30625 | Он возникает, когда вызывается метод члена, но экземпляр типа объекта не был инициализирован. |
STORAGE_ERROR | 06500 | -6500 | Он возникает, когда PL / SQL не хватает памяти или память повреждена. |
TOO_MANY_ROWS | 01422 | -1422 | Он возникает, когда инструкция SELECT INTO возвращает более одной строки. |
VALUE_ERROR | 06502 | -6502 | Он возникает при возникновении арифметической ошибки, ошибки преобразования, усечения или ограничения размера. |
ZERO_DIVIDE | 01476 | 1476 | Он возникает при попытке разделить число на ноль. |