2009/11/18 Daniel Falcão <daniel.fal...@yahoo.com.br>: > Senhores, > > Tenho a seguinte PROCEDURE: > >> CREATE OR REPLACE FUNCTION correg.somatorio_correicao(cod_resolucao >> integer, cod_membro integer, cod_orgexecucao integer, data_inicial date, >> data_final date, cod_campos integer[]) >> RETURNS integer AS >> $BODY$ >> DECLARE >> subtotal integer; >> total integer; >> tam_array integer; >> membro varchar; >> orgexecucao varchar; >> BEGIN >> /*descobre o tamanho do array passado por parametro:*/ >> tam_array := array_upper(cod_campos, 1); >> >> /*inicializa o contador*/ >> total := 0; >> >> /*ajustando parametros na query*/ >> membro := ''; >> orgexecucao := ''; >> >> if cod_membro = 0 >> then >> membro := ' r.fk_tmpmembro = ' || cod_membro || ' and '; >> end if; >> >> if cod_orgexecucao = 0 >> then >> orgexecucao := ' r.fk_tmporgaoexecucao = ' || cod_orgexecucao || ' >> and '; >> end if; >> >> /*varredura no array:*/ >> for i in 1..tam_array loop >> execute ' >> select >> (select >> sum(v.quantidade) >> from correg.valor v >> join correg.raf r on >> r.id = v.fk_raf >> join rh.orgaoexecucao oe on >> oe.fk_orgao = r.fk_tmporgaoexecucao >> join rh.orgaoadministracao oa on >> oa.id = oe.fk_orgaoadministracao >> join rh.comarca cx on >> cx.id = oa.fk_comarca >> where >> v.fk_campo = c.id and >> (r.data between ' || data_inicial || ' and ' || data_final >> || ') and >> ' || membro || ' >> ' || orgexecucao || ' >> r.excluido is false >> ) as quantidade >> into subtotal >> from correg.campo c >> where >> c.excluido is false and >> c.fk_modelo = ' || cod_resolucao || ' >> and c.id = ' || cod_campos[i] || ';'; >> >> /*vai construindo o valor total*/ >> total := total + subtotal; >> end loop; >> >> /*retorna a soma dos codigos:*/ >> return total; >> END; >> $BODY$ >> LANGUAGE 'plpgsql' VOLATILE; >> ALTER FUNCTION correg.somatorio_correicao(integer, integer, integer, date, >> date, integer[]) OWNER TO postgres; > > O banco de dados aceita o codigo acima sem acusar nenhum tipo de problema, > mas quando tento executar a query abaixo no pgadmin: > >> select correg.somatorio_correicao(2, 0, 0, date '2009-10-01', date >> '2009-11-01', array[1097,1098,1099,1100,1101,1102]); > > O console de mensagens me retorna o seguinte erro: > >> ERROR: EXECUTE of SELECT ... INTO is not implemented yet >> CONTEXT: PL/pgSQL function "somatorio_correicao" line 30 at execute >> statement >> >> >> ********** Erro ********** >> >> ERROR: EXECUTE of SELECT ... INTO is not implemented yet >> SQL state: 0A000 >> Contexto: PL/pgSQL function "somatorio_correicao" line 30 at execute >> statement > > A linha 30 está localizada antes do comentário: /*varredura no array:*/ > > A versão do banco que utilizo é a 8.1, creio que o comando EXECUTE não seja > compatível com esta versão, alguém conhece alguma alternativa para o código > acima? >
Utilize o INTO no EXECUTE e não no SELECT: EXECUTE 'SELECT ....' INTO ...; e não EXECUTE 'SELECT... INTO...'; Diferença sutil aonde se aplica o INTO. execute 'select (select sum(v.quantidade) from correg.valor v join correg.raf r on r.id = v.fk_raf join rh.orgaoexecucao oe on oe.fk_orgao = r.fk_tmporgaoexecucao join rh.orgaoadministracao oa on oa.id = oe.fk_orgaoadministracao join rh.comarca cx on cx.id = oa.fk_comarca where v.fk_campo = c.id and (r.data between ' || data_inicial || ' and ' || data_final || ') and ' || membro || ' ' || orgexecucao || ' r.excluido is false ) as quantidade from correg.campo c where c.excluido is false and c.fk_modelo = ' || cod_resolucao || ' and c.id = ' || cod_campos[i] || ';' into subtotal; Osvaldo _______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral