Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Como Ordenar Arbol o secciones anidadas en funcion

Estas en el tema de Como Ordenar Arbol o secciones anidadas en funcion en el foro de Oracle en Foros del Web. Estoy tratando de armar un listado de secciones anidadas, donde los hijos quiero ordenarlos por el campo orden y no por el id de cracion. ...
  #1 (permalink)  
Antiguo 07/09/2006, 14:13
 
Fecha de Ingreso: agosto-2003
Mensajes: 203
Antigüedad: 21 años, 3 meses
Puntos: 0
Como Ordenar Arbol o secciones anidadas en funcion

Estoy tratando de armar un listado de secciones anidadas, donde los hijos quiero ordenarlos por el campo orden y no por el id de cracion. Logre hacerlo a traves de un query pero cuando lo coloco en una funcion me tira error. el codigo del query es
Código:
SELECT s.id_seccion AS id_seccion,
	   ordenS,
       LPAD ('-', (s.nivel - 1) * 1, '-') || s.nombre AS nombrearbol,
       s.fk_id_modulo AS fk_id_modulo,
       CASE (s.habilitado)
          WHEN '1'
             THEN 'Si'
          ELSE 'No'
       END AS habilitado
  FROM (SELECT     s1.*, itf.orden as ordenS, LEVEL AS nivel
              FROM secciones s1 LEFT JOIN items_front itf
                   ON itf.fk_id_seccion = s1.id_seccion
             WHERE s1.borrado = '0'
        CONNECT BY PRIOR s1.id_seccion = s1.fk_id_seccion
        START WITH s1.fk_id_seccion IS NULL
          ORDER SIBLINGS BY ordenS) s
y en la funcion me dice que el ORDER SIBLINGS BY no es valido

Necesitaria saber si es posible usar el SIBLINGS dentro de las funciones y de que forma y si no alguna opcion para poder ordenar los hijos por el campo que yo desee.
dejo tambien el codigo de la funcion

Gracias

Código:
CREATE OR REPLACE FUNCTION get_arbol_secciones_back
RETURN secciones_back_type_table PIPELINED AS
v_MyType secciones_back_type;
BEGIN
FOR recMenu IN (
SELECT s.id_seccion AS id_seccion,
	   ordenS,
       LPAD ('-', (s.nivel - 1) * 1, '-') || s.nombre AS nombrearbol,
       s.fk_id_modulo AS fk_id_modulo,
       CASE (s.habilitado)
          WHEN '1'
             THEN 'Si'
          ELSE 'No'
       END AS habilitado
  FROM (SELECT     s1.*, itf.orden as ordenS, LEVEL AS nivel
              FROM secciones s1 LEFT JOIN items_front itf
                   ON itf.fk_id_seccion = s1.id_seccion
             WHERE s1.borrado = '0'
        CONNECT BY PRIOR s1.id_seccion = s1.fk_id_seccion
        START WITH s1.fk_id_seccion IS NULL
          ORDER SIBLINGS BY ordenS) s

   ) LOOP
v_MyType := secciones_back_type(recMenu.id_seccion, recMenu.nombrearbol, recMenu.fk_id_modulo, recMenu.habilitado);
PIPE ROW(v_MyType);
END LOOP;
RETURN;
END get_arbol_secciones_back;
  #2 (permalink)  
Antiguo 07/09/2006, 17:32
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 11 meses
Puntos: 11
He visto tu codigo y la verdad como no conozco la estructura de las tablas y la relacion de ellas (foreign key) no te he entendido muy bien el codigo; sobre todo en el SELECT interno donde haces el LEFT JOIN.

Supongo que lo que deseas crear es una seleccion de valores basada en una posicion jerarquica por lo del Siblings. mira este articulo de la documentacion.

Si prefieres nos das la estructura de las tablas, sus primary key, foreign key y la relacion mencionando que es lo que deseas obtener entre ellas y vemos como te ayudamos con el codigo
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #3 (permalink)  
Antiguo 08/09/2006, 08:43
 
Fecha de Ingreso: agosto-2003
Mensajes: 203
Antigüedad: 21 años, 3 meses
Puntos: 0
Tablas

Gracias por contestar
Te paso los datos de la tabla, reducidos para que no ocupen tanto
La idea del left join es porder traer el orden, y la estructura del menu en items_front

