Исключения, определяемые программистом
Одной из удобных возможностей PL/SQL является то, что он позволяет вам определять свои собственные исключения. При возбуждении и обработке они должны именоваться и объявляться аналогично любым другим элементам PL/SQL.
Ниже приведен полный пример объявления и определения исключения. Ниже приведен исходный код примера и результаты его запуска (рис.2).
set serveroutput on
DECLARE
quantity1 NUMBER :=-2;
quantity2 NUMBER := 3;
total NUMBER := 0;
quantity_must_positive EXCEPTION;
FUNCTION find_cost (quant NUMBER) RETURN NUMBER IS
BEGIN
IF (quant > 0)
THEN
RETURN (quant * 20);
ELSE
RAISE quantity_must_positive;
END IF;
END find_cost;
BEGIN
total := find_cost(quantity2);
total := total + find_cost(quantity1);
EXCEPTION
WHEN quantity_must_positive
THEN
dbms_output.put_line('Total until now:' || total);
dbms_output.put_line('Tried to use negative quantity ');
END;
/
SQL> set serveroutput on
SQL> DECLARE
2 quantity1 NUMBER :=-2;
3 quantity2 NUMBER := 3;
4 total NUMBER := 0;
5 quantity_must_positive EXCEPTION;
6 FUNCTION find_cost (quant NUMBER) RETURN NUMBER IS
7 BEGIN
8 IF (quant > 0)
9 THEN
10 RETURN(quant * 20);
11 ELSE
12 RAISE quantity__must_positive;
13 END IF;
14 END find_cost;
15 BEGIN
16 total := find_cost(quantity2);
17 total := total + find_cost(quantity1);
18 EXCEPTION
19 WHEN quantity_must_positive
20 THEN
21 dbms_output.put_line('Total until now:' || total);
22 dbms_output.put_line('Tried to use negative quantity ');
23 END;
24 /
Total until now: 60
Tried to use negative quantity
PL/SQL procedure successfully completed.
SQL>
Рис. 2. Исключение, определенное программистом
Исключение объявляется в секции объявлений. Аналогично любой другой объявленной там переменной, исключение действительно только для данного блока, Поскольку функция find_cost определена внутри того же блока, в ней можно ссылаться на исключение. Если бы она была определена, скажем, как хранимая функция, вы не могли бы использовать в ней имя этого исключения.
Вы можете использовать свои собственные исключения для обработки ошибок, которые система не обнаруживает или не считает за ошибки. Например, система не знает, что количество товаров в заказе должно быть целым положительным числом. Однако ваше приложение должно об этом знать, и вы можете установить соответствующий контроль, перехватывая значения, не являющиеся положительными целыми, в ходе вычислений с количествами товаров. Это очень простой пример, но нетрудно представить и более сложные случаи, с которыми вы наверняка столкнетесь при разработке реальных приложений.
Контрольные Вопросы
-
Что из сказанного ниже относительно функций и процедур PL/SQL справедливо?
-
Между ними нет разницы.
-
В спецификации функции указан тип возвращаемого значения, и функция обязана возвращать значение этого типа. В спецификации процедуры тип возвращаемого значения не указывается, поэтому она не обязана возвращать какое-либо значение, но может содержать оператор возврата, который просто прекращает ее выполнение и возвращает управление вызвавшему коду.
-
И те, и другие могут иметь формальные параметры OUT или INOUT, но в функции такие параметры использовать не следует.
-
И те, и другие могут использоваться в конструкции WHERE SQL- оператора SELECT.
-
-
Что будет результатом выполнения следующего кода?
<<outer_block>>
DECLARE
scope_num NUMBER := 3;
BEGIN
DECLARE
scope_num NUMBER : = 6;
Num_a NUMBER := outer_block.scope_num;
BEGIN
dbms_output.put_line(scope_num);
dbms_output.put_line(Num_a);
END;
dbms_output.put_line(scope_num); END;
END;
-
6 3 3
-
Выполнение будет прервано с выдачей сообщения о повторном объявлении
-
3 3 3
-
6 3 6
-
Что из сказанного ниже относительно операторов IF справедливо?
-
Выполняется не более одного набора операторов, соответствующего условию со значением TRUE. Все остальные операторы не выполняются.
-
Возможны варианты. Иногда выполняется более одного набора операторов, поскольку истинными могут быть одновременно несколько условий.
-
-
Для какого из следующих циклов будет выполнен как минимум один проход?
-
LOOP
-
WHILE
-
FOR
-
Курсорный FOR
-
-
Что из сказанного ниже относительно исключений неверно?
-
Исключения, возбужденные в секции объявлений, могут быть обработаны во включающем блоке, если вы этого захотите.
-
После того как обработчик исключения завершает свою работу, выполняют операторы выполняемой секции, следующие непосредственно за оператором, приведшим к возбуждению исключения.
-
Когда система возбуждает исключения, и они не обрабатываются программистом, система не производит автоматический откат всех завершенных изменений объектов базы данных (например, таблиц), сделанных в той выполняемой секции, где возникло исключение.
-
Исключение, возбужденное в вызванной процедуре и не обрабатываемое этой процедурой, приведет к откату изменений, выполненных в параметрах INOUT и OUT к моменту возникновения исключения.
-