Re: Llamadas recursivas en funciones de Base de Datos

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

In response to

Responses

Browse arpug by date

  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