Capítulo 34. Linguagens procedurais

PostgreSQL 14.5: Linguagens procedurais

O PostgreSQL permite que as funções definidas pelo usuário sejam escritas em outras linguagens além de SQL e C. Estas linguagens são chamadas genericamente de linguagens procedurais (PLs). No caso de uma função escrita 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 como um "elo de ligação" entre o PostgreSQL e a implementação existente de uma linguagem de programação. O tratador em si é uma função escrita na linguagem C, compilada como um objeto compartilhado, e carregado conforme necessário, como qualquer outra função escrita na linguagem C.

Atualmente existem quatro linguagens procedurais disponíveis na distribuição padrão PostgreSQL: PL/pgSQL (Capítulo 35), PL/Tcl (Capítulo 36), PL/Perl (Capítulo 37) e PL/Python (Capítulo 38). Os usuários podem definir outras linguagens. Os princípios básicos para o desenvolvimento de uma nova linguagem procedural estão descritos no Capítulo 46.

Estão disponíveis outras linguagens procedurais adicionais, mas não são incluídas na distribuição núcleo. O Apêndice H contém informações sobre como encontrá-las.

34.1. Instalação de linguagem procedural

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 sã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 passos 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 quatro passos, que devem ser efetuados por um superusuário do banco de dados. O programa createlang automatiza tudo menos o passo 1.

  1. O objeto compartilhado contendo o tratador da linguagem deve ser compilado e instalado em um diretório de biblioteca apropriado. Funciona da mesma maneira que a construção e instalação de módulos contendo funções C regulares definidas pelo usuário; consulte a Seção 31.9.6. Geralmente o tratador da linguagem depende de uma biblioteca externa que disponibiliza o mecanismo verdadeiro da linguagem de programação; se for assim, esta biblioteca também deve ser instalada.

  2. O tratador deve ser declarado pelo comando:

    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.

  3. Opcionalmente o tratador da linguagem pode disponibilizar uma função "validadora" para verificar se a definição da função está correta, sem na verdade executá-la. Caso exista, a função validadora é chamada pelo comando CREATE FUNCTION. Se o tratador disponibilizar uma função validadora, esta deve ser declarada por um comando como:

    CREATE FUNCTION nome_da_função_validadora(oid)
        RETURNS void
        AS 'caminho_para_o_objeto_compartilhado'
        LANGUAGE C;
    
  4. A linguagem procedural deve ser declarada pelo comando:

    CREATE [TRUSTED] [PROCEDURAL] LANGUAGE nome_da_linguagem
        HANDLER nome_da_função_tratadora
        [VALIDATOR nome_da_função_validadora] ;
    

    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 34-1 mostra como funciona o procedimento de instalação manual com a linguagem PL/pgSQL.

Exemplo 34-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;

A linguagem PL/pgSQL possui uma função validadora, portanto esta também é declarada:

CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS
    '$libdir/plpgsql' LANGUAGE C;

Depois o comando

CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql
    HANDLER plpgsql_call_handler
    VALIDATOR plpgsql_validator;

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.

SourceForge.net Logo CSS válido!