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

40.4. Выражения

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

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

IF expression THEN ...

PL/pgSQL будет вычислять выражение, подавая запрос вида

SELECT expression

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

IF x < y THEN ...

что происходит за кулисами эквивалентно

PREPARE statement_name(integer, integer) AS SELECT $1 < $2;

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

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

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

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