Código:
CREATE TABLE SECCIONES
(
  ID_SECCION     INTEGER                        NOT NULL,
  FK_ID_MODULO   INTEGER,
  FK_ID_SECCION  INTEGER,
  NOMBRE         VARCHAR2(50 BYTE)              NOT NULL,
  BORRADO        CHAR(1 BYTE)                   DEFAULT 0                     NOT NULL,
  HABILITADO     CHAR(1 BYTE)                   DEFAULT 1                     NOT NULL
)

CREATE UNIQUE INDEX PK_SECCIONES_ECCIONES_PKEY ON SECCIONES (ID_SECCION)

CREATE OR REPLACE TRIGGER swt_secciones_id
  BEFORE INSERT ON secciones
  REFERENCING NEW AS NEW OLD AS OLD
  FOR EACH ROW
WHEN (
NEW.id_seccion is null
      )
BEGIN
  SELECT secciones_id_seccion_seq.NEXTVAL INTO :NEW.id_seccion FROM DUAL;
END;

ALTER TABLE SECCIONES ADD (
 CONSTRAINT PK_SECCIONES_ECCIONES_PKEY
 PRIMARY KEY (ID_SECCION)

ALTER TABLE SECCIONES ADD (
 CONSTRAINT FK_SECCIONES_K_ID_MODULO 
 FOREIGN KEY (FK_ID_MODULO) 
 REFERENCES MODULOS (ID_MODULO));

ALTER TABLE SECCIONES ADD (
 CONSTRAINT FK_SECCIONES_K_ID_SECCION 
 FOREIGN KEY (FK_ID_SECCION) 
 REFERENCES SECCIONES (ID_SECCION));
Código:
CREATE TABLE ITEMS_FRONT
(
  ID_ITEM_FRONT     INTEGER                     NOT NULL,
  FK_ID_ITEM_FRONT  INTEGER,
  NOMBRE            VARCHAR2(50 BYTE)           NOT NULL,
  HABILITADO        CHAR(1 BYTE)                DEFAULT 1                     NOT NULL,
  BORRADO           CHAR(1 BYTE)                DEFAULT 0                     NOT NULL,
  FK_ID_APLICACION  INTEGER,
  FK_ID_SECCION     INTEGER,
  ORDEN             INTEGER                     NOT NULL,
  MENU_FRONT        CHAR(1 BYTE)                DEFAULT 1                     NOT NULL
)


CREATE UNIQUE INDEX PKITEMSFRONTTEMSMENUFRONTPKEY ON ITEMS_FRONT (ID_ITEM_FRONT)


CREATE UNIQUE INDEX UNIQUEFKIDSECCIONFKIDAPLICACIO ON ITEMS_FRONT (FK_ID_APLICACION, FK_ID_SECCION)


CREATE OR REPLACE TRIGGER swt_items_front_id
  BEFORE INSERT ON items_front
  REFERENCING NEW AS NEW OLD AS OLD
  FOR EACH ROW
WHEN (
NEW.id_item_front is null
      )
BEGIN
  SELECT item_front_seq.NEXTVAL INTO :NEW.id_item_front FROM DUAL;
END;

ALTER TABLE ITEMS_FRONT ADD (
 CONSTRAINT PKITEMSFRONTTEMSMENUFRONTPKEY
 PRIMARY KEY
 (ID_ITEM_FRONT)


ALTER TABLE ITEMS_FRONT ADD (
 CONSTRAINT FK_ITEMS_FRONT_K_ID_APLICACION 
 FOREIGN KEY (FK_ID_APLICACION) 
 REFERENCES APLICACIONES (ID_APLICACION));

ALTER TABLE ITEMS_FRONT ADD (
 CONSTRAINT FK_ITEMS_FRONT_K_ID_ITEM_FRONT 
 FOREIGN KEY (FK_ID_ITEM_FRONT) 
 REFERENCES ITEMS_FRONT (ID_ITEM_FRONT));

ALTER TABLE ITEMS_FRONT ADD (
 CONSTRAINT FK_ITEMS_FRONT_K_ID_SECCION 
 FOREIGN KEY (FK_ID_SECCION) 
 REFERENCES SECCIONES (ID_SECCION));

Última edición por lenz; 08/09/2006 a las 08:44 Razón: me equivoque en un nombre de tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:39.