41.4. Expressões #

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.)