- •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.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 – “Доброй ночи”. Ниже представлено возможное решение.