Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

arpug by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group