Documentação do PostgreSQL 8.0.0 | ||||
---|---|---|---|---|
Anterior | Início | Capítulo 35. 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 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.