Alguém pode resumir as diferenças entre:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
e
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
Pontos principais:
- diferenças conceituais
- dada uma família problemática, conveniência de uso
- questões políticas
As funções PL/PgSQL e SQL simples fazem parte de um conjunto de ferramentas maior e devem ser vistas nesse contexto. Costumo pensar nisso em termos de uma escala crescente de poder combinada com complexidade e custo crescentes, onde você deve usar a ferramenta mais simples que fará bem o trabalho:
LISTEN
eNOTIFY
fale com ele.Muitas vezes, uma visão é suficiente quando você acha que uma função é necessária. Mesmo que seja extremamente caro para
SELECT
toda a exibição,WHERE
as cláusulas na consulta que fazem referência à exibição geralmente são inseridas na exibição e podem resultar em planos de consulta muito diferentes. Muitas vezes tive grandes melhorias de desempenho ao converter funções SQL em exibições.A principal ocasião em que você descobre que não pode usar uma exibição e deve considerar uma função SQL é quando:
WHERE
cláusulas simples são necessários, como um parâmetro dentro de umaWITH
expressãoSECURITY DEFINER
função e assecurity_barrier
visualizações no PostgreSQL 9.2 e superiores não são suficientes para suas necessidades;Para a maioria dessas tarefas, uma função SQL simples funciona bem e geralmente é mais fácil de ler do que PL/PgSQL. As funções SQL declaradas
STABLE
ouIMMUTABLE
(e também não declaradasSTRICT
ouSECURITY DEFINER
) também podem ser embutidas na instrução de chamada. Isso elimina a sobrecarga da chamada de função e às vezes também pode resultar em enormes benefícios de desempenho quando uma condição WHERE na função de chamada é enviada para a função SQL pelo otimizador. Use funções SQL sempre que forem suficientes para a tarefa.O principal momento em que as funções SQL não farão o trabalho é quando você precisa de muita lógica. Operações if/then/else que você não pode expressar como
CASE
instruções, muita reutilização de resultados calculados, criação de valores a partir de partes, tratamento de erros, etc. PL/PgSQL é útil então. Escolha PL/PgSQL quando você não puder usar funções SQL ou elas não forem adequadas, como para:EXECUTE
instruçãoRAISE
erros/avisos para os logs ou clienteEXCEPTION
blocos em vez de ter toda a transação encerrada em caso de erroCASE ... WHEN
muito bemWITH
e CTEsCom expressões de tabela comuns (CTEs), especialmente CTEs graváveis e
WITH RECURSIVE
acho que uso PL/PgSQL muito menos do que costumava porque o SQL é muito mais expressivo e poderoso. Eu uso visualizações e funções SQL simples muito mais agora. Vale lembrar que as funções SQL simples podem conter mais de uma instrução; a última instrução é o resultado da função.plpgsql
é uma linguagem processual completa, com variáveis, construções de loop, etc. UmaSQL
função é simplesmente uma subconsulta. Uma função SQL, se for declaradaSTABLE
ouIMMUTABLE
não declaradaSTRICT
, pode frequentemente ser embutida na consulta de chamada, como se fosse escrita em cada referência.