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