powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Длина оператора превышает допустимое значение.
16 сообщений из 16, страница 1 из 1
Длина оператора превышает допустимое значение.
    #32687438
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
[SQL0101] Оператор SQL слишком длинный или слишком сложный. Причина 
. . . . :   Длина или сложность оператора SQL превышает допустимое 
ограничение. Код причины:  4 . Ошибке могут соответствовать следующие коды 
причины: 1  - Общее количество операторов выбора в операторе полного выбора 
(предложение UNION или UNION ALL) превышает  32 . 2  - Общее количество 
столбцов, констант и операторов превышает допустимое в SQL значение. 3  - 
Сумма длин столбцов, типы которых отличны от LOB, в определении списка 
выбора, таблицы или представления или в пользовательской функции таблицы 
превышает  32766 , либо определение содержит LOB и сумма длин, указанных в 
предложении ALLOCATE для полей переменной и постоянной длины, превышает 
 32740 . При наличии столбцов переменной длины или столбцов, допускающих 
пустые значения, максимально допустимая длина будет еще меньше.  4  - Общее 
количество вложенных операторов выбора превышает  31 . 5  - Общая длина 
текста оператора превышает  65535 . 6  - Указанное в операторе FETCH значение 
относительной позиции лежит вне допустимого диапазона. 7  - Невозможно 
создать имя системы.Исправление . . :   Упростите оператор или разбейте его 
на несколько операторов и повторите запрос. Если код причины равен  7 , 
укажите другое имя таблицы, представления, индекса или псевдонима.

SQL нормально выполняется на DB2 v8.1 for Windows и не может на DB2/400 V5R2. Можно как нибудь подкрутить это на АСке?
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32687574
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Черт!!! Оказывается V5R2 не поддерживает рекурсию, а она у меня в запросе есть. Кто нибудь знает как рекурсивный запрос заменить на обычный?
Рекурсия обычная, как из примера в DB2 CookBook.
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688135
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поробуй коннектится к AS/400 через DB2 Connect???
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688227
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, так не пойдет. Я написал программу на Jave, протестировал на виндовозе и хотел закинуть на АСку, а она мне вот такое вывалила. Что DB2/400 V5R2 не поддерживает рекурсию ни в каком виде?
Может кто нибудь поможет мне переписать запрос без рекурсии? Запрос точь-в-точь как в кукбуке.
Николай, а в OS/400 V5R3 - есть рекурсия?
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688252
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AS/400 не входит в мою компетенцию. Не знаю честно говоря
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688277
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль. Всё равно спасибо за отклик.

2 all
как переписать рекурсию такого вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
HIERARCHY                            AAA
+ ---------------+                     | 
|PKEY |CKEY |NUM|               + -----+-----+ 
| -----|-----|---|               |     |     | 
|AAA  |BBB  |  1  |              BBB   CCC   DDD
|AAA  |CCC  |  5  |                     |     |
|AAA  |DDD  |  20 |                     +-+ +-+
|CCC  |EEE  |  33 |                       | | |
|DDD  |EEE  |  44 |                       EEE FFF
|DDD  |FFF  |  5  |                            |
|FFF  |GGG  |  5  |                            |
+---------------+                           GGG	
т.е. надо допустим вывести все дочерние элементы элемента ААА, к примеру.

Я уже весь скульру зафлудил этим вопросом. :)
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688555
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по инфе в Болдере - в V5R3 тоже нэма.
Раз уж java клиент - перепиши циклом - или с этим сложность?
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688577
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фиговенько в цикле писать - производительность упадет на нет. Рекурсивный запрос вообще шустрый был, правда под виндовоз. Сейчас думаем как обойти проблему. А можно ссылку про V5R3?
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688613
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где в SQL Reference в описании SELECT по
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/ic2924/index.htm?info/db2/rbafzmst02.htm просто коммент
If a fullselect of a common table expression contains a reference to itself in a FROM clause, the common table expression is a recursive table expression. Recursive common table expressions are not supported in DB2 UDB for iSeries.
В разделе Programming глава по использованию Common table expression никаких намеков на возможность рекурсии тоже не содержит
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688614
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе есть довольно забавное решение:
Если известно что глубина дерева не превысит определенного значения (зависит от данных) можно развернуть рекурсию в одно SQL выражение по тому же принципу как он рекурсивно вычисляется в db2.
Есть определенная вероятность что, возможно, окажется и быстрее чем цикл.
Надо будет посмотреть - просто интересно как оптимизатор это пропустит через себя.
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32688755
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про это я тоже знаю. Это не решение, потому что глубина дерева неизвестна.
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32690606
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
riman : - have a look at researchweb.watson.ibm.com/journal/sj/392/shi.html
But it requires db schema changes. As well as any SQL queries for walking through a tree without recursion. There are , probably, two main types of such queries.
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32690635
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggv, thanx. Посмотрю линк на досуге. В принципе, я пока что нашел временное решение для своей задачи (пришлось дико извернуться :) ). Солюшен некрасивый, но из-за дедлайна задачи принят на вооружение.
Всем участникам спасибо.
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32691946
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и как решил?
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32692074
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) В общем то решение специфично для моей задачи, поэтому и не написал его. Но если интересно - то могу и рассказать.
В моей задаче все родственные записи имеют некоторый набор полей, одинаковый для них всех. Но, тот же самый набор полей, может иметь и совсем не относящаяся к ним запись. Для того чтобы определить только родственные записи, я вывожу все записи, имеющие одинаковые наборы полей во временную таблицу, а потом в основном селекте отсеиваю лишние.
...
Рейтинг: 0 / 0
Длина оператора превышает допустимое значение.
    #32696180
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, переписанный без рекурсии скуль все равно выдает эту же ошибку. Т.е. жалуется на то что в запросе слишком много вложенных подзапросов - больше 31. Покажите мне, где у меня 31 вложенный подзапрос?

