45.4. Выражения #

Все выражения, используемые в операторах PL/pgSQL, обрабатываются основным исполнителем SQL-сервера. Например, для вычисления такого выражения:

IF выражение THEN ...

PL/pgSQL отправит следующий запрос исполнителю SQL:

SELECT выражение

При формировании команды SELECT все вхождения имён переменных PL/pgSQL заменяются параметрами запроса, как подробно описано в Подразделе 45.12.1. Это позволяет один раз подготовить план выполнения команды SELECT и повторно использовать его в последующих вычислениях с различными значениями переменных. Таким образом, при первом использовании выражения, по сути происходит выполнение команды PREPARE. Например, если мы объявили две целочисленные переменные x и y, и написали:

IF x < y THEN ...

то, что реально происходит за сценой, эквивалентно:

PREPARE имя_оператора(integer, integer) AS SELECT $1 < $2;

и затем, эта подготовленная команда исполняется (EXECUTE) для каждого оператора IF с текущими значениями переменных PL/pgSQL, переданных как значения параметров. Обычно эти детали не важны для пользователей PL/pgSQL, но их полезно знать при диагностировании проблем. Более подробно об этом рассказывается в Подразделе 45.12.2.

Поскольку выражение преобразуется в команду SELECT, оно может содержать те же предложения, что и обычная команда SELECT, но не может включать предложения UNION, INTERSECT или EXCEPT на верхнем уровне запроса. Например, так можно проверить, является ли таблица непустой:

IF count(*) > 0 FROM my_table THEN ...

поскольку выражение между IF и THEN разбирается, как если бы это была команда SELECT count(*) > 0 FROM my_table. Команда SELECT должна выдавать один столбец и не более одной строки. (Если она не возвращает ни одной строки, считается, что возвращается NULL.)