IF THEN END IF
IF THEN ELSE END IF
IF THEN ELSIF ELSE END IF
Границы действия команды IF определяются закрывающими ключевыми словами END IF. Альтернативная последовательность команд следует после ключевого слова ELSE, для расширения структуры ветвления дополнительно можно задать дополнительное условие после ключевого слова ELSIF.
Команда IF имеет следующий синтаксис:
IF условие 1 THEN
команды 1; ветвь 1
ELSIF условие 2 THEN
команды 2; ветвь 2
ELSE
команды n; альтернативная последовательность команд (ELSE-ветвь)
END IF;
Команды первой ветви кода выполняются только тогда, когда проверка условия определяет его истинность (TRUE). Если же проверка условия определяет FALSE или UNKNOWN (например, при сравнении с NULL), то выполняются команды ELSE-ветви.
Приведем пример программы, которая выводит сообщение о классе излучения в зависимости от значения вводимого параметра длины волны (длина волны предполагается заданной в микронах).
SQL> DECLARE
2 lamda NUMBER; Длина волны
3 text1 VARCHAR2(30) := 'Инфракрасное излучение';
4 text2 VARCHAR2(30) := 'Видимый свет';
5 text3 VARCHAR2(30) := 'Ультрафиолет';
6исполняемый раздел
7 BEGIN
8 lamda := &Input_Data;
9 DBMS_OUTPUT.PUT_LINE('');
10 IF (lamda > 0.65)
11 THEN DBMS_OUTPUT.PUT_LINE(text1);
12 ELSIF (lamda < 0.41)
13 THEN DBMS_OUTPUT.PUT_LINE(text3);
14 ELSE
15 DBMS_OUTPUT.PUT_LINE(text2);
16 END IF;
17 END;
/
Enter value for input_data: 0.33
old 8: lamda := &Input_Data;
new 8: lamda := 0.33;
Ультрафиолет
PL/SQL procedure successfully completed.
При сложной логике ветвления и проверке многочисленных условий рекомендуется вместо вложенных команд IF использовать условную команду CASE, так как с ней получается более понятный и компактный код.
Условная команда CASE
Команда CASE имеет две разновидности:
простая команда CASE, которая связывает одну или несколько последовательностей команд PL/SQL с некоторыми значениями (выполняемая последовательность команд выбирается при совпадении результата вычисления заданного выражения со значением, связанным с этой последовательностью команд);
поисковая команда CASE, которая выбирает для выполнения последовательность команд в зависимости от результатов проверки списка логических условий (выполняется последовательность команд, связанная с первым логическим условием в списке, результат проверки которого оказался равным TRUE).
Несмотря на громоздкое описание, работать с командой CASE обеих разновидностей просто и удобно.
Простая команда CASE имеет следующий синтаксис:
CASE выражение
WHEN результат 1 THEN
последовательность команд 1;
WHEN результат 2 THEN
последовательность команд 2;
ELSE
альтернативная последовательность команд;
END CASE;
Простая команда CASE обычно используется для избавления от многочисленных команд IF и конструкций ELSE в них путем формирования хорошо структурированных ветвей кода в зависимости от списка значений, которые может принимать некоторая управляющая переменная. Приведем пример поиска слова на русском языке по английскому аналогу:
SQL> DECLARE
2 english_termin VARCHAR2(20);
3 text1 VARCHAR2(30) := 'Инфракрасное излучение';
4 text2 VARCHAR2(30) := 'Видимый свет';
5 text3 VARCHAR2(30) := 'Ультрафиолет';
6 text4 VARCHAR2(30) := 'Неизвестный термин';
7 BEGIN
8 english_termin := &Input_Data;
9 CASE english_termin
10 WHEN 'Infrared radiation' THEN DBMS_OUTPUT.PUT_LINE(text1);
11 WHEN 'Visible light' THEN DBMS_OUTPUT.PUT_LINE(text2);
12 WHEN 'Ultraviolet' THEN DBMS_OUTPUT.PUT_LINE(text3);
13 ELSE DBMS_OUTPUT.PUT_LINE(text4);
14 END CASE;
15 END;
16 /
Enter value for input_data: 'Ultraviolet'
old 8: english_termin := &Input_Data;
new 8: english_termin := 'Ultraviolet';
Ультрафиолет
PL/SQL procedure successfully completed.
Поисковая команда CASE имеет следующий синтаксис:
CASE
WHEN верно логическое условие 1 THEN
последовательность команд 1;
WHEN верно логическое условие 2 THEN
последовательность команд 2;
ELSE
альтернативная последовательность команд;
END CASE;
Перепишем пример определения источника излучения с использованием поисковой команды CASE вместо команды IF (сравните с предыдущей версией):
SQL> DECLARE
2 lamda NUMBER;
3 text1 VARCHAR2(30) := 'Инфракрасное излучение';
4 text2 VARCHAR2(30) := 'Видимый свет';
5 text3 VARCHAR2(30) := 'Ультрафиолет';
6 BEGIN
7 lamda := &Input_Data;
8 CASE
9 WHEN (lamda > 0.65)
10 THEN DBMS_OUTPUT.PUT_LINE(text1);
11 WHEN (Lamda < 0.41)
12 THEN DBMS_OUTPUT.PUT_LINE(text3);
13 ELSE
14 DBMS_OUTPUT.PUT_LINE(text2);
15 END CASE;
16 END;
17 /
Enter value for input_data: 0.50
old 7: lamda := &Input_Data;
new 7: lamda := 0.50;
Видимый свет
PL/SQL procedure successfully completed.
Помимо условной команды CASE, в PL/SQL есть выражение CASE, которое последовательно вычисляет логические выражения из заданного списка, пока одно из них не станет истинным, а затем возвращает результат связанного с ним выражения. В этом заключается отличие выражения CASE от команды CASEкоманда CASE управляет потоком других команд, а выражение CASE вычисляется и его значение может быть присвоено переменным, использовано в других выражениях и т. д.
DECLARE
lamda NUMBER := 0.50;
text1 VARCHAR2(30) := 'Инфракрасное излучение';
text2 VARCHAR2(30) := 'Видимый свет';
text3 VARCHAR2(30) := 'Ультрафиолет';
answer VARCHAR2(30);
BEGIN
answer := CASE WHEN (lamda > 0.65) THEN text1
WHEN (Lamda < 0.41) THEN text3
ELSE text2
END;
DBMS_OUTPUT.PUT_LINE(answer);
END;
Команда перехода GOTO
Команда перехода GOTO позволяет осуществить переход по метке, присутствующей в коде PL/SQL. С помощью уникального идентификатора, заключенного в двойные угловые скобки (метки), можно пометить любую часть исполняемого блока PL/SQL для перехода в это место.
SQL> DECLARE
2 s NUMBER := 1;
3 BEGIN
4 IF s = 1 THEN
5 GOTO mybranch; переход по метке mybranch
6 ELSE
7 s := 1;
8 END IF;
9 <<mybranch>> установка метки mybranch
10 NULL;
11 END;
12 /
PL/SQL procedure successfully completed.
Команда GOTO в языках программирования является объектом критики, поскольку чрезмерное ее применение приводит к созданию нечитаемого «спагетти-кода». Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Доводы против команды GOTO», в которой утверждалось, что квалификация программистов обратно зависит от частоты использования команды GOTO в их программах. Многие преподаватели не принимают написанные студентами программы с командами GOTO по той причине, что наличие GOTO свидетельствует о неумении правильно структурировать исходный код.
Команда NULL
Команда NULL («пустая» команда) обычно используется как «заглушка» в месте, где надо написать какую-нибудь команду, потому что ничего не написать там нельзя по требованиям синтаксиса PL/SQL. Потом, по мере появления определенности, «заглушка» заменяется на функциональный код:
CASE sex
WHEN 'М' THEN
sex_decoded := 'male';
WHEN 'F' THEN
sex_decoded := 'female';
ELSE
NULL; toDo: write code for exception sex not in list {F,M} ;))
END CASE;
Также команда NULL используется при обработке исключений, когда обработка какого-нибудь исключения заключается в отсутствии каких-либо действий (ничегонеделании). Такая практика «замалчивания» исключений обычно не приветствуется, так как она приводит к сложно выявляемым проблемам и неожиданным результатам работы программ.
Циклы
В языке PL/SQL имеется три вида циклов:
простой цикл, который начинается с ключевого слова LOOP и завершается командой END LOOP;
цикл WHILE с предусловием, который позволяет выполнить одну и ту же последовательность команд, пока проверяемое условие истинно;
цикл FOR со счетчиком.
Простой цикл
Простой цикл рассмотрим на примере определения числа, факториал которого является наименьшим числом, впервые превышающим заданную константу (1 000 000 000).
SQL> DECLARE
2 arg NUMBER; Переменная для вычисления факториала
3 i NUMBER; Переменная-счетчик
4 limit NUMBER := 1000000000; Граница
5 text1 VARCHAR2(80) := 'n! числа, впервые превышающий 1000000000';
6
7 BEGIN
8 i := 0;
9 arg := 1;
10 LOOP
11 EXIT WHEN arg > limit;
12 arg := arg*(i+1);
13 i := i + 1;
14 END LOOP;
15 DBMS_OUTPUT.PUT_LINE(text1);
16 DBMS_OUTPUT.PUT_LINE(TO_CHAR(arg));
17 DBMS_OUTPUT.PUT_LINE('Искомое число = '||TO_CHAR(i));
18 END;
/
n! числа, впервые превышающий 1000000000
6227020800
Искомое число = 13
PL/SQL procedure successfully completed.
Из любого цикла в PL/SQL можно выйти командой EXIT с указанием логического условия выхода. В основном команда EXIT используется в простых циклах, потому что в циклах FOR и WHILE и так явно указываются условия окончания цикла, а иметь в коде больше одного условия окончания для цикла является плохим стилем программирования.