Логические значения и переменные чрезвычайно удобны. Так как логические переменные в PL/SQL могут принимать только три значения: TRUE, FALSE и NULL, их использование проясняет смысл программного кода. Сложное логическое выражение с множеством разных переменных заменяется одной логической переменной, имя которой напрямую выражает смысл выражения.
Приведем пример команды IF с использованием логической переменной (или функции — только по этому короткому фрагменту трудно различить их):
IF report_requested
THEN
print_report (report_id);
END IF;
Программная логика данного фрагмента не только делает его чуть более самодокументированным, но и способствует его защите от будущих изменений. Рассмотрим, к примеру, код реализации пользовательского интерфейса, который может предшествовать этой команде. Как программа определяет, нужно ли пользователю печатать отчет? Возможно, она выводит окно запроса с вариантами ответов «Да» и «Нет» или предлагает установить флажок или выбрать в списке нужный вариант. Для приведенного кода это не имеет значения. Код реализации можно изменить в любой момент; если интерфейс будет правильно присваивать значение логической переменной report_requested, это не повлияет на работоспособность программы.
Логический тип данных поддерживается в языке PL/SQL, но не в базе данных Oracle. В PL/SQL можно создать логическую переменную и работать с ней, но создать таблицу с логическими столбцами вам не удастся.
Тот факт, что логическая переменная может принимать и значение NULL, отражается на структуре команды IF...THEN...ELSE. Для примера сравните две следующие команды:
IF report_requested
THEN
NULL; -- Выполняется, если report_requested = TRUE
ELSE
NULL; -- Выполняется, если report_requested = FALSE или IS NULL
END IF;
IF NOT report_requested
THEN
NULL; -- Выполняется, если report_requested = FALSE
ELSE
NULL; -- Выполняется, если report_requeste = TRUE or IS NULL
END IF;
Если всем трем возможным значениям переменной должны соответствовать разные действия, используйте каскадную команду IF:
IF report_requested
THEN
NULL; -- Выполняется, если report_requested = TRUE
ELSIF NOT report_requested
THEN
NULL; -- Выполняется, если report_requested = FALSE
ELSE
NULL; -- Выполняется, если report_requested IS NULL
END IF;
Подробнее о значениях NULL в командах IF рассказывается в этом блоге.