powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
6 сообщений из 6, страница 1 из 1
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
    #32312368
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В форуме часто встречал обсуждение сабжа... в конце - концов сам столкнулся с проблемой. Вот, выставляю на растерзание свое решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
CREATE PROCEDURE STARTING_CONNECT (
    TABLE_NAME VARCHAR( 30 ),
    PK_FIELD VARCHAR( 30 ),
    FK_FIELD VARCHAR( 30 ),
    PARENT_VALUE NUMERIC( 18 , 0 ),
    ORDER_FIELDS VARCHAR( 100 ),
    IN_UROV NUMERIC( 18 , 0 ))
RETURNS (
    ID NUMERIC( 18 , 0 ),
    OUT_UROV NUMERIC( 18 , 0 ))
AS
begin
   IF (IN_UROV IS NULL) Then
      IN_UROV= 0 ;
   ELSE
      IN_UROV=IN_UROV+ 1 ;
   FOR EXECUTE STATEMENT
      'SELECT ' || PK_FIELD || ' FROM ' || TABLE_NAME ||
      ' WHERE ' || FK_FIELD ||
         CASE
            WHEN PARENT_VALUE IS NULL THEN ' IS NULL'
            ELSE '=' || PARENT_VALUE
         END ||
         CASE
            WHEN ORDER_FIELDS IS NULL THEN ''
            ELSE ' ORDER BY ' || ORDER_FIELDS
         END || ''
      INTO :ID
      DO BEGIN
         OUT_UROV = IN_UROV;
         SUSPEND;
         FOR
            SELECT ID, OUT_UROV, TEXT
            FROM STARTING_CONNECT(
               :TABLE_NAME, :PK_FIELD, :FK_FIELD,
               :ID, :ORDER_FIELDS, :IN_UROV)
         INTO :ID, :OUT_UROV
         DO SUSPEND;
      END
end


Использовать:
Create table Tree(Id NUMERIC(18,0), TreeId NUMERIC(18,0), Name Varchar(200))
insert...
SELECT t.name, sc.OUT_UROV
FROM Tree t
JOIN STARTING_CONNECT('Tree', 'Id', 'TreeId', NULL, 'NAME', NULL) sc ON (t.id=sc.id)
Рассмотрю все замечания/предложения (конструкция будет сипользована в реальном проекте, поэтому буду рад, если кто - нибудь че-нить заметит, или предложит).
...
Рейтинг: 0 / 0
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
    #32312436
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем проблема ?
И, кстати, зачем numeric(18,0), если можно, если надо, int64 ?
...
Рейтинг: 0 / 0
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
    #32312503
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похожее решение и мне делать пришлось, но я еще добавил LEVEL - текущий уровень.
...
Рейтинг: 0 / 0
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
    #32312527
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет
>2Johnmen:
- проблема в том, что реализации альтернативы START WITH ... CONNECT BY ... в FB на форуме я не нашел. Были вырианты с использованием временных таблиц... это не наш путь. Тему в форум бросил, чтобы обсудить конструкцию (будет повсеместно использоваться в реальном проекте -> требования к ней повышены)
- а есть разница между numeric(18, 0) и int64?
> 2nik_x
- LEVEL, или OUT_UROV - всего лишь вопрос названия (кроме того LEVEL - зарезервир. слово... не люблю использовать в названиях).
...
Рейтинг: 0 / 0
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
    #32312946
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2:oz
извиняюсь за незаконченную (неправильно сформулированную) мысь...
Разницы в имени действительно нет. Хотел сказать про анализ на глубину вложения рекурсий. На платформе Маст-дай это что-то около 700 (точно не помню) на юниксах - до 900. Хотя мне практически такого значения достичь не удалось; маусимум 18 - по обходу дерева.
На версии FB 1.0 предложение: FOR EXECUTE STATEMENT - работать не будет, не было там еще такого...
А в остальном - больше ничего и не придумаешь...
...
Рейтинг: 0 / 0
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
    #32313761
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2nik_x: версия FB оговорена в сабже. Насчет больше ничего и не придумаешь : испытания в боевых условиях заставили внести несколько фиксов:
1. Прорисовка дерева в обе стороны
2. Старт для прорисовки инициируется условием (для полной совместимости с Oracle), а не значением.
Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
CREATE PROCEDURE STARTING_CONNECT (
    TABLE_NAME VARCHAR( 30 ),
    PK_FIELD VARCHAR( 30 ),
    FK_FIELD VARCHAR( 30 ),
    OUT_FIELD VARCHAR( 30 ),
    EXPRESSION VARCHAR( 100 ),
    ORDER_FIELDS VARCHAR( 100 ),
    IN_UROV NUMERIC( 18 , 0 ))
RETURNS (
    ID NUMERIC( 18 , 0 ),
    LEVEL_ NUMERIC( 18 , 0 ))
AS
DECLARE VARIABLE PK_VALUE NUMERIC( 18 , 0 );
begin
   IF (TABLE_NAME IS NULL) Then
      EXCEPTION EMPTY_TABLE_NAME;
   IF (PK_FIELD IS NULL) Then
      PK_FIELD='ID';
   IF (FK_FIELD IS NULL) Then
      FK_FIELD=TABLE_NAME||'ID';
   IF (OUT_FIELD IS NULL) Then
      OUT_FIELD='ID';
   IF (IN_UROV IS NULL) Then
      IN_UROV= 0 ;
   ELSE
      IN_UROV=IN_UROV+ 1 ;
   FOR EXECUTE STATEMENT
      'SELECT ' || OUT_FIELD || ', ' || PK_FIELD ||' FROM ' || TABLE_NAME ||
      ' WHERE ' || 
         CASE
            WHEN EXPRESSION IS NULL THEN FK_FIELD || ' IS NULL'
            ELSE EXPRESSION
         END ||
         CASE
            WHEN ORDER_FIELDS IS NULL THEN ''
            ELSE ' ORDER BY ' || ORDER_FIELDS
         END || ''
      INTO :ID, :PK_VALUE
      DO BEGIN
         LEVEL_ = IN_UROV;
         SUSPEND;
         FOR
            SELECT ID, LEVEL_
            FROM STARTING_CONNECT(
               :TABLE_NAME, :PK_FIELD, :FK_FIELD, :OUT_FIELD,
               :FK_FIELD||
               CASE
                  WHEN :ID IS NULL THEN ' IS NULL'
                  ELSE '=' || :PK_VALUE
               END, :ORDER_FIELDS, :IN_UROV)
         INTO :ID, :LEVEL_
         DO SUSPEND;
      END
END
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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