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 15:31:37
Message-ID: 4D5E90D9.50800@fibertel.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: arpug

No puedo compararlo en Postgres porque con Cursores no funcionaba.
Comparando Postgres vs Sybase me lleve la grata sorpresa que el rendimiento en
algunos caso resulto superior.
En general me parece que la aplicacion desarrollada con Powerbuilder 9, funciona
mucho mejor con Postgres que con Sybase.

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

El 18/02/2011 12:27 p.m., Emanuel Calvo Franco escribió:
> 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/
>>
>>
>
>

In response to

Browse arpug by date

  From Date Subject
Next Message Ezequiel Lovelle 2011-02-20 21:31:53 Consulta, select lento
Previous Message Emanuel Calvo Franco 2011-02-18 15:27:33 Re: Llamadas recursivas en funciones de Base de Datos