Код: 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.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
 with allknts(kntid, oldkntid ,....) as
                     (select kntid as kntid
                        ,oldkntid as oldkntid
                        ,........
                     from yeis.kontracts tk
                     where tk.oldkntid is null
                            and TK.MFO='00842'
                            and TK.kntdate<'05.03.2004'
                        and exists
                            (select tk1.cstno
                                ,tk1.cstdate
                                ,tk1.cstrgnkod
                                ,tk1.knttype
                                ,tk1.name_expstr
                            from yeis.kontracts tk1
                            where tk1.cstno=tk.cstno
                                and tk1.cstdate=tk.cstdate
                                and tk1.cstrgnkod=tk.cstrgnkod
                                and tk1.knttype=tk.knttype
                                and tk1.name_expstr=tk.name_expstr
                            group by tk1.cstno
                                ,tk1.cstdate
                                ,tk1.cstrgnkod
                                ,tk1.knttype
                                ,tk1.name_expstr
                                ,tk1.name_expstr
                            having count(tk1.kntid)> 1 
                            )
                    )
                     ,allparents (kntid, oldkntid, ......) as
                     (select t1.kntid as kntid
                        ,t1.oldkntid as oldkntid
                        ,.......
                     from allknts t1
                        inner join yeis.kontracts tk on tk.oldkntid=t1.kntid
                    )
                     ,parent_child (kntor, kntid, oldkntid,...........) as
                     (select t1.kntid
                        ,tk.kntid
                        ,tk.oldkntid
                        ,............
                     from yeis.kontracts tk
                        inner join allparents t1 on t1.cstno=tk.cstno
                            and t1.cstdate=tk.cstdate
                            and t1.cstrgnkod=tk.cstrgnkod
                            and t1.knttype=tk.knttype
                            and t1.name_expstr=tk.name_expstr
                     where tk.oldkntid is not null
                     union all
                     select t1.kntid
                        ,t1.kntid
                        ,t1.oldkntid
                        ,..........
                     from allparents t1
                    )
                        ,parent_child_max_lvl (kntor, max_lvl) as
                        (select T1.kntor as kntor
                            ,max(T1.lvl) as max_lvl
                        from parent_child T1
                        group by T1.kntor
                        )
                        ,singles (kntid) as
                        (select T2.KntID as kntid
                        from YEIS.Kontracts T2
                        where T2.kntid not in
                            (select T1.kntid
                            from parent_child T1
                            )
                            and T2.mfo='00842'
                            and T2.KntDate<'05.03.2004'
                        )
                        ,maxagrm as
                        (select T1.KntOr as KntOr
                            ,max(TA.AgrmNo) as AgrmNo
                            ,max(TA.AgrmDate) as AgrmDate
                        from parent_child T1
                            inner join YEIS.Agrmnts TA on T1.kntid=TA.KntID
                        group by T1.KntOr
                        )
                        ,agrms (kntor, kntid, agrmno, agrmdate, agrm_summ, currrate) as
                        (select T2.kntor as kntor
                            ,TA.Kntid as kntid
                            ,TA.AgrmNo as agrmNo
                            ,TA.AgrmDate as agrmdate
                            ,TA.AgrmSum as agrm_summ
                            ,TA.currrate as currrate
                        from maxagrm T2
                            inner join parent_child T3 on T2.kntor=T3.kntor
                            inner join YEIS.Agrmnts TA on T3.kntid=TA.kntid
                        where TA.AgrmNo=T2.AgrmNo
                            and TA.AgrmDate=T2.AgrmDate
                        )

 /*вот именно после этого фулселекта DB2 начинает ругаться, почему?*/ 
                        ,parent_child_sums_dlv (kntor, kntid, dlvdate_str, dlvdate_end, dlv_summ, lvl, dlv1_summ) as
                        (select T1.kntor as kntor
                            ,T1.kntid as kntid
                            ,TD.dlvdate_str as dlvdate_str
                            ,TD.dlvdate_end as dlvdate_end
                            ,TD.dlv_summ as dlv_summ
                            ,T1.lvl as lvl
                            ,TD1.dlv1_summ as dlv1_summ
                        from parent_child T1
                            left outer join
                                (select TD.KntID as kntid
                                    ,min(TD.DlvDate) as dlvdate_str
                                    ,max(TD.DlvDate) as dlvdate_end
                                    ,sum(TD.InvCost*TD.G13) as dlv_summ
                                from YEIS.Deliver TD
                                    inner join parent_child T2 on TD.KntID=T2.kntid
                                group by TD.KntID
                                ) as TD on TD.kntid=T1.kntid

                            left outer join
                                (select TD1.KntID as kntid
                                    ,sum(TD1.InvCost*TD1.G13) as dlv1_summ
                                from YEIS.Deliver TD1
                                    inner join parent_child T2 on TD1.kntid=T2.kntid
                                where TD1.DlvDate<=DATE(DAYS(cast('05.03.2004' as date))
                                   -DAYOFYEAR(cast('05.03.2004' as date)))
                                group by TD1.KntID
                                ) as TD1 on TD1.kntid=T1.kntid
                        )
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Длина оператора превышает допустимое значение.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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