Re: Funcion recursiva

From: Diego Gil <listas(at)adminsa(dot)com>
To: omar neyra <xomarx69(at)gmail(dot)com>
Cc: javier(dot)castro(at)enfoque-si(dot)com, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Funcion recursiva
Date: 2007-10-25 21:44:29
Message-ID: 1193348669.2936.19.camel@roadwarrior.maipucinos.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El jue, 25-10-2007 a las 17:36 -0300, omar neyra escribió:
> Hola a todos, a mi parecer no creo que utilizar una función recursiva
> sea la mejor opción, recuerden que este tipo de funciones almacenan
> una copia en la pila de la memoria cada ves que es llamada y esto
> puede provocar un quiebre en memoria (en el peor de los casos, que es
> el que se debe medir siempre que diseñamos algun algoritmo),
> Para este caso pienso que es mejor implementar un ciclo simple, algo
> como muestro a continuación;
>
> CREATE OR REPLACE FUNCTION ruta(raiz INTEGER) RETURNS "varchar" AS
> $BODY$
> declare
> ruta varchar := '';
> descripcionreturn varchar := '';
> begin
> LOOP
> select id_padre, descripcion from la_tabla where idraiz = raiz;
> raiz := 'el id_padre que retorna el select anterior';
> ruta := ruta || 'la descripcion obtenida en la consulta
> anterior';
> if raiz = 0 then
> return ruta; (o EXIT??)
> END IF;
> END LOOP;
> END;
> $BODY$
> LANGUAGE 'plpgsql';
>
>
> como se dieron cuenta, este algoritmo no es valido ya que faltan
> algunos pasos, lo que sucede es que recien estoy aprendiendo a usar
> postgres y aun no se como solucionar la parte de recuperar los campos
> obtenidos en la consulta, este algoritmo solo recupera un registro por
> cada consulta y no el set completo de registros como sucederia con
> cada llamada recursiva
> Creo que faltaria solucionar lo de la recuperacion instantanea de los
> campo y si se me algo, bueno, lo arreglamos!!
> --
> OMAR NEYRA RODRÍGUEZ
> Desarrollo y Soporte

Es como esto :

CREATE OR REPLACE FUNCTION testfunc(raiz integer)
RETURNS text AS
$BODY$
DECLARE
aux integer;
ruta varchar := '';
tmp_record RECORD;

BEGIN
aux := raiz;

LOOP
select into tmp_record id, id_padre, nombre
from caracteristicas
where id = aux;

IF NOT FOUND THEN
EXIT;
END IF;

aux := tmp_record.id_padre;
ruta := ruta || ' - ' || tmp_record.nombre;
if aux = 0 then
exit;
END IF;
END LOOP;
return ruta;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2007-10-25 22:05:28 Re: Funcion recursiva
Previous Message Martin Marques 2007-10-25 21:05:51 Re: [pgsql-es-ayuda] Migración desde 8.1.4 a 8.2.5