O comando EXECUTE não trabalha com INTO... no seu caso a variavel SUBTOTAL... voce precisa executar o FOR IN EXECUTE...

Tenho exemplos se precisar.

Wolak.
Email/MSN: [email protected]






Daniel Falcão escreveu:
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?

Grato,
Daniel

--
Atenciosamente,
Daniel Falcão

Analista e Desenvolvedor de Software
http://lattes.cnpq.br/2208735579737258
http://embuar.blogspot.com
http://twitter.com/embuar

_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



__________ Information from ESET NOD32 Antivirus, version of virus signature database 4618 (20091118) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com

  


__________ Information from ESET NOD32 Antivirus, version of virus signature database 4618 (20091118) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a