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
postgresql
stored-procedures
plpgsql
Gismo Ranas
fonte
fonte
Respostas:
As funções PL / PgSQL e SQL simples fazem parte de um conjunto de ferramentas maior e devem ser visualizadas 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á o trabalho bem:
LISTEN
eNOTIFY
converse com ele.Com muita frequência, uma visualização é suficiente quando você acha que uma função é necessária. Mesmo que seja extremamente caro para
SELECT
toda a exibição, asWHERE
cláusulas na consulta que faz 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 visualizações.O horário principal em que você descobre que não pode usar uma visualizaçã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 superior 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 incorporadas 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 é empurrada para baixo na 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 funcionam é quando você precisa de muita lógica. Se / then / else operações que você não pode expressar como
CASE
instruções, muita reutilização de resultados calculados, criação de valores a partir de partes, manipulação de erros, etc. O PL / PgSQL é útil então. Escolha PL / PgSQL quando não puder usar funções SQL ou elas não são adequadas, como para:EXECUTE
instruçãoRAISE
erros / avisos para os logs ou clientesEXCEPTION
blocos, em vez de a transação inteira terminar com erroCASE ... WHEN
muito bemWITH
e CTEsCom expressões comuns de tabela (CTEs), especialmente CTEs graváveis,
WITH RECURSIVE
acho que uso o PL / PgSQL muito menos do que costumava, porque o SQL é muito mais expressivo e poderoso. Eu uso modos de exibição e funções simples do SQL muito mais agora. Vale lembrar que funções simples do SQL podem conter mais de uma instrução; a última instrução é o resultado da função.fonte
plpgsql
é uma linguagem processual completa, com variáveis, construções em loop, etc. UmaSQL
função é simplesmente uma subconsulta. Uma função SQL, se declaradaSTABLE
ouIMMUTABLE
não, tambémSTRICT
pode ser incorporada na consulta de chamada, como se estivesse gravada em cada referência.fonte