Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / L67 / Обработка ошибок.doc
Скачиваний:
46
Добавлен:
16.04.2013
Размер:
71.17 Кб
Скачать

Исключения, определяемые программистом

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

Вы можете использовать свои собственные исключения для обработки ошибок, которые система не обнаруживает или не считает за ошибки. Например, система не знает, что количество товаров в заказе должно быть целым положительным числом. Однако ваше приложение должно об этом знать, и вы можете установить соответствующий контроль, перехватывая значения, не являющиеся положительными целыми, в ходе вычислений с количествами товаров. Это очень простой пример, но нетрудно представить и более сложные случаи, с которыми вы наверняка столкнетесь при разработке реальных приложений.

Контрольные Вопросы

  1. Что из сказанного ниже относительно функций и процедур PL/SQL справедливо?

    1. Между ними нет разницы.

    2. В спецификации функции указан тип возвращаемого значения, и функция обязана возвращать значение этого типа. В спецификации процедуры тип возвращаемого значения не указывается, поэтому она не обязана возвращать какое-либо значение, но может содержать оператор возврата, который просто прекращает ее выполнение и возвращает управление вызвавшему коду.

    3. И те, и другие могут иметь формальные параметры OUT или INOUT, но в функции такие параметры использовать не следует.

    4. И те, и другие могут использоваться в конструкции WHERE SQL- оператора SELECT.

  2. Что будет результатом выполнения следующего кода?

<<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;

    1. 6 3 3

    2. Выполнение будет прервано с выдачей сообщения о повторном объявлении

    3. 3 3 3

    4. 6 3 6

  1. Что из сказанного ниже относительно операторов IF справедливо?

    1. Выполняется не более одного набора операторов, соответствующего условию со значением TRUE. Все остальные операторы не выполняются.

    2. Возможны варианты. Иногда выполняется более одного набора операторов, поскольку истинными могут быть одновременно несколько условий.

  2. Для какого из следующих циклов будет выполнен как минимум один проход?

    1. LOOP

    2. WHILE

    3. FOR

    4. Курсорный FOR

  3. Что из сказанного ниже относительно исключений неверно?

    1. Исключения, возбужденные в секции объявлений, могут быть обработаны во включающем блоке, если вы этого захотите.

    2. После того как обработчик исключения завершает свою работу, выполняют операторы выполняемой секции, следующие непосредственно за оператором, приведшим к возбуждению исключения.

    3. Когда система возбуждает исключения, и они не обрабатываются программистом, система не производит автоматический откат всех завершенных изменений объектов базы данных (например, таблиц), сделанных в той выполняемой секции, где возникло исключение.

    4. Исключение, возбужденное в вызванной процедуре и не обрабатываемое этой процедурой, приведет к откату изменений, выполненных в параметрах INOUT и OUT к моменту возникновения исключения.