Documentação do PostgreSQL 7.4.1 | ||||
---|---|---|---|---|
Anterior | Início | Capítulo 37. PL/pgSQL - Linguagem procedural SQL | Fim | Próxima |
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 são terminadas por 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;
Resultado da execução:
select func_escopo(); NOTICE: Aqui a quantidade é 30 NOTICE: Aqui a quantidade é 80 NOTICE: 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 o PostgreSQL não possui transações aninhadas.