44.4. Выражения #
Все выражения, используемые в операторах PL/pgSQL, обрабатываются основным исполнителем SQL-сервера. Например, для вычисления такого выражения:
IF выражение
THEN ...
PL/pgSQL отправит следующий запрос исполнителю SQL:
SELECT выражение
При формировании команды SELECT
все вхождения имён переменных PL/pgSQL заменяются параметрами запроса, как подробно описано в Подразделе 44.12.1. Это позволяет один раз подготовить план выполнения команды SELECT
и повторно использовать его в последующих вычислениях с различными значениями переменных. Таким образом, при первом использовании выражения, по сути происходит выполнение команды PREPARE
. Например, если мы объявили две целочисленные переменные x
и y
, и написали:
IF x < y THEN ...
то, что реально происходит за сценой, эквивалентно:
PREPARE имя_оператора
(integer, integer) AS SELECT $1 < $2;
и затем, эта подготовленная команда исполняется (EXECUTE
) для каждого оператора IF
с текущими значениями переменных PL/pgSQL, переданных как значения параметров. Обычно эти детали не важны для пользователей PL/pgSQL, но их полезно знать при диагностировании проблем. Более подробно об этом рассказывается в Подразделе 44.12.2.
Поскольку выражение
преобразуется в команду SELECT
, оно может содержать те же предложения, что и обычная команда SELECT
, но не может включать предложения UNION
, INTERSECT
или EXCEPT
на верхнем уровне запроса. Например, так можно проверить, является ли таблица непустой:
IF count(*) > 0 FROM my_table THEN ...
поскольку выражение
между IF
и THEN
разбирается, как если бы это была команда SELECT count(*) > 0 FROM my_table
. Команда SELECT
должна выдавать один столбец и не более одной строки. (Если она не возвращает ни одной строки, считается, что возвращается NULL.)