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

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 необходимо выполнить несколько запросов, следует использовать блок beginend.

1.6.3. Проверка правильности ввода

Пусть необходимо выводить название элементов каталога из таблицы catalogs. Вывод названия должен осуществляться по первичному ключу id_catalog. При этом если в таблице отсутствует запись с переданным номером, необходимо вывести соответствующее сообщение. Ниже представлено соответствующее решение.

Если в таблице catalogs отсутствует запись, соответствующая передаваемому значению id, оператор selectintofrom не заполняет локальную переменную 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 – “Доброй ночи”. Ниже представлено возможное решение.