powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по древовидной структуре
3 сообщений из 3, страница 1 из 1
Вопрос по древовидной структуре
    #32074605
Kostik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть древовидня структура таблицы 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;
Но эта процедура выдает не все значения, а только с последнего прохода.
Но как сделать чтобы выдать весь список?, т.е. добавлять данные в открытый курсор, а потом его вернуть? Буду благодарен за помощь.
...
Рейтинг: 0 / 0
Вопрос по древовидной структуре
    #32074615
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю не создавать такую процедуру, а использовать возможности Oracle по работе с иерархическими запросами через использование в SELECT фразы CONNECT BY. В этом случае нужно в таблице иметь id потомка в качестве PK и id_parent родителя. Поле id_parent должно содержать не уровень, а значение id соответствующего родителя
...
Рейтинг: 0 / 0
Вопрос по древовидной структуре
    #32074821
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову, только недавно показали:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table test (
    test_id integer
  , name varchar2( 64 )
  , parent_id integer
  , constraint pk_test primary key (test_id)
  , constraint fk_test_self foreign key (parent_id) references test (test_id)
)
/

insert into test (test_id, name, parent_id) values ( 1 , 'One', null);
insert into test (test_id, name, parent_id) values ( 2 , 'Two',  1 );

commit;

select t.test_id
     , t.name
     , prior t.name prior_name
from test t
connect by prior t.test_id = t.parent_id
start with t.parent_id is null
/


Прикол в поле prior_name: элемент атрибут родительской записи.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по древовидной структуре
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]