Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Хранимые процедуры и функции.doc
Скачиваний:
6
Добавлен:
24.09.2019
Размер:
22.57 Mб
Скачать

1.6. Операторы ветвления

Хранимые процедуры – это не просто удобные контейнеры для групп запросов, они позволяют реализовать достаточно сложную логику, используя операторы ветвления.

Замечание! Вне хранимых процедур описываемые в данном разделе операторы применять нельзя.

1.6.1. Оператор if…then…else

Оператор if позволяет реализовать ветвление программы по условию и имеет следующий синтаксис:

IF search_condition THEN statement_list

[ELSEIF search_condition THEN statement_list] …

[ELSEIF statement_list]

END IF

Логическое выражение search_condition может принимать два значения: 0 (ложь) и значение, отличное от нуля (истина). Если логическое выражение истинно, то оператор statement_list после ключевого слова then выполняется, иначе выполняется список операторов в блоке else (если блок else имеется).

В качестве statement_list может выступать составной оператор beginend.

Замечание! Следует отметить, что с СУБД MySQL, кроме оператора if существует функция if().

Рассмотрим простейший пример использования оператора if. Хранимая процедура format_now(), представленная в пример ниже, выводит текущую дату в формате “DD.MM.YY”, если аргумент flag принимает значение 0, и текущее время в формате “hh:ii:ss”, если аргумент flag принимает значение 1.

Замечание! Для создания логических выражений можно использовать все операторы сравнения (=, >, >=, < >, <, <=). Кроме того, логические выражения можно комбинировать при помощи операторов && (И) и || (ИЛИ).

Оператор if может быть снабжен дополнительным блоком else, после которого выполняются операторы, если условие оказалось ложным. Функцию format_now() можно переписать так, как это показано ниже.

Замечание! После ключевого слова else ставить точку с запятой не нужно, т. к. этим единый оператор if разбивается на части – точку с запятой ставят после ключевого слова end if.

C точки зрения функциональности, хранимые процедуры из двух данных примеров абсолютно одинаковы, но в последнем случае понадобился лишь одни оператор if, который принимает в качестве логического выражения аргумент flag. Если flag равен 1, что является истиной, выполняется первый оператор, выводящий текущее время, если аргумент flag равен 0, что является ложью, выполняется запрос в блоке else.

Оператор if позволяет выбрать и большее число альтернатив. Процедуру format_now() можно изменить таким образом, чтобы она выводила количество секунд, прошедших с полуночи 1 января 1970 года (см. пример ниже). Таким образом, аргумент flag может принимать следующие значения:

  • 0 – дата в формате “DD.MM.YYYY”;

  • 1 – время в формате “%H:%i:%s”;

  • 2 и выше – время в формате UNIXSTAMP.

Оператор if в приведенном примере проверяет, не равен ли параметр flag нулю, если это так, срабатывает первый запрос, и процедура выходит из if. Если параметр flag не равен нулю, проверка перемещается к блоку elseif, где происходит сравнение параметра flag с единицей. Равенство flag единице приводит к выполнению второго оператора select. Если оператор flag принимает любое значение, отличное от 0 и 1, выполняется третий запрос. Третий запрос будет выполнен, даже если flag является отрицательным значением.

Число блоков elseif не ограничено – можно использовать любое их количество. Однако злоупотреблять блоками elseif не рекомендуется, т. к. большое число блоков elseif снижает читабельность кода.

Если в блоках if, elseif, else используются два или более операторов, для наглядности можно прибегать к составному оператору beginend.