- •1. Хранимые процедуры и функции
- •1.1. Создание хранимой процедуры (функции)
- •1.2. Использование параметров
- •1.3. Локальные переменные
- •1.4. Присвоение значения локальной переменной
- •1.5. Форматирование временного интервала
- •1.6. Операторы ветвления
- •1.6.1. Оператор if…then…else
- •1.6.2. Оператор case
- •1.6.3. Проверка правильности ввода
- •1.6.4. Вывод приветствия в зависимости от времени суток
- •1.7. Циклы
- •1.7.1. Оператор while
- •1.7.2. Досрочный выход из цикла
- •1.7.3. Оператор repeat
- •1.7.4. Оператор loop
- •1.7.5. Отсутствующие идентификаторы
- •1.8. Получение списка созданных хранимых процедур и функций
- •1.9. Содержимое хранимой процедуры
- •1.10. Удаление хранимых процедур
- •1.11. Редактирование хранимых процедур
- •1.12. Обработчик ошибок
- •1.13. Курсоры
- •1.14. Рекурсивные хранимые процедуры
- •2. Триггеры
- •2.1. Создание триггера
- •2.2. Удаление триггера
- •2.3 Список созданных триггеров
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 может выступать составной оператор begin…end.
Замечание! Следует отметить, что с СУБД 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 используются два или более операторов, для наглядности можно прибегать к составному оператору begin…end.