35.3. Estrutura da linguagem PL/pgSQL

PostgreSQL 14.5: Estrutura do PL/pgSQL

A linguagem PL/pgSQL é estruturada em blocos. O texto completo da definição da função deve ser um bloco. Um bloco é definido como:

[ <<rótulo>> ]
[ DECLARE
    declarações ]
BEGIN
    instruções
END;

Todas as declarações e instruções dentro do bloco devem ser terminadas por ponto-e-vírgula. Um bloco contido dentro de outro bloco deve conter um ponto-e-vírgula após o END, conforme mostrado acima; entretanto, o END final que conclui o corpo da função não requer o ponto-e-vírgula.

Todas as palavras chave e identificadores podem ser escritos misturando letras maiúsculas e minúsculas. As letras dos identificadores são convertidas implicitamente em minúsculas, a menos que estejam entre aspas.

Existem dois tipos de comentários no PL/pgSQL. O hífen duplo (--) começa um comentário que se estende até o final da linha. O /* começa um bloco de comentário que se estende até a próxima ocorrência de */. Os blocos de comentário não podem ser aninhados, mas comentários de hífen duplo podem estar contidos em blocos de comentário, e os hífens duplos escondem os delimitadores de bloco de comentário /* e */.

Qualquer instrução na seção de instruções do bloco pode ser um sub-bloco. Os sub-blocos podem ser utilizados para agrupamento lógico, ou para limitar o escopo de variáveis a um pequeno grupo de instruções.

As variáveis declaradas na seção de declaração que precede um bloco são inicializadas com seu valor padrão toda vez que o bloco é executado, e não somente uma vez a cada chamada da função. Por exemplo:

CREATE FUNCTION func_escopo() RETURNS integer AS $$
DECLARE
    quantidade integer := 30;
BEGIN
    RAISE NOTICE 'Aqui a quantidade é %', quantidade;  -- A quantidade aqui é 30
    quantidade := 50;
    --
    -- Criar um sub-bloco
    --
    DECLARE
        quantidade integer := 80;
    BEGIN
        RAISE NOTICE 'Aqui a quantidade é %', quantidade;  -- A quantidade aqui é 80
    END;

    RAISE NOTICE 'Aqui a quantidade é %', quantidade;  -- A quantidade aqui é 50

    RETURN quantidade;
END;
$$ LANGUAGE plpgsql;

=> SELECT func_escopo();

NOTA:  Aqui a quantidade é 30
NOTA:  Aqui a quantidade é 80
NOTA:  Aqui a quantidade é 50
 func_escopo
-------------
          50
(1 linha)

É importante não confundir a utilização de BEGIN/END para o agrupamento de instruções na linguagem PL/pgSQL, com os comandos de banco de dados para controle de transação. O BEGIN/END da linguagem PL/pgSQL é apenas para agrupamento; não começam nem terminam transações. Os procedimentos de funções e de gatilhos são sempre executados dentro da transação estabelecida pelo comando externo — não podem iniciar ou efetivar transações, porque não haveria contexto para estas serem executadas. Entretanto, um bloco contendo a cláusula EXCEPTION forma, efetivamente, uma subtransação que pode ser desfeita sem afetar a transação externa. Para obter mais detalhes deve ser consultada a Seção 35.7.5.

SourceForge.net Logo CSS válido!