|
Вопрос по древовидной структуре
|
|||
---|---|---|---|
#18+
Есть древовидня структура таблицы TO_VINOVNIK : ( ID INTEGER DEFAULT 0 NOT NULL, PARENT_ID INTEGER DEFAULT 0 NOT NULL, LEVEL_ID INTEGER DEFAULT 0 NOT NULL, VINOVNIK VARCHAR(30) NOT NULL ) Есть процедура, которая выдает список всех дочерних элементов, рекурсивная : (В Interbase) CREATE PROCEDURE TO_VINOVNIK_GET_CHILDREN ( VINOVNIK_ID INTEGER ) RETURNS ( ID INTEGER ) AS DECLARE VARIABLE ID1 INTEGER; DECLARE VARIABLE CHILDCOUNT INTEGER; BEGIN SELECT COUNT(*) FROM TO_VINOVNIK WHERE PARENT_ID=:VINOVNIK_ID INTO :CHILDCOUNT; IF (CHILDCOUNT=0) THEN BEGIN ID=VINOVNIK_ID; SUSPEND; END ELSE BEGIN FOR SELECT ID FROM TO_VINOVNIK WHERE PARENT_ID=:VINOVNIK_ID INTO :ID DO BEGIN FOR SELECT ID FROM TO_VINOVNIK_GET_CHILDREN(:ID) INTO :ID1 DO BEGIN ID=ID1; SUSPEND; END END END END Как написать такую процедуру на Оракле? Уже бьюсь второй день, никак не выходит, помогите... Вот что написал: type cd1 is record (id integer); TYPE CD IS REF CURSOR return cd1; FUNCTION TO_VINOVNIK_GET_CHILDREN (p_VINOVNIK_ID IN INTEGER) RETURN CD AS ID INTEGER; ID1 INTEGER; c1 cd; c2 cd; CHILDCOUNT INTEGER; CURSOR v_cur (p_VINOVNIK_ID IN INTEGER) is select ID from TO_VINOVNIK WHERE PARENT_ID=p_VINOVNIK_ID; BEGIN SELECT COUNT(*) INTO CHILDCOUNT FROM TO_VINOVNIK WHERE PARENT_ID=p_VINOVNIK_ID; IF (CHILDCOUNT=0) THEN begin open c1 for select ID from TO_VINOVNIK WHERE ID=p_VINOVNIK_ID; RETURN C1; END; ELSE BEGIN OPEN V_CUR(p_VINOVNIK_ID); LOOP FETCH V_cur INTO ID; C2:=TO_VINOVNIK_GET_CHILDREN(ID); EXIT when v_cur%NOTFOUND; END loop; RETURN C2; END; END IF; END TO_VINOVNIK_GET_CHILDREN; Но эта процедура выдает не все значения, а только с последнего прохода. Но как сделать чтобы выдать весь список?, т.е. добавлять данные в открытый курсор, а потом его вернуть? Буду благодарен за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2002, 13:49 |
|
Вопрос по древовидной структуре
|
|||
---|---|---|---|
#18+
Предлагаю не создавать такую процедуру, а использовать возможности Oracle по работе с иерархическими запросами через использование в SELECT фразы CONNECT BY. В этом случае нужно в таблице иметь id потомка в качестве PK и id_parent родителя. Поле id_parent должно содержать не уровень, а значение id соответствующего родителя ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2002, 14:01 |
|
Вопрос по древовидной структуре
|
|||
---|---|---|---|
#18+
К слову, только недавно показали: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Прикол в поле prior_name: элемент атрибут родительской записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2002, 18:27 |
|
|
start [/forum/topic.php?fid=52&msg=32074615&tid=1992580]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
2ms |
others: | 326ms |
total: | 580ms |
0 / 0 |