Учебники

PL / SQL — исключения

В этой главе мы обсудим исключения в PL / SQL. Исключением является условие ошибки во время выполнения программы. PL / SQL поддерживает программистов для отлова таких условий с помощью блока EXCEPTION в программе, и в отношении условия ошибки предпринимается соответствующее действие. Есть два типа исключений —

  • Системные исключения
  • Пользовательские исключения

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

Общий синтаксис для обработки исключений следующий. Здесь вы можете перечислить столько исключений, сколько вы можете обработать. Исключение по умолчанию будет обработано, используя WHEN 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 .

Возбуждение исключений

Исключения вызываются сервером базы данных автоматически всякий раз, когда возникает какая-либо внутренняя ошибка базы данных, но программист может явно вызвать исключения с помощью команды 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 не возвращает строк. В следующей таблице перечислены некоторые важные предопределенные исключения: