37.2. Dicas para desenvolvimento em PL/pgSQL

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.

37.2.1. Tratamento dos apóstrofos

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.

1 apóstrofo
para começar e terminar o corpo da função como, por exemplo:
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.
2 apóstrofos
Para literais cadeia de caracteres dentro do corpo da função como, por exemplo:
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';
4 apóstrofos
Quando há necessidade de um apóstrofo em uma constante cadeia de caracteres dentro do corpo da função como, por exemplo:
a_output := a_output || '' AND nome LIKE ''''foobar'''' AND xyz''
O verdadeiro valor anexado a a_output seria: AND nome LIKE 'foobar' AND xyz.
6 apóstrofos
Quando o apóstrofo na cadeia de caracteres dentro do corpo da função está adjacente ao final da constante cadeia de caracteres como, por exemplo:
a_output := a_output || '' AND nome LIKE ''''foobar''''''
O valor anexado à a_output seria: AND nome LIKE 'foobar'.
10 apóstrofos
Quando há necessidade de dois apóstrofos em uma constante cadeia de caracteres (que necessita de 8 apóstrofos), e estes dois apóstrofos estão adjacentes ao final da constante cadeia de caracteres (mais 2 apóstrofos). Normalmente isto só é necessário quando são escritas funções que geram outras funções como, por exemplo:
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.

SourceForge.net Logo