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