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