2009/11/18 Daniel Falcão <[email protected]>:
> 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
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral