Oracle PL/SQL IF THEN ELSE Оператор: ELSIF, NESTED-IF

⚡ Умное резюме

Операторы принятия решений в PL/SQL определяют, какой код будет выполняться в зависимости от логического условия. Oracle Предоставляет возможности использования операторов IF-THEN, IF-THEN-ELSE, IF-THEN-ELSIF и NESTED-IF, позволяя программе пропускать блок, выбирать между двумя путями или выбирать один из множества вариантов.

  • 🔀 Цель: Условие, возвращающее значение TRUE или FALSE, определяет ход выполнения программы.
  • ЕСЛИ-ТО: Блок кода выполняется только тогда, когда условие истинно, в противном случае он пропускается.
  • ↔️ ЕСЛИ-ТО-ИНАЧЕ: Выбирает один из двух блоков: один для значения TRUE, другой для значения FALSE.
  • 🪜 ЕСЛИ-ТО-ИНАЧЕ: Проверяет условия последовательно и выполняет первое условие, которое истинно, с необязательным оператором ELSE.
  • 🧩 Вложенное условие: Вставляет один оператор IF внутрь другого оператора IF для объединения условий.
  • ⚠️ Правило NULL: Условие, результат которого равен NULL, рассматривается как FALSE.
  • 🔚 Терминатор: Каждый оператор IF должен быть закрыт соответствующим оператором END IF.

Oracle PL/SQL IF THEN ELSE ELSIF

Что такое заявления о принятии решений?

Утверждения, определяющие процесс принятия решений, регулируют поток данных. SQL Операторы, основанные на условиях. Они дают программисту лучший контроль над предотвращением выполнения определенного блока или выбором желаемого блока на основе условия. Ниже приведено графическое представление оператора принятия решения.

Диаграмма заявления о принятии решения
Диаграмма заявления о принятии решения

Типы формулировок, используемых для принятия решений: Oracle предоставляет следующие типы.

  • IF-THEN
  • ЕСЛИ-ТО-ИНАЧЕ
  • ЕСЛИ-ТО-ЭЛСИФ
  • Вложенный-ЕСЛИ
  • Кейсы
  • ПОИСК ДЕЛА

В этом руководстве рассматриваются варианты оператора IF. Формы CASE и поиск CASE рассматриваются в разделе... Оператор CASE в PL/SQL руководства.

ЕСЛИ-ТО Заявление

Оператор IF-THEN используется для выполнения определенного участка кода только тогда, когда выполняется условие. Условие должно давать результат. Логический Значение (Истинное/Ложное). Это базовое условное выражение, позволяющее Oracle Выполнить или пропустить фрагмент кода в зависимости от заданного условия.

Синтаксис операторов IF-THEN:

IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block>
END IF;
  • В приведенном выше синтаксисе за ключевым словом «IF» следует условие, которое оценивается как «TRUE» или «FALSE».
  • Управление выполняет только если условие возвращается .
  • Если условие оценивается как SQL пропускает и начинает выполнение кода после блока 'END IF'.

Примечание: Всякий раз, когда условие оценивается как 'NULL', SQL рассматривает 'NULL' как 'FALSE'.

Пример 1: В этом примере мы выводим сообщение, когда число превышает 100.

DECLARE
a NUMBER := 10;
BEGIN
dbms_output.put_line('Program started.');
IF( a > 100 ) THEN
dbms_output.put_line('a is greater than 100');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code Объяснение:

  • Code Строка 2: Объявление переменной 'a' как переменной типа 'NUMBER' и инициализация её значением '10'.
  • Code Строка 4: Вывод сообщения «Программа запущена».
  • Code строка 5: Проверка условия: больше ли значение переменной 'a', чем '100'.
  • Code Строка 6: Если 'a' больше '100', то выводится сообщение «a больше 100». Если 'a' меньше или равно 100, условие не выполняется, и оператор печати игнорируется.
  • Code строка 8: Вывод сообщения «Программа завершена».

Code Выход:

Program started.
Program completed.

Пример 2: В этом примере мы выводим сообщение, если заданная буква является английской гласной (A, E, I, O, U).

DECLARE
a CHAR(1) := 'u';
BEGIN
IF UPPER(a) in ('A','E','I','O','U' ) THEN
dbms_output.put_line('The character is in English Vowels');
END IF;
END;
/

Code Объяснение:

  • Code строка 2: Объявляем переменную 'a' как 'CHAR' размером '1' и инициализируем её значением 'u'.
  • Code строка 4: Проверяется наличие переменной 'a' в списке ('A','E','I','O','U'). Значение 'a' преобразуется в верхний регистр перед сравнением, чтобы сделать сравнение нечувствительным к регистру.
  • Code строка 5: Если символ 'a' присутствует в списке, выводится сообщение «Символ принадлежит английским гласным». Если условие не выполняется, программа не выводит никакого результата, поскольку за пределами блока IF-THEN нет оператора вывода.

Code Выход:

The character is in English Vowels

Оператор IF-THEN-ELSE

Оператор IF-THEN-ELSE используется для выбора между двумя альтернативами на основе условия. Ниже приведён синтаксис.

Синтаксис операторов IF-THEN-ELSE:

IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block1>
ELSE
-execute if the condition failed (returns FALSE)
<action_block2>
END IF;
  • Ключевое слово «IF» сопровождается условием, которое оценивается как «TRUE» или «FALSE».
  • Управление выполняется только если условие возвращается .
  • Если условие оценивается как SQL выполняет .
  • В любом случае, выполняется один из двух блоков действий.

Примечание: Всякий раз, когда условие оценивается как 'NULL', SQL рассматривает 'NULL' как 'FALSE'.

Пример 1: В этом примере мы выводим информацию о том, является ли заданное число четным или нечетным.

DECLARE
a NUMBER:= 11;
BEGIN
dbms_output.put_line ('Program started');
IF( mod(a,2)=0) THEN
dbms_output.put_line('a is even number');
ELSE
dbms_output.put_line('a is odd number');
END IF;
dbms_output.put_line ('Program completed.');
END;
/

Code Объяснение:

  • Code Строка 2: Объявление переменной 'a' как переменной типа 'NUMBER' и инициализация её значением '11'.
  • Code Строка 4: Вывод сообщения «Программа запущена».
  • Code строка 5: Проверка, равен ли модуль переменной 'a', умноженный на '2', нулю.
  • Code строка 6: Если '0', то выводится сообщение "a — четное число".
  • Code строка 7: Если значение модуля не равно '0', условие возвращает значение. Таким образом, выводится сообщение «a — нечётное число».
  • Code строка 10: Вывод сообщения «Программа завершена».

Code Выход:

Program started.
a is odd number
Program completed.

Оператор IF-THEN-ELSIF

  • Оператор IF-THEN-ELSIF используется в тех случаях, когда из набора альтернатив следует выбрать одну, причем каждая альтернатива имеет свое условие.
  • Первое условие, которое возвращается выполняется, а остальные условия пропускаются.
  • Оператор IF-THEN-ELSIF может содержать блок 'ELSE', который выполняется, если ни одно из условий не выполняется.

Примечание: Блок ELSE является необязательным. Если блок ELSE отсутствует и ни одно из условий не выполняется, контроллер пропускает все блоки действий и выполняет оставшийся код.

Синтаксис операторов IF-THEN-ELSIF:

IF <condition1: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block1>
ELSIF <condition2: returns Boolean> THEN
<action_block2>
ELSIF <condition3: returns Boolean> THEN
<action_block3>
ELSE --optional
<action_block_else>
END IF;
  • Управление выполняется только если условие1 возвращается .
  • Если условие 1 не выполняется, контроллер проверяет условие 2, и так далее.
  • Контроллер выходит из оператора IF, когда обнаруживает условие, возвращающее значение. и запускает соответствующий блок действий, или, если ни один из них не выполнен, запускается блок ELSE (если он присутствует).

Примечание: Всякий раз, когда условие оценивается как 'NULL', SQL рассматривает 'NULL' как 'FALSE'.

Пример 1: Без блока ELSE. В этом примере мы выводим оценку на основе заданных баллов без условия else (балл >= 70 — оценка A, балл >= 40 и балл < 70 — оценка B, балл >= 35 и балл < 40 — оценка C).

DECLARE
mark NUMBER := 55;
BEGIN
dbms_output.put_line('Program started.');
IF( mark >= 70) THEN
dbms_output.put_line('Grade A');
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line('Grade B');
ELSIF(mark >= 35 AND mark < 40) THEN
dbms_output.put_line('Grade C');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code Объяснение:

  • Code Строка 2: Объявление переменной 'mark' как объекта типа 'NUMBER' и инициализация её значением '55'.
  • Code Строка 4: Вывод сообщения «Программа запущена».
  • Code строка 5: Проверка условия 1: больше ли значение 'mark' или равно 70.
  • Code строка 7: Поскольку условие 1 не выполнено, проверяется условие 2 '70 > mark >= 40'.
  • Code строка 8: Condition2 возвращает Таким образом, выводится сообщение «Оценка B».
  • Code Строка 12: Выводится сообщение «Программа завершена». Условие 3 'mark < 35' пропускается, поскольку условие TRUE уже было найдено.

Code Выход:

Program started.
Grade B
Program completed.

Пример 2: С использованием блока ELSE. В этом примере мы выводим оценку на основе заданных баллов с условием else (балл >= 70 — оценка A, балл >= 40 и балл < 70 — оценка B, балл >= 35 и балл < 40 — оценка C, иначе — оценка отсутствует).

DECLARE
mark NUMBER := 25;
BEGIN
dbms_output.put_line('Program started.');
IF( mark >= 70) THEN
dbms_output.put_line('Grade A');
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line('Grade B');
ELSIF(mark >= 35 AND mark < 40) THEN
dbms_output.put_line('Grade C');
ELSE
dbms_output.put_line('No Grade');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code Объяснение:

  • Code Строка 2: Объявление переменной 'mark' как объекта типа 'NUMBER' и инициализация её значением '25'.
  • Code Строка 4: Вывод сообщения «Программа запущена».
  • Code строка 5: Проверка условия 1: больше ли значение 'mark' или равно 70.
  • Code строка 7: Поскольку условие 1 не выполнено, проверяется условие 2 '70 > mark >= 40'.
  • Code строка 9: Поскольку условие 2 не выполнено, проверяется условие 3 '40 > mark >= 35'.
  • Code Строка 11: Поскольку все условия не выполнены, выполняется проверка блока ELSE и выводится сообщение «Оценка отсутствует».
  • Code строка 14: Вывод сообщения «Программа завершена».

Code Выход:

Program started.
No Grade
Program completed.

Оператор NESTED-IF

  • Оператор NESTED-IF позволяет программистам размещать одно или несколько условий IF внутри другого условия IF. .
  • Для каждого условия 'IF' необходимо использовать отдельный оператор 'END IF', который обозначает конец области действия данного условия. .
  • В операторе 'IF' в качестве конечной точки для данного условия рассматривается ближайший оператор 'END IF'.
  • Графическое представление метода NESTED-IF показано ниже.

Последовательность вложенных операторов IF

Вложенная структура оператора IF

IF <condition1: returns Boolean>
THEN
--executed only if the condition returns TRUE
<action block1 starts>
IF <condition2: returns Boolean>
THEN
<action_block2>
END IF; --END IF corresponds to condition2
<action_block1 ends>
END IF; --END IF corresponds to condition1

Объяснение синтаксиса:

  • Внешний оператор IF содержит еще один оператор IF в своем блоке действий.
  • Если условие1 возвращается , управление выполняется и проверяет условие 2.
  • Если условие2 также возвращает , затем также выполняется.
  • Если условие 2 оценивается как SQL пропускает .

Пример вложенного оператора IF: наибольшее из трех чисел. В этом примере мы выводим наибольшее из трех чисел, используя вложенный оператор if. Числа присваиваются в части объявления (Number = 10, 15 и 20), а максимальное значение определяется с помощью вложенных операторов if.

DECLARE
a NUMBER := 10;
b NUMBER := 15;
c NUMBER := 20;
BEGIN
dbms_output.put_line('Program started.');
IF( a > b)THEN
/*Nested-if 1 */
dbms_output.put_line('Checking Nested-IF 1');
IF( a > c ) THEN
dbms_output.put_line('A is greatest');
ELSE
dbms_output.put_line('C is greatest');
END IF;
ELSE
/*Nested-if2 */
dbms_output.put_line('Checking Nested-IF 2');
IF( b > c ) THEN
dbms_output.put_line('B is greatest');
ELSE
dbms_output.put_line('C is greatest');
END IF;
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code Объяснение:

  • Code Строки 2-4: Объявление переменных 'a', 'b' и 'c' как 'NUMBER' и инициализация их значениями 10, 15 и 20.
  • Code Строка 6: Вывод сообщения «Программа запущена».
  • Code строка 7: Проверка условия 1: больше ли 'a', чем 'b'.
  • Code строка 10: Если 'a' больше 'b', вложенное условие if 1 проверяет, больше ли 'a' больше 'c'.
  • Code строки 11-13: Если 'a' все еще больше, выводится 'A — наибольшее'; в противном случае выводится 'C — наибольшее'.
  • Code строка 18: Если условие 1 возвращает false, вложенное условие 2 проверяет, больше ли 'b', чем 'c'.
  • Code строки 19-21: Если 'b' больше 'c', выводится 'B — наибольшее значение'; в противном случае выводится 'C — наибольшее значение'.
  • Code строка 24: Вывод сообщения «Программа завершена».

Вывод кода:

Program started.
Checking Nested-IF 2
C is greatest
Program completed.

Сравнение формулировок, используемых при принятии решений.

В таблице ниже приведено краткое описание различных рассмотренных условных операторов, чтобы в каждой конкретной ситуации можно было выбрать подходящий.

Тип Описание Применение
IF-THEN Проверяет логическое условие; если оно истинно, выполняется код из блока 'THEN'. Для пропуска или выполнения определенного блока в зависимости от условия.
ЕСЛИ-ТО-ИНАЧЕ Проверяет логическое условие; если оно истинно, выполняется блок 'THEN', если ложно — блок 'ELSE'. Наиболее уместно в ситуации "то или это".
ЕСЛИ-ТО-ЭЛСИФ Проверяет условия последовательно. Выполняется первый блок, вернувший TRUE. Если ни один из блоков не возвращает TRUE, выполняется блок 'ELSE'. Раньше приходилось выбирать из более чем двух вариантов.
Вложенный-ЕСЛИ Позволяет использовать один или несколько операторов IF-THEN или IF-THEN-ELSIF внутри другого оператора. В основном используется в ситуациях с вложенными условиями.

Часто задаваемые вопросы (FAQ)

Функция ELSIF проверяет плоскую последовательность взаимоисключающих условий. Вложенная функция IF помещает одно условие внутрь другого, поэтому внутренняя проверка выполняется только после того, как внешняя уже истинна.

Условие, которое оценивается как NULL, рассматривается как FALSE, поэтому соответствующий блок THEN пропускается. Это важно, когда сравниваемое значение может быть NULL, поскольку ветка выполнения не будет работать так, как мог бы ожидать начинающий программист.

Оператор CASE понятнее, когда одно выражение сравнивается со многими фиксированными значениями. Оператор IF-THEN-ELSIF подходит для несвязанных условий диапазона. Оба оператора могут выражать одну и ту же логику, но CASE лучше читается при сопоставлении значений.

Да. Искусственный интеллект может преобразовывать вложенные операторы IF в цепочку ELSIF или CASE и выявлять условия, которые никогда не могут быть выполнены. Проверьте переписанный код, поскольку изменение порядка условий может изменить, какая ветвь будет выполняться.

Оператор END IF обозначает точку окончания условного блока, что крайне важно при вложенных операторах IF. Без него компилятор не сможет определить, какие операторы относятся к условию, и выдаст ошибку.

Подведем итог этой публикации следующим образом: