Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Псевдоним123 Участник - экстремал
Вступление в Клуб: 05.06.2018
|
Пн Авг 06, 2018 18:00  цикл |
|
Полезность: Нет оценки
|
добрый день.
не подскажете, почему цикл проходит только один круг?
Код: | l_high := p_kode;
for
(select tt(tt.[name] : tt_name
, tt.[high] : tt_high
--, tt.[]
)
in [depart] all where /*tt.[high] is null and*/ /*tt.[ code] is not null and*/ tt%id = l_high
)
loop
l_high := tt.[tt_high];
l_name := l_name || ' ' || tt.[tt_name];
end loop; |
|
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Пн Авг 06, 2018 18:02   |
|
Полезность: Нет оценки
|
если тебе нужен иерархический seleсt то должны быть условия start with ..
,connect by ...
поищи примеры в админе словаря по этим ключевым словам |
|
 |
Псевдоним123 Участник - экстремал
Вступление в Клуб: 05.06.2018
|
Вт Авг 07, 2018 10:48   |
|
Полезность: Нет оценки
|
мне необходимо показать полный "путь" от подразделения до ОО/филиала.
цикл почему-то отображает только одну родительскую запись |
|
 |
lexus Профи
Вступление в Клуб: 28.09.2007
|
Вт Авг 07, 2018 11:27   |
|
Полезность: Нет оценки
|
Посмотри по F12.
У тебя сначала курсор открывается с исходным значением l_high. И потом только данные выбираются.
А то, что потом изменяешь его значение, на курсор уже не влияет. |
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Ср Авг 08, 2018 06:10   |
|
Полезность: 2
|
Псевдоним123 пишет: | мне необходимо показать полный "путь" от подразделения до ОО/филиала. |
Вот с этого и надо начинать! Формулировка цели - первое дело.
Псевдоним123 пишет: | цикл почему-то отображает только одну родительскую запись |
используем иерархический запрос.
1. для иллюстрации как работает иерархический запрос, посмотрим все записи
Код: |
select level, c_code, id, c_high, SYS_CONNECT_BY_PATH(id, '/')
from z#depart
start with id = l_high
connect by prior c_high = id
|
2. Ну и поскольку тебе нужна только одна запись, то итоговый запрос станет таким:
Код: |
select SYS_CONNECT_BY_PATH(id, '/')
from z#depart
where c_high is null
start with id = l_high
connect by prior c_high = id
|
того же эффекта можно добиться с помощью аналитической функции
Код: |
select
listagg(id, '/') within group (order by level)
from z#depart
start with id = l_high
connect by prior c_high = id
;
|
|
|
 |
Псевдоним123 Участник - экстремал
Вступление в Клуб: 05.06.2018
|
Ср Авг 08, 2018 09:13   |
|
Полезность: Нет оценки
|
вот так я сделал
Код: | while l_high is not null loop
select tt(tt.[name] : tt_name
, tt.[high] : tt_high
, tt%id : tt_id
)
in ::[depart]
where tt%id = l_high
into l_name1, l_high_id, l_idd;
l_id := l_idd;
l_high := l_high_id;
l_name := l_name || ' ' || name1;
end loop; |
|
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Ср Авг 08, 2018 10:06   |
|
Полезность: 1
|
Псевдоним123 пишет: | вот так я сделал
Код: | while l_high is not null loop
select tt(tt.[name] : tt_name
, tt.[high] : tt_high
, tt%id : tt_id
)
in ::[depart]
where tt%id = l_high
into l_name1, l_high_id, l_idd;
l_id := l_idd;
l_high := l_high_id;
l_name := l_name || ' ' || name1;
end loop; |
|
Ностальгия... я так же писала лет так ...дцать назад... |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|