| 
 
	
		| Предыдущая тема :: Следующая тема |  
		| Автор | Сообщение |  
		| Псевдоним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;
 | 
 | 
 Ностальгия... я так же писала лет так ...дцать назад...
 |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 
 |  |