Погружение в базы данных Oracle

Данная книга является руководством для начинающих специалистов в области анализа и обработки данных. В книге рассматривается язык SQL и его процедурное расширение PL/SQL от компании Oracle.

Купить книгу

SQL без слёз

Цель книги заключается в том, чтобы научить любого человека работать с реляционными базами данных и получать из них необходимую информацию посредством выполнения SQL-запросов.

Скачать книгу

 ›  ›  ›  › Команды и выражения CASE в PL/SQL Oracle

Команды и выражения 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.

Метки: , .

Записи по теме

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *