RE: Funcion recursiva

From: Javier Castro Narváez <javier(dot)castro(at)enfoque-si(dot)com>
To: "'Diego Gil'" <listas(at)adminsa(dot)com>, "'omar neyra'" <xomarx69(at)gmail(dot)com>, 'Oswaldo Hernández' <listas(at)soft-com(dot)es>
Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Funcion recursiva
Date: 2007-10-26 08:23:12
Message-ID: !&!AAAAAAAAAAAYAAAAAAAAAKkeBIzMwzBIvVXVb9Vr3p/izwwAEAAAACo9QW1dNTRDvkH/+she/3YBAAAAAA==@enfoque-si.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

> -----Mensaje original-----
> De: pgsql-es-ayuda-owner(at)postgresql(dot)org
> [mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de Diego Gil
> Enviado el: jueves, 25 de octubre de 2007 23:44
> Para: omar neyra
> CC: javier(dot)castro(at)enfoque-si(dot)com; pgsql-es-ayuda(at)postgresql(dot)org
> Asunto: Re: [pgsql-es-ayuda] Funcion recursiva
>
> 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;
>
>
> --
> TIP 3: Si encontraste la respuesta a tu problema, publcala,
> otros te lo agradecern
>

Pues bien... Ya la tengo.... Gracias a todos por vuestra valiosa ayuda. Con
vosotros da gusto.

Al final me he decantado por no utilizar una función recursiva, ya que los
tiempos de respuesta son iguales y evito el problema de la pila.

Os dejo la función tal y como la he realizado:

CREATE OR REPLACE FUNCTION get_caracteristica(nodo integer, separador
character varying)
RETURNS character varying AS
$BODY$

DECLARE registro RECORD;
DECLARE caracteristica VARCHAR;
DECLARE tmp_id_padre INTEGER;

BEGIN
tmp_id_padre = nodo;
LOOP
select into registro id, id_padre, nombre from
caracteristicas where id = tmp_id_padre;
IF NOT FOUND THEN
EXIT;
END IF;
tmp_id_padre := registro.id_padre;
IF caracteristica IS NULL THEN
caracteristica := registro.nombre;
ELSE
caracteristica := registro.nombre || separador ||
caracteristica;
END IF;
IF tmp_id_padre = 0 THEN
EXIT;
END IF;
END LOOP;
RETURN caracteristica;
END

$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION get_caracteristica(nodo integer, separador character varying)
OWNER TO postgres;

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Henry 2007-10-26 15:27:04 RE: Sobre Slony-I
Previous Message rtfernandez 2007-10-26 02:10:01 Sobre Slony-I