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