Re: Llamadas recursivas en funciones de Base de Datos

From: Gustavo Vaccaro <gustavo_vaccaro(at)fibertel(dot)com(dot)ar>
To: arpug(at)postgresql(dot)org
Subject: Re: Llamadas recursivas en funciones de Base de Datos
Date: 2011-02-18 14:55:38
Message-ID: 4D5E886A.9000504@fibertel.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: arpug

Encontre una solucion:
en lugar de declarar un cursor use FOR

******************************
declare c_monto decimal(15,2);
declare s_recmov character(1);
declare s_cuenta character(25);
begin
c_monto=0;
select recmov into s_recmov from plancta where id_nroemp = arg_nroemp and
id_cuenta = arg_cuenta;
/* */
if s_recmov = 'S' then
select sum(case when arg_dh = 'D' then debe else haber end) into c_monto
from asiren,asicab where asiren.id_nroemp = arg_nroemp and
asiren.id_nroserie = arg_nroserie and asiren.id_cuenta = arg_cuenta and
asicab.fecha between(arg_fecdes) and(arg_fechas) and
asiren.id_nroemp = asicab.id_nroemp and asiren.id_nroserie =
asicab.id_nroserie and
asiren.id_nroasi = asicab.id_nroasi and asicab.anulado = 'N';
/**/
if c_monto is null then
c_monto=0;
end if;
else
==> for s_cuenta in select id_cuenta from plancta where id_nroemp =
arg_nroemp and id_ctamadre = arg_cuenta and id_cuenta <> id_ctamadre
order by id_cuenta asc loop
c_monto = c_monto +
fn_acumuxcuenta(arg_nroemp,arg_nroserie,s_cuenta,arg_fecdes,arg_fechas,arg_dh);
end loop;
end if;
/* */
return(c_monto);
end
******************************

Y problema solucionado.

Gustavo J. Vaccaro
http://www.gjv.com.ar

El 16/02/2011 12:44 p.m., Emanuel Calvo Franco escribió:
> El día 16 de febrero de 2011 14:21, Gustavo Vaccaro
> <gustavo_vaccaro(at)fibertel(dot)com(dot)ar> escribió:
>> Emanuel,
>> la funcion es recursiva porque necesito llamarla un numero variable de
>> veces.
>> Va recorriendo un plan de cuentas ordenado jerarquicamente y con la funcion
>> acumulo la rama inferior.
>> Esta funcion me funcionaba perfecto en Sybase. Al migrar a Postgres empezo
>> el problema.
>> Hasta ahora lo unico que se me ocurre es poder definir el cursor como
>> privado, pero no se como hacerlo.
>> Sino, voy a tener que escribir un bucle "loquisimo" como vos decis. Pero no
>> quiero llegar a esta instancia.
>> Saludos
>>
> Puedes usar advisory locks para saber que la funcion ya está en
> ejectución y que
> no habra otro cursor:
>
> http://blog.siu.edu.ar/blog/postgresql/2010/06/11/bloqueos-por-transaccion/
>

In response to

Responses

Browse arpug by date

  From Date Subject
Next Message Emanuel Calvo Franco 2011-02-18 15:27:33 Re: Llamadas recursivas en funciones de Base de Datos
Previous Message Emanuel Calvo Franco 2011-02-16 15:44:47 Re: Llamadas recursivas en funciones de Base de Datos