PL/pgSQL é uma linguagem procedural carregável, desenvolvida para o sistema de banco de dados PostgreSQL. Os objetivos de projeto do PL/pgSQL foram criar uma linguagem procedural carregável que:
pode ser usada para criar funções, procedimentos e gatilhos;
adiciona estruturas de controle à linguagem SQL;
pode realizar cálculos complexos;
herda todos os tipos de dados, funções, procedimentos e operadores definidos pelo usuário;
pode ser definida como confiável pelo servidor;
é fácil de usar.
As funções criadas com PL/pgSQL podem ser usadas em qualquer lugar onde as funções nativas podem ser usadas. Por exemplo, é possível criar funções complexas de computação condicional e depois usá-las para definir operadores, ou usá-las em expressões de índice.
No PostgreSQL 9.0 e posteriores, o PL/pgSQL é instalado por padrão. No entanto, ainda é um módulo carregável, portanto, administradores notadamente preocupados com segurança podem optar por removê-lo.
SQL é a linguagem que o PostgreSQL, e a maioria dos outros bancos de dados relacionais, usa como linguagem de consulta. É portável e fácil de aprender, mas cada instrução SQL deve ser executada individualmente pelo servidor de banco de dados.
Isto significa que a aplicação cliente deve enviar cada consulta ao servidor de banco de dados, esperar ser processada, receber e processar os resultados, fazer alguns cálculos e, em seguida, enviar outra consulta ao servidor. Tudo isto resulta em comunicação entre processos e, também, resulta em sobrecarga da rede se o cliente estiver em uma máquina diferente do servidor de banco de dados.
Com o PL/pgSQL é possível agrupar um bloco de computação e uma série de consultas dentro do servidor de banco de dados, tendo assim o poder de uma linguagem procedural e a facilidade de uso do SQL, mas com uma economia considerável de sobrecarga de comunicação cliente/servidor:
são eliminadas viagens extras entre cliente e servidor
os resultados intermediários que o cliente não precisa, não precisam ser empacotados ou transferidos entre o servidor e o cliente
podem ser evitadas múltiplas rodadas de análise da consulta
pode resultar em um aumento de desempenho considerável, se comparado com uma aplicação que não usa funções armazenadas.
além disso, no PL/pgSQL é possível usar todos os tipos de dados, operadores e funções do SQL.
As funções escritas em PL/pgSQL podem
aceitar como argumentos qualquer tipo de dados escalar ou matricial
com suporte pelo servidor, podendo retornar um resultado de qualquer
um desses tipos de dados.
Também podem aceitar, ou retornar, qualquer tipo de dados composto
(tipo de dados linha) especificado pelo nome.
Além disso, é possível declarar uma função
PL/pgSQL como aceitando o tipo de dados
record, significando que qualquer tipo de dados
composto servirá como entrada ou como retorno de
record, e que o resultado é um tipo de dados linha
cujas colunas são determinadas pela especificação da consulta de
chamada, conforme discutido em Funções de tabela.
As funções PL/pgSQL podem ser declaradas
como aceitando um número variável de argumentos, usando o marcador
VARIADIC.
Funciona exatamente da mesma maneira que para funções
SQL, conforme discutido em
Funções SQL com número variável de argumentos.
As funções escritas em PL/pgSQL também podem ser declaradas como aceitando e retornando os tipos de dados polimórficos descritos em Tipos de dados polimórficos, permitindo assim que os tipos de dados reais tratados pela função variem de chamada em chamada. Os exemplos estão mostrados em Declaração de parâmetros de função.
As funções escritas em PL/pgSQL também
podem ser declaradas como retornando “conjunto”
(ou tabela) de qualquer tipo de dados que pode ser retornado como
uma única instância.
Esta função gera sua saída executando RETURN NEXT
para cada elemento desejado do conjunto de resultados, ou usando
RETURN QUERY para gerar o resultado da avaliação
de uma consulta.
Finalmente, uma função escrita em PL/pgSQL
pode ser declarada como retornando void, se não tiver
nenhum valor útil a ser retornado. (Como alternativa, pode ser
escrita como um procedimento neste caso.)
As funções escritas em PL/pgSQL também
podem ser declaradas com parâmetros de saída no lugar de uma
especificação explícita do tipo de dados retornado.
Isto não adiciona nenhum recurso fundamental à linguagem, mas
é geralmente conveniente, principalmente para retornar vários valores.
A notação RETURNS TABLE também pode ser usada
no lugar de RETURNS SETOF.
Exemplos específicos são mostrados em Declaração de parâmetros de função e Retorno de função.