Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / К вопросу о STARTING WITH... CONNECT BY... в FB (1.5) / 6 сообщений из 6, страница 1 из 1
31.10.2003, 20:52
    #32312368
oz
oz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
В форуме часто встречал обсуждение сабжа... в конце - концов сам столкнулся с проблемой. Вот, выставляю на растерзание свое решение:
Код: 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
01.11.2003, 01:40
    #32312436
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
А в чем проблема ?
И, кстати, зачем numeric(18,0), если можно, если надо, int64 ?
...
Рейтинг: 0 / 0
01.11.2003, 11:53
    #32312503
nik_x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
Похожее решение и мне делать пришлось, но я еще добавил LEVEL - текущий уровень.
...
Рейтинг: 0 / 0
01.11.2003, 13:03
    #32312527
oz
oz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
Привет
>2Johnmen:
- проблема в том, что реализации альтернативы START WITH ... CONNECT BY ... в FB на форуме я не нашел. Были вырианты с использованием временных таблиц... это не наш путь. Тему в форум бросил, чтобы обсудить конструкцию (будет повсеместно использоваться в реальном проекте -> требования к ней повышены)
- а есть разница между numeric(18, 0) и int64?
> 2nik_x
- LEVEL, или OUT_UROV - всего лишь вопрос названия (кроме того LEVEL - зарезервир. слово... не люблю использовать в названиях).
...
Рейтинг: 0 / 0
03.11.2003, 05:51
    #32312946
nik_x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
2:oz
извиняюсь за незаконченную (неправильно сформулированную) мысь...
Разницы в имени действительно нет. Хотел сказать про анализ на глубину вложения рекурсий. На платформе Маст-дай это что-то около 700 (точно не помню) на юниксах - до 900. Хотя мне практически такого значения достичь не удалось; маусимум 18 - по обходу дерева.
На версии FB 1.0 предложение: FOR EXECUTE STATEMENT - работать не будет, не было там еще такого...
А в остальном - больше ничего и не придумаешь...
...
Рейтинг: 0 / 0
03.11.2003, 16:20
    #32313761
oz
oz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
К вопросу о STARTING WITH... CONNECT BY... в FB (1.5)
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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / К вопросу о STARTING WITH... CONNECT BY... в FB (1.5) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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