O PostgreSQL permite os usuários adicionarem novas linguagens de programação e torná-las disponíveis para escrever funções e procedimentos. São chamadas de linguagens procedurais (PL). No caso de uma função ou gatilho escrito em uma linguagem procedural, o servidor de banco de dados não possui nenhum conhecimento interno sobre como interpretar o texto do código fonte da função. Em vez disso, a tarefa é passada para um tratador especial que conhece os detalhes da linguagem. O tratador pode fazer todo o trabalho de análise gramatical e sintática, execução, etc., por si próprio, ou pode servir de "elo de ligação" entre o PostgreSQL e a implementação existente de uma linguagem de programação. O próprio tratador é uma função especial escrita em C, compilada como um objeto compartilhado, e carregada conforme necessário.
Como escrever um tratador para uma nova linguagem procedural está descrito no Capítulo 47 . Várias linguagens procedurais estão disponíveis na distribuição padrão do PostgreSQL, podendo servir de exemplo.
A linguagem procedural deve ser "instalada" em cada banco de dados onde vai ser utilizada. Porém, as linguagens procedurais instaladas no banco de dados template1 ficam disponíveis automaticamente em todos os bancos de dados criados após sua instalação, uma vez que suas entradas em template1 serão copiadas pelo comando CREATE DATABASE. Portanto, o administrador de banco de dados pode decidir quais linguagens ficarão disponíveis em quais bancos de dados, e pode tornar algumas linguagens disponíveis por padrão se assim o decidir.
Para as linguagens fornecidas na distribuição padrão, pode ser utilizado o programa createlang para instalar a linguagem em vez de executar os detalhes manualmente. Por exemplo, para instalar a linguagem PL/pgSQL no banco de dados template1 é utilizado:
createlang plpgsql template1
O procedimento manual descrito abaixo somente é recomendado para a instalação de linguagens personalizadas que o programa createlang desconhece.
Instalação manual de linguagem procedural
A linguagem procedural é instalada no banco de dados em três passos, que devem ser efetuados por um superusuário do banco de dados. O programa createlang automatiza o passo 2 e o passo 3 .
CREATE FUNCTION nome_da_função_tratadora() RETURNS language_handler AS 'caminho_para_o_objeto_compartilhado' LANGUAGE C;O tipo especial retornado language_handler informa ao sistema de banco de dados que a função não retorna um dos tipos de dado SQL definidos, e que não pode ser utilizada diretamente nas declarações SQL.
CREATE [TRUSTED] [PROCEDURAL] LANGUAGE nome_da_linguagem HANDLER nome_da_função_tratadora;A palavra opcional TRUSTED (confiável) especifica que é permitido aos usuários comuns do banco de dados, que não possuem privilégio de superusuário, utilizarem esta linguagem para criar procedimentos de funções e gatilhos. Uma vez que as funções na linguagem procedural são executadas dentro do servidor de banco de dados, o sinalizador TRUSTED somente deve ser especificado para as linguagens que não permitem acesso às funcionalidades internas do servidor de banco de dados, nem ao sistema de arquivos. As linguagens PL/pgSQL, PL/Tcl e PL/Perl são consideradas confiáveis; as linguagens PL/TclU, PL/PerlU e PL/PythonU foram projetadas para fornecer funcionalidades ilimitadas, não devendo ser marcadas como confiáveis.
O Exemplo 36-1 mostra como funciona o procedimento de instalação manual com a linguagem PL/pgSQL.
Exemplo 36-1. Instalação manual do PL/pgSQL
O comando abaixo informa ao servidor de banco de dados onde encontrar o objeto compartilhado da função tratadora de chamadas da linguagem PL/pgSQL:
CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '$libdir/plpgsql' LANGUAGE C;
Depois o comando
CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler;
define que a função declarada anteriormente deve ser chamada para os procedimentos de função e gatilho onde o atributo de linguagem for plpgsql.
Na instalação padrão do PostgreSQL o tratador para a linguagem PL/pgSQL é construído e instalado no diretório de "biblioteca". Se o suporte à linguagem Tcl estiver configurado, os tratadores para PL/Tcl e PL/TclU também serão construídos e instalados no mesmo local. Da mesma maneira, os tratadores para PL/Perl e PL/PerlU serão construídos e instalados se o suporte à linguagem Perl estiver configurado, e PL/PythonU será instalado se o suporte à linguagem Python estiver configurado.