[pgbr-geral] REF: SELECT com EXECUTE.
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.
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 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