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

Как написать такую процедуру?
...
Рейтинг: 0 / 0
19.07.2004, 04:03:00
    #32609755
StepIt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
Рекурсия есть зато.... )))
...
Рейтинг: 0 / 0
19.07.2004, 05:24:02
    #32609758
Mike Evteev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
А какова вложенность? ;-)
...
Рейтинг: 0 / 0
19.07.2004, 09:53:41
    #32609893
Winni-Pooh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
У меня работает при 10 уровнях.
...
Рейтинг: 0 / 0
19.07.2004, 11:13:06
    #32610096
mv
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
19.07.2004, 13:19:30
    #32610438
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
На юниксах вложенность 1000, на винде порядка 750 уровней. Как-то давно Д. Еманов говорил что может вынесут ограничение по глубине в конфигурационный файл, но так и не вынесли :-(
...
Рейтинг: 0 / 0
19.07.2004, 13:22:06
    #32610449
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
Даже трудно представить, когда нужно больше...
...
Рейтинг: 0 / 0
19.07.2004, 16:24:40
    #32611058
d'Evil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
Большую часть рекурсий с успехом можно заменить на цикл. Обход дерева не исключение. Все зависит от структуры данных.
...
Рейтинг: 0 / 0
19.07.2004, 16:25:53
    #32611061
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
А ну, давай.
...
Рейтинг: 0 / 0
19.07.2004, 16:53:12
    #32611122
Mike Evteev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
Structure is simple. Table has just one parent_id field.
...
Рейтинг: 0 / 0
19.07.2004, 16:55:58
    #32611131
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
Да пусть джаст ван! Ты алгоритм давай! Симпл, понимаешь.
...
Рейтинг: 0 / 0
19.07.2004, 19:33:39
    #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
19.07.2004, 23:09:51
    #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
20.07.2004, 07:29:09
    #32611654
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод вложенных иерархий.
Да... что- то у меня напутано. Иду читать книжки.
...
Рейтинг: 0 / 0
20.07.2004, 21:15:12
    #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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод вложенных иерархий. / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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