Valeu galera,

Já entendi os exemplos, vou implementar a solução agora. Podem fechar o
tópico!

Grato,
Daniel

2009/11/18 Wolak <wo...@wolaksistemas.com.br>

>  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 <wo...@wolaksistemas.com.br>
>
>> 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: wo...@wolaksistemas.com.br
>>
>>
>>
>>
>>
>>
>> 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 
>> listpgbr-ge...@listas.postgresql.org.brhttps://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
>> pgbr-geral@listas.postgresql.org.br
>> 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 
> listpgbr-ge...@listas.postgresql.org.brhttps://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
> pgbr-geral@listas.postgresql.org.br
> 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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a