[pgbr-geral] REF: SELECT com EXECUTE.

2015-06-24 Thread PAULO
Olá Pessoal,

 

Estou tentando executar um SELECT com EXECUTE, porém não estou conseguindo.

 

CREATE OR REPLACE FUNCTION aliquota_cliente (ufCliente char(2), p_cfop
char(5)) RETURNS integer AS $$

DECLARE

resultado integer ;

BEGIN

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

RETURN resultado;

END; 

$$ 

LANGUAGE plpgsql;

--

Retorna o seguinte erro:


---

ERRO:  coluna "p_cfop" não existe

LINE 1: SELECT sp_ INTO resultado FROM cfop WHERE cfop = p_cfop

 ^

QUERY:  SELECT sp_ INTO resultado FROM cfop WHERE cfop = p_cfop

CONTEXT:  PL/pgSQL function " aliquota_cliente " line 5 at comando EXECUTE

 

** Error **

ERRO: coluna "p_cfop" não existe


---

 

Alguém pode dar uma dica ??

 

Obrigado.

 

Paulo.

 

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] REF: SELECT com EXECUTE.

2015-06-24 Thread André Ormenese
Assim vai ?

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

Em 24 de junho de 2015 09:24, PAULO  escreveu:

>  Olá Pessoal,
>
>
>
> Estou tentando executar um SELECT com EXECUTE, porém não estou conseguindo.
>
>
>
> CREATE OR REPLACE FUNCTION aliquota_cliente (ufCliente char(2), p_cfop
> char(5)) RETURNS integer AS $$
>
> DECLARE
>
> resultado integer ;
>
> BEGIN
>
> EXECUTE 'SELECT '|| ufCliente ||' INTO resultado FROM cfop WHERE
> cod_cfop = '||'p_cfop';
>
> RETURN resultado;
>
> END;
>
> $$
>
> LANGUAGE plpgsql;
>
> --
>
> Retorna o seguinte erro:
>
>
> ---
>
> ERRO:  coluna "p_cfop" não existe
>
> LINE 1: SELECT sp_ INTO resultado FROM cfop WHERE cfop = p_cfop
>
>  ^
>
> QUERY:  SELECT sp_ INTO resultado FROM cfop WHERE cfop = p_cfop
>
> CONTEXT:  PL/pgSQL function " aliquota_cliente " line 5 at comando EXECUTE
>
>
>
> ** Error **
>
> ERRO: coluna "p_cfop" não existe
>
>
> ---
>
>
>
> Alguém pode dar uma dica ??
>
>
>
> Obrigado.
>
>
>
> Paulo.
>
>
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] REF: SELECT com EXECUTE.

2015-06-24 Thread Matheus de Oliveira
2015-06-24 9:24 GMT-03:00 PAULO :

> 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