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

Re: Funcion recursiva

From: Oswaldo Hernández <listas(at)soft-com(dot)es>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Funcion recursiva
Date: 2007-10-25 18:36:52
Message-ID: 4720E244.9060505@soft-com.es (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Javier Castro Narváez escribió:
>  Hola,
> 
> A ver si me podéis echar una manita y orientarme un poco a la hora de
> realizar una función recursiva.
> Dada una tabla con la siguiente estructura:
> 
> CREATE TABLE caracteristicas
> (
>   id serial NOT NULL,  
>   id_padre integer NOT NULL DEFAULT 0,
>   nombre character varying(50) NOT NULL,  
>   CONSTRAINT caracteristicas_pkey PRIMARY KEY (id)
> ) 
> WITH OIDS;
> ALTER TABLE caracteristicas OWNER TO "nfqPeople";
> GRANT ALL ON TABLE caracteristicas TO "nfqPeople";
> 
> Que almacena por ejemplo la siguiente información estructurada de forma
> arbórea:
> 
> 1;"Color de Ojos";0
> 2;"Negros";1
> 3;"Azules";1
> 4;"Verdes";1
> 6;"Marrones";1
> 7;"Color de Pelo";0
> 8;"Rubio";7
> 9;"Moreno";7
> 10;"Castaño";7
> 11;"Pelirrojo";7
> 12;"Complexión";0
> 13;"Fuerte";12
> 14;"Delgado/a";12
> 15;"Corpulento";12
> 16;"Muy delgado/a";12
> 17;"Gordo";12
> 
> Lo que quiero es que la función recorra una deteterminada rama del árbol y
> me devuelva una cadena con el resultado en función de un identificador que
> se le pase. P.E. Caracteristica(11) me devolvería: "Color de Pelo ->
> Pelirrojo"
> 

Esta es la que me hize para un caso similar, no hay problema de nº de anidamientos, recorre todo el 
arbol hacia atras hasta encontrar el root. Adaptatela a tus necesidades.


CREATE OR REPLACE FUNCTION grupo_get_path(nodo scid) RETURNS "varchar" AS
$BODY$
declare
	v_ruta		varchar := '';
	v_irec		record;
begin
	select into v_irec * from grupos_nodos where idnodo = nodo;
	if not found then
		raise exception 'Grupo nº % desconocido.', nodo;
	end if;
	v_ruta := v_ruta || v_irec.descripcion;
	if not v_irec.contenido_en is null then
		v_ruta := grupo_get_path(v_irec.contenido_en) || ' / ' || v_ruta;
	end if;
	return v_ruta;

end
$BODY$
LANGUAGE 'plpgsql' VOLATILE;




-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************

In response to

pgsql-es-ayuda by date

Next:From: usuario anonimoDate: 2007-10-25 19:07:59
Subject: Re: Instalar en Servidor y en Cliente
Previous:From: MIGUEL CANCHASDate: 2007-10-25 17:48:22
Subject: Instalar en Servidor y en Cliente

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