41.4. Выражения#
41.4. Выражения
Все выражения, используемые в операторах PL/pgSQL, обрабатываются с помощью основного исполнителя SQL сервера. Например, когда вы пишете оператор PL/pgSQL вроде
IF expression THEN ...
PL/pgSQL будет вычислять выражение, подавая запрос вида
SELECT expression
в основной SQL-движок. При формировании команды SELECT все вхождения имен переменных PL/pgSQL заменяются на параметры запроса, как подробно обсуждается в разделе Раздел 41.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, но
они полезны при попытке диагностировать проблему.
Более подробная информация приведена в разделе Раздел 41.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).