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