From: | Emanuel Calvo Franco <postgres(dot)arg(at)gmail(dot)com> |
---|---|
To: | Gustavo Vaccaro <gustavo_vaccaro(at)fibertel(dot)com(dot)ar> |
Cc: | arpug(at)postgresql(dot)org |
Subject: | Re: Llamadas recursivas en funciones de Base de Datos |
Date: | 2011-02-18 15:27:33 |
Message-ID: | AANLkTim3-vTLov71+qP80YuaWJ+cnNLsGc5LYVEOmEN_@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | arpug |
El día 18 de febrero de 2011 15:55, Gustavo Vaccaro
<gustavo_vaccaro(at)fibertel(dot)com(dot)ar> escribió:
> Encontre una solucion:
> en lugar de declarar un cursor use FOR
>
Y de performance? Va mejor o peor?
(debería ser mejor en este caso)
> ******************************
> 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/
>
>
--
--
Emanuel Calvo
Helpame.com
From | Date | Subject | |
---|---|---|---|
Next Message | Gustavo Vaccaro | 2011-02-18 15:31:37 | Re: Llamadas recursivas en funciones de Base de Datos |
Previous Message | Gustavo Vaccaro | 2011-02-18 14:55:38 | Re: Llamadas recursivas en funciones de Base de Datos |