Команды и выражения CASE в PL/SQL Oracle
Команда CASE позволяет выбрать для выполнения одну из нескольких последовательностей команд. Существует несколько разновидностей команды CASE:
- Простая команда CASE — связывает одну или несколько последовательностей команд PL/SQL с соответствующими значениями (выполняемая последовательность выбирается с учетом результата вычисления выражения, возвращающего одно из значений).
- Поисковая команда CASE — выбирает для выполнения одну или несколько последовательностей команд в зависимости от результатов проверки списка логических значений. Выполняется последовательность команд, связанная с первым условием, результат проверки которого оказался равным TRUE.
Кроме команд CASE, PL/SQL также поддерживает CASE-выражения. Такое выражение очень похоже на команду CASE, оно позволяет выбрать для вычисления одно или несколько выражений. Результатом выражения CASE является одно значение, тогда как результатом команды CASE является выполнение последовательности команд PL/SQL.
Простые команды CASE
Простая команда CASE позволяет выбрать для выполнения одну из нескольких последовательностей команд PL/SQL в зависимости от результата вычисления выражения.
Синтаксис команды CASE
CASE выражение WHEN результат_1 THEN команды_1 WHEN результат_2 THEN команды_2 ... ELSE команды_else END CASE;
Ветвь ELSE здесь не обязательна. При выполнении такой команды PL/SQL сначала вычисляет выражение, после чего результат сравнивается с результат_1. Если они совпадают, то выполняются команды_1. В противном случае проверяется значение результат_2 и т. д.
Рассмотрим простой команды CASE, в котором премия начисляется в зависимости от значения переменной employee_type:
CASE employee_type WHEN 'S' THEN award_salary_bonus(employee_id); WHEN 'H' THEN award_hourly_bonus(employee_id); WHEN 'C' THEN award_commissioned_bonus(employee_id); ELSE RAISE invalid_employee_type; END CASE;
В этом примере присутствует явно заданная секция ELSE, однако в общем случае она не обязательна. Без секции ELSE компилятор PL/SQL неявно подставляет такой код:
ELSE RAISE CASE_NOT_FOUND;
Иначе говоря, если не задать ключевое слово ELSE и если никакой из результатов в секциях WHEN не соответствует результату выражения в команде CASE, PL/SQL инициирует исключение CASE_NOT_FOUND. В этом и заключается отличие данной команды от IF. Когда в команде IF отсутствует ключевое слово ELSE, то при невыполнении условия не происходит ничего, тогда как в команде CASE аналогичная ситуация приводит к ошибке.
Поисковая команда CASE
Поисковая команда CASE проверяет список логических выражений. Обнаружив выражение, равное TRUE, выполняет последовательность связанных с ним команд.
Синтаксис поисковой команды CASE
CASE WHEN выражение_1 THEN команды_1 WHEN выражение_2 THEN команда_2 ... ELSE команды_else END CASE;
Поисковая команда CASE, как и простая команда, подчиняется следующим правилам:
- Выполнение команды заканчивается сразу же после выполнения последовательности исполняемых команд, связанных с истинным выражением. Если истинными оказываются несколько выражений, то выполняются команды, связанные с первым из них.
- Ключевое слово ELSE не обязательно. Если оно не задано и ни одно из выражений не равно TRUE, инициируется исключение CASE_NOT_FOUND.
- Условия WHEN проверяются в строго определенном порядке, от начала к концу.
Поисковые команды CASE используются в тех случаях, когда выполняемые команды определяются набором логических выражений. Простая команда CASE используется тогда, когда решение принимается на основании результата одного выражения.
Выражения CASE
Выражения CASE решают ту же задачу, что и команды CASE, но только не для исполняемых команд, а для выражений. Простое выражение CASE выбирает для вычисления одно из нескольких выражений на основании заданного скалярного значения. Поисковое выражение CASE последовательно вычисляет выражения из списка, пока одно из них не окажется равным TRUE, а затем возвращает результат связанного с ним выражения.
Синтаксис этих двух разновидностей выражений CASE
-- Простое выражение CASE CASE выражение WHEN результат_1 THEN результирующее_выражение_1 WHEN результат_2 THEN результирующее_выражение_2 ... ELSE результирующее_выражение_else END; -- Поисковое выражение CASE CASE WHEN выражение_1 THEN результирующее_выражение_1 WHEN выражение_2 THEN результирующее_выражение_2 ... ELSE результирующее_выражение_else END;
Выражение CASE возвращает одно значение — результат выбранного для вычисления выражения. Каждой ветви WHEN должно быть поставлено в соответствие одно результирующее выражение (но не команда). В конце выражения CASE не ставится ни точка с запятой, ни END CASE. Выражение CASE завершается ключевым словом END.
Далее приводится пример простого выражения CASE, используемого совместно с процедурой PUT_LINE пакета DBMS_OUTPUT для вывода на экран значения логической переменной. (Помните, что PUT_LINE не поддерживает логические типы напрямую.) В этом примере выражение CASE преобразует логическое значение в символьную строку, которая затем выводится процедурой PUT_LINE:
DECLARE boolean_true BOOLEAN := TRUE; boolean_false BOOLEAN := FALSE; boolean_null BOOLEAN; FUNCTION boolean_to_varchar2 (flag IN BOOLEAN) RETURN VARCHAR2 IS BEGIN RETURN CASE flag WHEN TRUE THEN 'True' WHEN FALSE THEN 'False' ELSE 'NULL' END; END; BEGIN DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_true)); DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_false)); DBMS_OUTPUT.PUT_LINE(boolean_to_varchar2(boolean_null)); END;
Выражение CASE может применяться везде, где допускается использование выражений любого другого типа.
В отличие от команды CASE, если условие ни одной ветви WHEN не выполнено, выражение CASE не выдает ошибку, а просто возвращает NULL.