powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод вложенных иерархий.
15 сообщений из 15, страница 1 из 1
Вывод вложенных иерархий.
    #32609753
Mike Evteev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположим у меня есть структура компании.
Манагеры, подчиненные.
Нужно вывести всех подчиненных, даже если они находятся многими уровнями ниже из процедуры.
В FB нет временных таблиц как в MS SQL или Oracle. Нет select connect by.

Как написать такую процедуру?
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32609755
StepIt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсия есть зато.... )))
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32609758
Mike Evteev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какова вложенность? ;-)
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32609893
Winni-Pooh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня работает при 10 уровнях.
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32610096
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В InterBase 6 было:

Stored procedures can be nested up to 1,000 levels deep. This limitation helps to prevent infinite loops that can occur when a recursive procedure provides no absolute terminating condition. Nested procedure calls may be restricted to fewer than 1,000 levels by memory and stack limitations of the server.
Надо полагать, что в FireBird не меньше.
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32610438
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На юниксах вложенность 1000, на винде порядка 750 уровней. Как-то давно Д. Еманов говорил что может вынесут ограничение по глубине в конфигурационный файл, но так и не вынесли :-(
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32610449
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже трудно представить, когда нужно больше...
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32611058
d'Evil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большую часть рекурсий с успехом можно заменить на цикл. Обход дерева не исключение. Все зависит от структуры данных.
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32611061
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну, давай.
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32611122
Mike Evteev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Structure is simple. Table has just one parent_id field.
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32611131
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да пусть джаст ван! Ты алгоритм давай! Симпл, понимаешь.
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32611444
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рекурсивно, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure Вывод_Поддерева( ID )
returns ( ID, чего-то там еще... )
as
begin
   берем данные текущего ID и чего-то там еще;
   suspend;
   IDchild = null
   for select ID  тех записей, у которых id_parent=:ID 
   into  :IDchild  
   do begin
      if (IDchild not null)
      then Вывод_Поддерева( IDchild )      
   end;
end;

Т.е. сначала выводим текущую запись, потом находим ее детей, и для них используем ту же процедуру.

Для ID у которых нет детей, цикл for select не будет выполняться.
Очень может быть, что в задании IDchild = null и последующей проверке нет необходимости, но на всякий случай...
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32611574
Mike Evteev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I guess there must be one more suspend in loop for children.
Ok.
I'm familiar with recursion, but thiught, that may be something changed in IB, from last time when i've saw it.
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32611654
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да... что- то у меня напутано. Иду читать книжки.
...
Рейтинг: 0 / 0
Вывод вложенных иерархий.
    #32613694
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set term !!;

create or alter procedure connect_by_prior (
Table_Name varchar(32),
Pk varchar(32), /* parent rows name /connect by prior/ */
Fk varchar(32), /* child rows name /connect by prior/ */
Start_With varchar(256), /* Start condition, for example: 'ref_to_id=0' */
Order_by varchar(256), /* Fields names, comma separated; or <NULL> */
Level_In decimal(18,0) /* In first call binding <NULL> */
/* Example: select * from connect_by_prior('project','id','ref_to_id','ref_to_id=0',null,null); */
)
returns (
Id decimal(18,0),
Tree_Level decimal(18,0))
as
declare d_start_with varchar(256);
declare i decimal(18,0);
begin

if (Level_In is null) then
Level_In = 0;
Tree_Level = Level_in;

For execute statement
'select '||pk||' from '||table_name||' where '||start_with||
case
when order_by is null then ''
else ' order by '||order_by
end || ''
into :id
do begin
suspend;
d_start_with = fk || '=' || id;
i = Tree_Level;
For select id, tree_level
from connect_by_prior(:table_name, :pk, :fk, :d_start_with, :order_by, (:tree_level+1))
into :id, :tree_level
do suspend;
tree_level = i;
end
end !!

set term ; !!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод вложенных иерархий.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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