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

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

pgsql-es-ayuda by date

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

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