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