КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Операторы ветвления
Хранимые процедуры – это не просто удобные контейнеры для групп запросов, они позволяют реализовать достаточно сложную логику, используя операторы ветвления.
Замечание! Вне хранимых процедур описываемые в данном разделе операторы применять нельзя.
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 может принимать следующие значения:
Оператор if в приведенном примере проверяет, не равен ли параметр flag нулю, если это так, срабатывает первый запрос, и процедура выходит из if. Если параметр flag не равен нулю, проверка перемещается к блоку elseif, где происходит сравнение параметра flag с единицей. Равенство flag единице приводит к выполнению второго оператора select. Если оператор flag принимает любое значение, отличное от 0 и 1, выполняется третий запрос. Третий запрос будет выполнен, даже если flag является отрицательным значением.
Число блоков elseif не ограничено – можно использовать любое их количество. Однако злоупотреблять блоками elseif не рекомендуется, т. к. большое число блоков elseif снижает читабельность кода.
Если в блоках if, elseif, else используются два или более операторов, для наглядности можно прибегать к составному оператору begin…end.
1.6.2. Оператор case Оператор case позволяет осуществить множественный выбор и имеет две формы. Синтаксис первой формы оператора выглядит следующим образом:
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list ] … [ELSE statement_list ] END CASE
Синтаксис второй формы:
CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list ] … [ELSE statement_list ] END CASE Замечание! Синтаксис оператора case внутри хранимой процедуры немного отличается от синтаксиса SQL-выражения case. Оператор case не может содержать конструкцию else null, и его выполнение завершается с помощью выражения end case, а не end. В первой форме оператор case сравнивает выражение case_value с when_value. Как только соответствие найдено, выполняется необходимый оператор statement_list. Если ни одно соответствие не найдено, выполняется оператор statement_list, размещенный после ключевого слова else (если оно, конечно, присутствует).
Перепишем хранимую процедуру format_now() при помощи оператора case (см. пример ниже).
В приведенном выше примере представлена ситуация, когда в качестве параметра flag передано ошибочное значение, обработанное специально в блоке else. Подход с применением оператора if это также допускает, но в операторе case ключевое слово else лучше выделяется на фоне последовательности ключевых слов when по сравнению с ключевыми словами elseif в операторе if.
Вторая форма оператора case позволяет осуществлять сравнение непосредственно в конструкции when – как только будет найдено первое истинное значение, выполняется оператор statement_list, и процедура выходит из оператора case. Ниже представлена процедура format_now(), реализованная с применением второй формы оператора case.
Если в одном блоке when необходимо выполнить несколько запросов, следует использовать блок begin…end. 1.6.3. Проверка правильности ввода
Пусть необходимо выводить название элементов каталога из таблицы catalogs. Вывод названия должен осуществляться по первичному ключу id_catalog. При этом если в таблице отсутствует запись с переданным номером, необходимо вывести соответствующее сообщение. Ниже представлено соответствующее решение.
Если в таблице catalogs отсутствует запись, соответствующая передаваемому значению id, оператор select…into…from не заполняет локальную переменную name_catalog и ее значение остается не определенным (т. е. равное null). Поэтому далее, если значение переменной равно null, выводится надпись об отсутствии записи в таблице, если переменная name_catalog не равна null – выводится название элемента каталога. 1.6.4. Вывод приветствия в зависимости от времени суток Создадим хранимую функцию hello(), которая будет возвращать приветствие, в зависимости от текущего времени суток. С 6:00 до 12:00 функция должна возвращать фразу “Доброе утро”, с 12:00 до 18:00 функция должна возвращать фразу “Добрый день”, с 18:00 до 00:00 – “Добрый вечер”, с 00:00 до 6:00 – “Доброй ночи”. Ниже представлено возможное решение.
Дата добавления: 2015-05-09; Просмотров: 3013; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |