Achei a documentação. Estava tão obcecado pelo EXECUTE que entrei no lugar
errado da documentação. Talvez pudesse existir um link para [2] dentro da
documentação do comando EXECUTE.

Agora sim está funcionando perfeitamente. A versão final da função ficou:

CREATE OR REPLACE FUNCTION f_valor_existe( VARCHAR, VARCHAR, INTEGER )
RETURNS BOOLEAN AS
$f_valor_existe$
DECLARE
    cNomeTabela    ALIAS FOR $1;
    cNomeColuna    ALIAS FOR $2;
    iValor            ALIAS FOR $3;
    cSQL                TEXT;
    nCount            INTEGER;
BEGIN
    cSQL = 'SELECT COUNT('||cNomeColuna||') AS _ID FROM '||cNomeTabela||'
WHERE '||cNomeColuna || ' = ' || CAST(iValor AS TEXT);

    RAISE INFO 'Comando SQL: %', cSQL;

    EXECUTE cSQL INTO nCount;

    IF nCount > 0 THEN
      return true;
    END IF;

    RETURN false;
END;
$f_valor_existe$
LANGUAGE 'plpgsql' VOLATILE;

[2]
http://www.postgresql.org/docs/8.4/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

-- 
**********************************************
Tiago J. Adami
http://www.adamiworks.com
**********************************************

2009/9/30 Tiago Adami <[email protected]>

> Obrigado, Fabrízio. Gostaria de fazer mais duas perguntas a respeito da sua
> resposta:
>
> 1) Existem duas funções EXECUTE no PostgreSQL? Estive consultando a
> documentação em [1] e pelo o que entendi, é apenas para códigos preparados
> (prepared statements);
>
> 2) A função agora ficou assim:
>
> CREATE OR REPLACE FUNCTION f_valor_existe( VARCHAR, VARCHAR, INTEGER )
> RETURNS BOOLEAN AS
> $f_valor_existe$
> DECLARE
>     cNomeTabela    ALIAS FOR $1;
>     cNomeColuna    ALIAS FOR $2;
>     iValor            ALIAS FOR $3;
>     cSQL                TEXT;
>     nID                INTEGER;
> BEGIN
>     cSQL = 'SELECT '||cNomeColuna||' FROM '||cNomeTabela||' WHERE
> '||cNomeColuna || ' = ' || CAST(iValor AS TEXT);
>
>     RAISE INFO 'Comando SQL: %', cSQL;
>
>     EXECUTE cSQL;
>
>     IF FOUND THEN
>       return true;
>     END IF;
>
>     RETURN false;
> END;
> $f_valor_existe$
> LANGUAGE 'plpgsql' VOLATILE;
>
> Compila e executa perfeitamente. Mas mesmo existindo o valor na tabela, o
> resultado de "FOUND" sempre é "FALSE". Alguma sugestão para contornar este
> comportamento?
>
> Obrigado mais uma vez.
>
> [1] http://www.postgresql.org/docs/8.4/static/sql-execute.html
>
>
> --
> **********************************************
> Tiago J. Adami
> http://www.adamiworks.com
> **********************************************
>
> 2009/9/30 Fabrízio de Royes Mello <[email protected]>
>
>>
>>
>> 2009/9/30 Tiago Adami <[email protected]>
>>
>>> Já estudei o EXECUTE antes de postar a pergunta. Não encontrei um meio de
>>> colocar o nome da tabela e o nome da coluna de forma dinâmica, apenas os
>>> valores. Como disse anteriormente, preciso passar o nome da tabela (FROM) e
>>> o nome da coluna como parâmetros da função, assim como o seu valor.
>>>
>>
>> Quem sabe algo parecido com:
>>
>> EXECUTE 'SELECT '||cNomeColuna||' FROM '||cNomeTabela||' WHERE
>> '||cNomeColuna =' || CAST(iValor AS TEXT);
>>
>>
>> Cordialmente,
>> --
>> Fabrízio de Royes Mello
>> >> Blog sobre TI: http://fabriziomello.blogspot.com
>>
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>>
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a