Exemplo...

CREATE OR REPLACE FUNCTION fnc.codigotabela(pnTipoCodigo  INTEGER,
                                                           pcNomeCampo      VARCHAR,
                                                           pcTabela          VARCHAR,
                                                           pcValorCodigo VARCHAR)
RETURNS VARCHAR AS
$$
DECLARE
   rResultado RECORD;
BEGIN
    BEGIN
        IF pnTipoCodigo = 1 THEN
            IF COALESCE(pcValorCodigo,'0') = '0' THEN
                FOR rResultado IN EXECUTE 'SELECT MAX('||pcNomeCampo||'::INTEGER) AS codigo FROM '||pcTabela||' WHERE uk = fnc.regranegocio('||QUOTE_LITERAL(pcTabela)||','||pcTabela||'.fkempresa,'||pcTabela||'.fkfilial,'||pcTabela||'.fkunidade);' LOOP
                END LOOP;
                RETURN COALESCE(rResultado.codigo,0)+1;
            END IF;
            RETURN pcValorCodigo;
        ELSIF pnTipoCodigo = 2 THEN
            FOR i IN 1..LENGTH(pcValorCodigo) LOOP
                IF POSITION(SUBSTRING(pcValorCodigo,i,1) IN '1234567890') = 0 THEN
                    RAISE EXCEPTION 'Código inválido!';
                END IF;
            END LOOP;
            RETURN pcValorCodigo;
        ELSE
            RETURN pcValorCodigo;
        END IF;
        EXCEPTION WHEN others THEN RAISE EXCEPTION 'Código inválido!';
    END;
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;




Daniel Falcão escreveu:
Hum... é verdade, o problema está no INTO. Estava consultando a documentação agora pouco, mas não estou encontrando bons exemplos para contornar isso. Alguém aí pode me dar uma ajuda com esse "FOR IN EXECUTE" no contexto do problema dessa minha procedure?

Grato,
Daniel

2009/11/18 Wolak <[email protected]>
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




--
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