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 Он возникает при попытке разделить число на ноль.