Каждая команда программы, как правило, выполняет некоторое действие. Однако бывают случаи, когда нужно просто указать компилятору PL/SQL, чтобы он не делал ничего, и тогда на помощь приходит оператор NULL
. Он имеет следующий формат:
NULL;
С чего бы команда, которая «ничего не делает», имела сложную структуру? Команда NULL
состоит из ключевого слова NULL
, за которым следует точка с запятой (;) — она указывает, что это команда, а не значение NULL
. В программе эта команда не делает ничего, если не считать передачи управления следующей исполняемой команде. О том, для чего может понадобиться такая команда, вы узнаете ниже из моего блога.
Удобочитаемость кода
Иногда бывает полезно полностью исключить всякую неоднозначность, которая присутствует в командах IF, не покрывающих всех возможных случаев. Например, в команде IF
может отсутствовать ключевое слово ELSE
— как в следующем примере:
IF :report_mgr.selection = 'DETAIL' THEN exec_detail_report; END IF;
Что должна делать программа при выборе другого отчета вместо 'DETAIL
'? Можно предположить, что ничего. Но поскольку в коде это явно не указано, кто-то может подумать, что вы просто забыли запрограммировать соответствующее действие. С другой стороны, присутствие секции ELSE
, которая не делает ничего, предельно четко указывает: «Эта возможность предусмотрена, здесь действительно не должны выполняться никакие операции»:
IF :report_mgr.selection = 'DETAIL' THEN exec_detail_report; ELSE NULL; -- Ничего не делать END IF;
Приведенный пример демонстрирует команду IF
, но аналогичный принцип действует и при записи команд и выражений CASE. Если вам потребуется временно исключить весь код из функции или процедуры, но при этом оставить вызов функции или процедуры в программе, используйте команду NULL
в качестве временного «заполнителя». Без нее вы не сможете откомпилировать функцию или процедуру, не содержащую ни одной строки кода.
Использование NULL после метки
В некоторых случаях переход к NULL
позволяет избежать выполнения дополнительных команд. Большинство программистов никогда не использует GOTO
, а ситуации, в которых эта команда действительно необходима, крайне редки. Но если вам когда-нибудь придется использовать команду GOTO
, помните, что за меткой, к которой осуществляется переход, должна стоять хотя бы одна исполняемая команда. В следующем примере команда GOTO
используется для быстрого перехода в конец программы в том случае, если состояние данных указывает, что дальнейшая обработка не требуется:
PROCEDURE process_data (data_in IN orders%ROWTYPE, data_action IN VARCHAR2) IS status INTEGER; BEGIN -- Первая проверка IF data_in.ship_date IS NOT NULL THEN status := validate_shipdate (data_in.ship_date); IF status != 0 THEN GOTO end_of_procedure; END IF; END IF; -- Вторая проверка IF data_in.order_date IS NOT NULL THEN status := validate_orderdate (data_in.order_date); IF status != 0 THEN GOTO end_of_procedure; END IF; END IF; ... Дополнительные проверки ... <> NULL; END;
При обнаружении ошибки в одном из разделов остальные проверки обходятся командой GOTO
. Поскольку в конце процедуры делать ничего не нужно, но там должна находиться хотя бы одна исполняемая команда, после метки помещается NULL
. Хотя последняя никаких реальных действий не выполняет, она считается исполняемым оператором.