Оператор CASE
позволяет выбрать для исполнения одну из нескольких последовательностей операторов. Операторы CASE появились в стандарте SQL уже в 1992 году, но Oracle SQL стал поддерживать CASE только в версии Oracle8i Database, а PL/SQL не поддерживал CASE вплоть до версии Oracle9/ Database Release 1. Начиная с этой версии PL/SQL поддерживает следующие виды операторов CASE:
Простой оператор CASE
Ставит в соответствие каждой последовательности операторов PL/ SQL некоторое значение. Выбирает последовательность операторов для выполнения на основе вычисления выражения, возвращающего одно из таких значений.
Поисковый оператор CASE
Выбирает последовательность операторов для выполнения на основе вычисления списка логических условий. Выполняется последовательность операторов, соответствующая первому условию, вычисленному как TRUE
.
В дополнение к операторам CASE PL/SQL поддерживает также выражения CASE. По форме выражение CASE очень похоже на оператор CASE. Оно позволяет выбрать из множества выражений то выражение, которое должно быть вычислено. Результатом выражения CASE является некоторое значение, в то время как результатом оператора CASE является исполнение последовательности операторов PL/SQL.
Простой оператор CASE
Простой оператор CASE позволяет на основе вычисления результатов некоторого выражения выбрать одну из нескольких последовательностей операторов PL/SQL для исполнения. Приведем пример простого оператора CASE, в котором для выбора нужного алгоритма вычисления бонуса используется анализ должности сотрудников (переменная employee type):
CASE employee_type WHEN 'S' THEN
award_salary_bonus(employee_id);
WHEN 'H' THEN
award_hourly_bonus(employee_id);
WHEN 'C' THEN
award_commissioned_bonus(employee_id);
ELSE
RAISE invalid_employee_type;
END CASE;
Рассмотренный оператор CASE содержит явное выражение ELSE, однако в общем случае оно не является обязательным. Если выражение ELSE явно не указано, то PL/SQL неявно использует такую конструкцию:
ELSE
RAISE CASE_NOT_FOUND;
Поисковый оператор CASE
Поисковый оператор CASE вычисляет список логических выражений и, найдя выражение, равное TRUE, выполняет соответствующую ему последовательность операторов. Фактически поисковый оператор CASE эквивалентен оператору CASE TRUE из предыдущего раздела. Приведем пример поискового оператора CASE:
CASE
WHEN salary >= 10000 AND salary <=20000 THEN
give_bonus(employee_id, 1500);
WHEN salary > 20000 AND salary <= 40000 THEN
give_bonus(employee_id, 1000);
WHEN salary > 40000 THEN
give_bonus(employee_id, 500);
ELSE
give_bonus(employee_id, 0);
END CASE;