41.1. Visão geral #

41.1.1. Vantagens de usar o PL/pgSQL
41.1.2. Argumentos com suporte e tipos de dados do resultado

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:

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.

41.1.1. Vantagens de usar o PL/pgSQL #

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.

41.1.2. Argumentos com suporte e tipos de dados do resultado #

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.