2015-06-24 9:24 GMT-03:00 PAULO <pa...@visualpsistemas.com.br>:

>     EXECUTE 'SELECT '|| ufCliente ||' INTO resultado FROM cfop WHERE
> cod_cfop = '||'p_cfop';
>
>     RETURN resultado;
>

Dois erros:

1. O INTO que você quer é parte do EXECUTE, não do SELECT (da forma como
fez, executaria, mas criaria uma tabela chamada "resultado", o que não é o
que queres);
2. O valor da variável p_cfop deve ser embutido no comando.

Ambos os erros são relacionados. Basicamente, o que está no escopo da
função PL/pgSQL não está visível no comando dentro do EXECUTE. O que
recomendo pra você é:

1. Coloque o SQL numa variável, assim facilita debugar e evita erros como
esse;
2. Use a função format para usar identificadores;
3. Use a cláusula USING para passar parâmetros.

Seguindo isso, o comando ficaria:

    DECLARE
        v_sql text;
        ...
        v_sql := format('SELECT %I FROM cfop WHERE cod_cfop = $1',
ufCliente);
        RAISE NOTICE 'SQL: %', v_sql; -- não necessário, só para visualizar
        EXECUTE v_sql INTO resultado USING p_cfop;
        RETURN resultado;
        ...


De qualquer forma, eu recomendo fortemente você repensar seu esquema. Não
seria melhor ter uma tabela com (cod_cfop, uf, valor), assim não precisaria
de consulta dinâmica, poderia usar diretamente:


    SELECT c.valor INTO resultado

    FROM cfop c

    WHERE c.cod_cfop = p_cfop

        AND c.uf = ufCliente;


Atenciosamente,
-- 
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Reply via email to