Todas as expressões usadas nas instruções do PL/pgSQL são processadas usando o mecanismo de SQL principal do servidor. Por exemplo, se for escrita uma instrução PL/pgSQL como
IF expressão THEN ...
o PL/pgSQL avaliará a expressão enviando uma consulta como
SELECT expressão
para o mecanismo de SQL principal.
Ao formar o comando SELECT, quaisquer ocorrências
de nomes de variáveis do PL/pgSQL são
substituídas por parâmetros da consulta, conforme discutido em
detalhes em Substituição de variável.
Isto permite que o plano da consulta para o comando
SELECT seja preparado apenas uma vez, e depois
reutilizado para avaliações posteriores com diferentes valores das
variáveis.
Assim, na realidade o que acontece no primeiro uso da expressão
é essencialmente um comando PREPARE.
Por exemplo, se declararmos duas variáveis inteiras
x e y e escrevermos
IF x < y THEN ...
o que acontece nos bastidores equivale a
PREPARE nome_da_instrução(integer, integer) AS SELECT $1 < $2;
e depois a instrução preparada é executada para cada execução da
instrução IF, com os valores correntes das
variáveis do PL/pgSQL fornecidos como
valores dos parâmetros.
Normalmente, estes detalhes não são importantes para o usuário do
PL/pgSQL, mas é útil conhecê-los ao
tentar diagnosticar problemas.
São mostradas mais informações em Cache de plano.
Como a expressão é convertida em um
comando SELECT, ela pode conter as mesmas
cláusulas que um SELECT comum conteria,
mas não pode incluir uma cláusula UNION,
INTERSECT ou EXCEPT
no nível mais alto.
Assim, por exemplo, pode-se testar se uma tabela não está vazia com
IF count(*) > 0 FROM minha_tabela THEN ...
uma vez que a expressão entre o
IF e o THEN é analisada como
SELECT count(*) > 0 FROM minha_tabela.
O SELECT deve produzir uma única coluna,
e não mais que uma linha.
(Se não produzir linhas, o resultado será considerado NULL.)