On Thu, Apr 25, 2013 at 8:11 AM, izaque Maciel <izaquemac...@gmail.com>wrote:
> Bom dia pessoal, não consegui concluir esta procedure pela questão do > retorno, que tem que me retornar todos os campos do "último select" abaixo, > e com o retorno deste último select, criarei outra stored procedure para > pegar o retorno dessa e trabalharei alguns cálculos. Peço a ajuda de vocês, > obrigado. > > > CREATE OR REPLACE FUNCTION public.retorna_valores_go ( > id_emolumento numeric(12,2), > dt_calculo_emol date, > valor_documento numeric(12,2) > ) > RETURNS SETOF numeric AS > $body$ > DECLARE > > vidEmolumento numeric(12,2); > vidVigencia numeric(12,2); > vidEmolItens numeric(12,2); > regEmolItens record; > BEGIN > > -- Verifica se existe o emolumento > select e.id into vidEmolumento > from emolumentos e > where e.id = id_emolumento; > > -- Se encontrado, localiza a vigência > if (videmolumento is not null) then > begin > select v.id into vidvigencia > from vigencia v > where dt_calculo_emol between v.dt_inicial and v.dt_final; > > -- Se econtrada a vigência, localiza o emolumento pelo valor > if (vidvigencia is not null) then > select e.id into videmolitens > from emolumentos_itens e > where valor_documento between e.fx_valor_final and e.fx_valor_final; > end if; > > -- Se foi localizado o emolumento > if (videmolitens is not null) then > select e.id into videmolitens > from emolumentos_itens e > where e.id_emolumentos = videmolumento and > e.id_vigencia = vidvigencia and > e.fx_valor_inicial = 0 and > e.fx_valor_final = 0; > end if; > > if (videmolitens is not null) then > begin > select e.id, > e.id_emolumentos, > e.fx_valor_inicial, > e.fx_valor_final, > e.valor_emolumento, > e.tx_jud, > e.fundesp, > e.valor2, > e.valor3, > e.valor4, > e.valor5, > e.outras_despesas, > e.pag_extra_inicio, > e.valor_pag_extra, > e.fundo_pag_extra, > e.tx_jud_pag_extra, > e.cod_tab_correg, > e.cod_interno, > e.calc_txjud, > e.calc_fundesp, > e.calc_valor2, > e.calc_valor3, > e.calc_valor4, > e.calc_valor5, > e.calc_pagina_extra into regEmolItens > from emolumentos_itens e > where valor_documento between e.fx_valor_final and e.fx_valor_final; > > return regEmolItens; > end; > end if; > end; > end if; > > > END > $body$ > LANGUAGE 'plpgsql' > VOLATILE > CALLED ON NULL INPUT > SECURITY INVOKER > COST 100; > > > Cara, olhando sua função meio por cima, me parece que toda essa bagunça seria resolvida simples e unicamente com um SELECT (sem nem ao menos a necessidade de função). Recomendo você a estudar sobre JOIN (ou junções), que *é* a solução do seu problema. Da forma como está aí, fica, sem dúvida, com uma performance ruim e bem difícil de manter. Recomendaria também você ir atrás de um curso sobre SQL e funções (nesse caso específico do PostgreSQL), poderia ajudar bastante. Se você explicar melhor o que pretende e um pouco do modelo, talvez possamos ajudar mais. Desse jeito fica difícil. Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral