Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
33
Добавлен:
17.04.2018
Размер:
75.26 Кб
Скачать

6. Управляющие структуры и обработка ошибок в pl/sql

6.1. Оператор if

Оператор IF имеет следующий синтаксис:

IF условие_1 THEN

действие_1;

[ELSIF условие_2 THEN

действие_2;]

[ELSE

альтернативное_действие;]

END IF;

Действие_1 ... альтернативное_действие представляют один или несколько PL/SQL-операторов. Каждая группа операторов выполняется только в том случае, если выполнено соответствующее условие. После того как обнаружено выполнение одного из условий, остальные условия не проверяются.

Ниже описана функция, которая вычисляет скидку на заказ с использованием оператора IF:

-- Расчет скидки на заказ.

-- Входной параметр - сумма заказа. Возвращается сумма скидки

-- (нуль при неверных входных данных).

CREATE FUNCTION compute_discounts (order_amt NUMBER)

RETURN NUMBER IS

small_order_amt NUMBER := 400;

large_order_amt NUMBER := 1000;

small_disct NUMBER := 1;

large_disct NUMBER := 5;

BEGIN

IF (order_amt < large_order_arat

AND

order_amt >= small_order_amt)

THEN

RETURN (order_amt * small_disct / 100) ;

ELSIF (order_amt >= large_order_amt)

THEN

RETURN (order_amt * large_disct / 100);

ELSE

RETURN(0);

END IF;

END compute_discounts;

/

Эта функция будет делать скидку в 1% для заказов на сумму от 400 до 1000, и скидку в 5% для заказов на сумму более 1000. Для всех остальных значений (включая неправильные) она будет возвращать нуль. К неправильным значениям относятся, например, отрицательные числа.

Проверить работу функции можно с помощью следующего анонимного блока:

DECLARE

tiny NUMBER := 20;

med NUMBER := 600;

big NUMBER := 4550;

wrong NUMBER := -35;

BEGIN

dbms_output.put_line (' Order AND Discount ');

dbms_output.put_line (tiny || ' ' || compute_discounts (tiny)) ;

dbms_output.put_line (med || ' ' || compute_discounts (med));

dbms_output.put_line (big || ' ' || compute_discounts (big));

dbms_output.put_line (wrong|| ' ' || compute_discounts (wrong));

END;

/

6.2. Циклы

PL/SQL предоставляет три различные конструкции для итеративной обработки. Каждая из них позволяет циклически выполнять набор операторов PL/SQL. Выход из цикла осуществляется в зависимости от некоторого условия.

Цикл loop

Конструкция LOOP имеет следующий синтаксис:

<< имя_цикла >>

LOOP

операторы;

EXIT имя_цикла [WHEN условие_выхода] ;

операторы;

END LOOP;

При наличии конструкции WHEN все операторы в теле цикла повторяются до тех пор, пока выражение условие_выхода не примет иcтинное значение. Условие выхода проверяется на каждом проходе, иначе называемом итерацией. Как только выражение принимает значение "истина", все операторы после EXIT пропускаются, итерации прекращаются и выполнение продолжается с первого оператора, следующего за END LOOP. Если условие WHEN отсутствует, операторы между LOOP и EXIT выполняются только один раз.

В следующем примере распечатываются первые десять чисел:

DECLARE

just_a_num NUMBER := 1;

BEGIN

<<just_a_loop>>

LOOP

dbms_output.put_line (just_a_num) ;

EXIT just_a_loop

WHEN (just_a_num >= 10);

just_a_num := just_a_num + 1;

END LOOP;

END;

/

Каждая итерация увеличивает переменную just_a_num на 1. По достижении значения 10 выполняется условие выхода и цикл завершается.

Соседние файлы в папке Lab5