Структуры управления вычислениями
Известно, что для реализации алгоритмов на процедурном языке программирования требуется наличие в нем трех следующих структур управления вычислениями, причем должна быть возможность вкладывать все структуры друг в друга произвольным образом:
последовательность команд (выполнение команд согласно их упорядоченности);
выбор (проверка условия и выполнение той или иной последовательности команд в зависимости от истинности или ложности условия);
повторение (выполнение последовательности команд до тех пор, пока условие повторения принимает истинное значение).
Рис. 1.Структуры управления вычислениями.
Команды, указанные в коде PL/SQL, выполняются последовательно. Такая схема называется потоком команд, то есть первая требуемая структура управления вычислениями (последовательность) в PL/SQL имеется. Рассмотрим языковые конструкции PL/SQL для выбора и повторения (условные команды, команды перехода и циклы).
Условные команды и команды перехода
В PL/SQL к условным командам относятся команды IF и CASE, переходы реализуются командами GOTO и NULL.
Условная команда IF
Условная команда IF позволяет проверить заданное логическое условие и, в зависимости от результатов проверки (TRUE, FALSE или UNKNOWN), выполнить различные ветви кода. В PL/SQL имеется три формы команды IF:
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);
Читать дальше