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

Responder a