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