Documentação do PostgreSQL 7.4.1 | ||||
---|---|---|---|---|
Anterior | Início | Capítulo 37. PL/pgSQL - Linguagem procedural SQL | Fim | Próxima |
Uma boa maneira de desenvolver em PL/pgSQL é utilizar o editor de texto preferido para criar as funções e, em outra janela, utilizar o psql para carregar e testar as funções desenvolvidas. Se estiver sendo feito desta maneira, é uma boa idéia escrever a função utilizando CREATE OR REPLACE FUNCTION. Fazendo assim, basta recarregar o arquivo para atualizar a definição da função. Por exemplo:
CREATE OR REPLACE FUNCTION funcao_teste(integer) RETURNS integer AS ' .... end; ' LANGUAGE plpgsql;
Na linha de comando do psql a definição da função pode ser carregada ou recarregada utilizando
\i nome_do_arquivo.sql
e logo em seguida podem ser executados os comandos SQL que testam a função.
Outra boa maneira de desenvolver em PL/pgSQL, é utilizar uma ferramenta de acesso ao banco de dados com interface gráfica que facilite o desenvolvimento em linguagem procedural. Um exemplo deste tipo de ferramenta é o PgAccess, mas existem outras. Estas ferramentas geralmente disponibilizam funcionalidades úteis como o escape de apóstrofos, e tornam mais fácil recriar e depurar funções.
Uma vez que o corpo da função PL/pgSQL é especificado como um literal cadeia de caracteres no comando CREATE FUNCTION, deve ser feita uma seqüência de escape para os apóstrofos dentro do corpo da função duplicando estes caracteres. Em certas circunstâncias isto pode levar a um código complicado, especialmente quando são escritas funções que geram outras funções, como no exemplo da Seção 37.6.4 . O quadro abaixo pode ser útil como um resumo do número de apóstrofos necessários em diversas situações.
CREATE FUNCTION foo() RETURNS integer AS '...' LANGUAGE plpgsql;Em todas as ocorrências dentro do corpo da função os apóstrofos devem aparecer em pares.
a_output := ''Blah''; SELECT * FROM usuarios WHERE f_nome=''foobar'';A segunda linha é vista pelo PL/pgSQL como:
SELECT * FROM usuarios WHERE f_nome='foobar';
a_output := a_output || '' AND nome LIKE ''''foobar'''' AND xyz''O verdadeiro valor anexado a a_output seria: AND nome LIKE 'foobar' AND xyz.
a_output := a_output || '' AND nome LIKE ''''foobar''''''O valor anexado à a_output seria: AND nome LIKE 'foobar'.
a_output := a_output || '' if v_'' || referrer_keys.kind || '' like '''''''''' || referrer_keys.key_string || '''''''''' then return '''''' || referrer_keys.referrer_type || ''''''; end if;'';O valor de a_output seria então:
if v_... like ''...'' then return ''...''; end if;
Uma outra abordagem é fazer o escape dos apóstrofos no corpo da função utilizando a contrabarra, em vez de duplicá-los. Desta forma é escrito \'\' no lugar de ''''. Alguns acham esta forma mais fácil, porém outros não concordam.