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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message usuario anonimo 2007-10-25 19:07:59 Re: Instalar en Servidor y en Cliente
Previous Message MIGUEL CANCHAS 2007-10-25 17:48:22 Instalar en Servidor y en Cliente