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;
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 |