Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

рекурсивная процедура в Firebird   Найти похожие ветки 

 
_Sheriff   (2004-11-30 09:48) [0]

Добрый день.
Имеется таблица, реализующая древовидную структуру.
подскажите как правильно организовать рекурсивную процедуру для обхода дерева с произвольного места с получением индексов элементов дерева.
Пытаюсь организовать процедуру следующим образом:

CREATE PROCEDURE UPDATETREELIST (PARENTID INTEGER)
RETURNS (FLEX INTEGER)
AS
DECLARE VARIABLE IDX INTEGER;
DECLARE VARIABLE TEMP INTEGER;
BEGIN
for
  select D.ID
  from tbl_data D
  where D.parentdeviceid = :ParentID
  into :Idx
do begin
  for
    select Flex
    from UPDATETREELIST(:Idx)
    into :Temp
  do begin
    Flex = :Idx;
    suspend;
  end
 end
 Flex = :Idx;
 suspend;
END

этот код выводит только первую группу индексов несколько раз.
(для разработки использую IBExpert)


 
Johnmen ©   (2004-11-30 09:49) [1]

Ищи на ibase.ru. Там был пример с комментариями...


 
_Sheriff   (2004-11-30 10:31) [2]

благодарю. буду разбираться.


 
Deniz ©   (2004-11-30 13:56) [3]

...
 for
   select Flex
   from UPDATETREELIST(:Idx)
   into :Temp
 do begin
   Flex = :Idx;
   suspend;
 end
 ...
Так и должно быть? Или все же Flex = :Temp;?


 
_Sheriff   (2004-11-30 14:52) [4]

сейчас так:

for
  select Flex
  from UPDATETREELIST(:Idx)
  into :Flex
do begin
  suspend;
end


 
DSKalugin ©   (2004-11-30 19:23) [5]

а не проще ли на программном/клиентском уровне это делать?
такими процедурами можно повесить SQLсервер


 
Val (from Donetsk)   (2004-11-30 22:27) [6]

DSKalugin ©   (30.11.04 19:23) [5]
Аргументы?
Повесить можно чем и что угодно, как вы понимаете.


 
Deniz ©   (2004-12-01 06:57) [7]

> _Sheriff   (30.11.04 14:52) [4]
Расскажи про задачу поконкретнее. При большой вложенности и большом кол-ве записей в этой таблице могут быть всякие неприятности.


 
YurikGL ©   (2004-12-01 07:25) [8]

Если есть таблицы
1)Sborki
 IdSborka
 ...
2)IerhLink
 IdIerhLink
 IdSborkaParent
 IdSborkaChild
 CountS (количество)

то можно так

CREATE PROCEDURE RECURALLNODES(
   IDSBORKAIN INTEGER,
   COUNTSIN INTEGER)
RETURNS (
   IDSBORKAOUT INTEGER,
   COUNTSOUT INTEGER)
AS
begin
 IdSborkaOut=IdSborkaIn;
 CountSOut=CountSIn;
 Suspend;
 for Select IdSborkaChild, sum(CountS*:CountSIn)
     From IerhLink
     where IdSborkaParent=:IdSborkaIn
     group by IdSborkaChild
     into :IdSborkaOut, :CountSOut
     do begin

        For Select IdSborkaOut, CountSOut
            From RecurAllNodes(:IdSborkaOut,:CountSOut)
            InTo :IdSborkaOut,:CountSOut
            do suspend;

        End

end


 
Sergey_Masloff   (2004-12-01 11:10) [9]

DSKalugin ©   (30.11.04 19:23) [5]
>а не проще ли на программном/клиентском уровне это делать?
>такими процедурами можно повесить SQLсервер
 Не надо говорить чего не знаете. Нормально написаными процедурами подобного рода сервер не повесишь а удобство они приносят огромное. Хотя бы тем что вся логика в ОДНОМ месте а не в трех десятках клиентов неизвестно каких версий.

Deniz ©   (01.12.04 06:57) [7]
>При большой вложенности и большом кол-ве записей в этой таблице >могут быть всякие неприятности.
То же самое. При вложенности до 700 с чем-то (это зашитая константа для Windows для NIX вроде 1000) и числом записей несколько миллионов - проблем нет абсолютно никаких (если процедуры написаны прямыми руками)


 
Deniz ©   (2004-12-02 06:49) [10]

> Sergey_Masloff   (01.12.04 11:10) [9]
>То же самое.

Что эначит тоже самое? Не вот это ли "Не надо говорить чего не знаете."? Если да, то Вам надо пересмотреть текст процедуры, и повнимательнее.
Если в процедуру передать в качестве параметра ID самой верхней ветки и в таблице, как Вы говорите несколько миллионов, то проблема сразу ясно и нарисуется. Если просто обход дерева, то проблем почти нет, но возврат на клиента всех дочерних веток вызывает двоякие чувства.


 
Sergey_Masloff   (2004-12-02 07:56) [11]

Deniz ©   (02.12.04 06:49) [10]
Если ваш ответ относился конкретно к этой процедуре то признаю справедливость Вашего высказывания.
 Я, конечно, имел в виду общий случай применения "деревянных" структур. С их использованием проблем не возникает.
 Вобщем, рубанул вас шашкой сгоряча.


 
Deniz ©   (2004-12-02 08:13) [12]

> Sergey_Masloff   (02.12.04 07:56) [11]
Все нормально ;-)
А просто хотел узнать у автора, для чего все это надо, а то может какой другой вариант подойдет лучше.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.042 c
1-1102694453
8ung
2004-12-10 19:00
2004.12.26
Pointer


1-1102562115
SnapIn
2004-12-09 06:15
2004.12.26
Мой метод Create скрывает виртуальный метод базового класса...


1-1102614641
Dmitry_04
2004-12-09 20:50
2004.12.26
Изменение атрибутов файла...


9-1092736187
Orbital
2004-08-17 13:49
2004.12.26
Расчет траектории при движении на орбите


1-1102503744
Sirus
2004-12-08 14:02
2004.12.26
Нужно опознать путь типа c: folder folder1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский