- •6. Управляющие структуры и обработка ошибок в pl/sql
- •6.1. Оператор if
- •6.2. Циклы
- •Цикл loop
- •Цикл while
- •Цикл for
- •6.3. Курсоры
- •Объявление курсора и атрибуты курсора
- •Записи pl/sql
- •Использование команд open, fetch и close
- •Курсорный цикл for
- •Предложение where с условием поиска current of
- •6.4. Использование вложенных циклов и курсоров
- •6.5. Обработка ошибок
- •Исключения
- •Системные исключения
- •Исключения, определяемые программистом
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 выполняется условие выхода и цикл завершается.