|
|
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
Предположим у меня есть структура компании. Манагеры, подчиненные. Нужно вывести всех подчиненных, даже если они находятся многими уровнями ниже из процедуры. В FB нет временных таблиц как в MS SQL или Oracle. Нет select connect by. Как написать такую процедуру? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 02:57:00 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
Рекурсия есть зато.... ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 04:03:00 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
А какова вложенность? ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 05:24:02 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
У меня работает при 10 уровнях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 09:53:41 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
В 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 не меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 11:13:06 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
На юниксах вложенность 1000, на винде порядка 750 уровней. Как-то давно Д. Еманов говорил что может вынесут ограничение по глубине в конфигурационный файл, но так и не вынесли :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 13:19:30 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
Даже трудно представить, когда нужно больше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 13:22:06 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
Большую часть рекурсий с успехом можно заменить на цикл. Обход дерева не исключение. Все зависит от структуры данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 16:24:40 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
А ну, давай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 16:25:53 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
Structure is simple. Table has just one parent_id field. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 16:53:12 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
Да пусть джаст ван! Ты алгоритм давай! Симпл, понимаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 16:55:58 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
рекурсивно, примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Т.е. сначала выводим текущую запись, потом находим ее детей, и для них используем ту же процедуру. Для ID у которых нет детей, цикл for select не будет выполняться. Очень может быть, что в задании IDchild = null и последующей проверке нет необходимости, но на всякий случай... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 19:33:39 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 23:09:51 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
Да... что- то у меня напутано. Иду читать книжки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 07:29:09 |
|
||
|
Вывод вложенных иерархий.
|
|||
|---|---|---|---|
|
#18+
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 ; !! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 21:15:12 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32611574&tid=1578209]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
208ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 534ms |

| 0 / 0 |
