Отправляет email-рассылки с помощью сервиса Sendsay

DBI && DB2

Уважаемый comp!!!

Всем привет!
Возникла у меня проблема:

При попытке сделать select из рекурсивного view в ручную (с помощью
интерактивного SQL клиента от DB2)

select происходит нормально, но в конце выдается предупреждение
(warning):

Command entered select * from OBJ.STRUCT_TREE fetch first 10 rows only;
ID LVL CLASS TYPE NAME
PATH GRP_ID
SQL0347W The recursive common table expression "OBJ.DIR_TREE" may contain an

infinite loop. SQLSTATE=01605

15 0 15 1 <Иерархия компаний>



0
100 0 100 1 <Типы коммутаторов>




0
16 1 15 8193 Компания-1
/Компания-1 0
101 1 101 2049 <Коммутатор>
/<Коммутатор> 0
20 2 20 0 <Иерархия клиентов>
/Компания-1/<Иерархия клиентов> 0
30 2 30 0 <Иерархия контрактов>
/Компания-1/<Иерархия контрактов> 0
35 2 35 0 <Иерархия физ. лиц>
/Компания-1/<Иерархия физ. лиц> 0
1000 2 101 8193 Коммутатор-1
/<Коммутатор>/Коммутатор-1 2
1100 2 101 8193 Коммутатор-2
/<Коммутатор>/Коммутатор-2 1
1200 2 101 8193 Коммутатор-3
/<Коммутатор>/Коммутатор-3 0

10 record(s) selected with 1 warning messages printed.

Т.е. сам SQL запрос и VIEW верны.

Но вот драйвер (DBD::DB2) интерпретирует этот warning как ошибку. Вот
что выдает DBI->trace(20,"~/logs/dbi.log");

SQLNumResultCols failed error 1 recorded: [IBM][CLI Driver][DB2/NT] SQL0347W
The recursive common table expression "OBJ.DIR_TREE" may contain an infinite
loop. SQLSTATE=01605

т.е. не проходит метод prepare на этапе выяснения количества колонок в
результирующей таблице. И, соответственно, без $sth->prepare не
выполняется $sth->execute.

Подскажите пожажулуйста, как обойти это недоразумение?


--

С Уважением,

Сергей.


-*Название листа "Linux: разрешение вопросов, перспективы и общение"; Участников: 987
Написать в лист: comp.soft.linux.discuss-list@subscribe.ru
Архив Листа - http://subscribe.ru/archive/comp.soft.linux.discuss Поиск: http://www.google.com
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 4054; Возраст листа: 205
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/80565



-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sergey Tamkovich Sun, 15 Feb 2004 18:06:01 +0300 (#80565)

 

Ответы:

Sergey Tamkovich пишет:

an

Я бы не сказал, что запрос проходит нормально. Есть же предупреждение,
что OBJ.DIR_TREE может иметь бесконечный цикл.

prepare не выясняет количество колонок. Он говорит БД построить план
запроса для выполнения. Потом можно будет биндить параметры к запросу,
если они там указаны и выполнять его много раз с разными параметрами, не
препарируя запрос каждый раз.

Попробуй $dbh->do(). Хотя вряд-ли поможет. Поковыряйся в DBI на предмет
уровня ошибок. Может, есть опция "игнорировать предупреждения". Хотя,
самый лучший вариант разобраться с запросом на предмет предупреждения и
сделать так, чтобы оно не появлялось.


-*Название листа "Linux: разрешение вопросов, перспективы и общение"; Участников: 990
Написать в лист: comp.soft.linux.discuss-list@subscribe.ru
Архив Листа - http://subscribe.ru/archive/comp.soft.linux.discuss Поиск: http://www.google.com
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 4069; Возраст листа: 206
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/80885



-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Дмитрий Корпушов Mon, 16 Feb 2004 08:54:20 +0500 (#80885)

 

Уважаемый Дмитрий Корпушов!!!

Monday, February 16, 2004, 6:54:20 AM, you wrote:

Ну да - система вложенных каталогов, Вас же никто не ограничивает на
количество папок?

Судя по DBI->trace() выясняет. Да и в perldoc DBI нечто похожее
Судя по perldoc DBI описано. что бы не быть голословным, привожу вывод
трейса:

at /home/serg/www/cgi-bin/rights.cgi line 62

from OBJ.STRUCT_TREE where LVL=0 and PATH LIKE '%'') thr#0183F320
New DBI::st (for DBD::DB2::st, parent=DBI::db=HASH(0x22fe5f4), id=)
dbih_setup_handle(DBI::st=HASH(0x22fdefc)=>DBI::st=HASH(0x22fe058), DBD::DB2::st,
22fdf08, Null!)
dbih_make_com(DBI::db=HASH(0x22fe5f4), 0229C51C, DBD::DB2::st, 152, 00000000)
thr#0183F320
dbih_setup_attrib(DBI::st=HASH(0x22fe058), Err, DBI::db=HASH(0x22fe5f4))
SCALAR(0x1aceb74) (already defined)
dbih_setup_attrib(DBI::st=HASH(0x22fe058), State, DBI::db=HASH(0x22fe5f4))
SCALAR(0x1acebd4) (already defined)
dbih_setup_attrib(DBI::st=HASH(0x22fe058), Errstr, DBI::db=HASH(0x22fe5f4))
SCALAR(0x1aceba4) (already defined)
dbih_setup_attrib(DBI::st=HASH(0x22fe058), TraceLevel, DBI::db=HASH(0x22fe5f4))
0 (already defined)
dbih_setup_attrib(DBI::st=HASH(0x22fe058), FetchHashKeyName, DBI::db=HASH(0x22fe5f4))
'NAME' (already defined)
dbih_setup_attrib(DBI::st=HASH(0x22fe058), HandleError, DBI::db=HASH(0x22fe5f4))
undef (not defined)
dbd_st_prepare'd sql f65537
select * from OBJ.STRUCT_TREE where LVL=0 and PATH LIKE '%'
SQLNumResultCols failed error 1 recorded: [IBM][CLI Driver][DB2/Linux] SQL0347W
The recursive common table expression "OBJ.DIR_TREE" may contain an infinite
loop. SQLSTATE=01605

fbh 0: 'ID' NULLable, type 4, 11, dsize 10, p0 s2013510664
out: ftype 1, indp 0, bufl 12, rlen 12
fbh 1: 'LVL' NULLable, type 4, 11, dsize 10, p0 s2013510664
out: ftype 1, indp 0, bufl 12, rlen 12
fbh 2: 'CLASS' , type 4, 11, dsize 10, p0 s2013510664
out: ftype 1, indp 0, bufl 12, rlen 12
fbh 3: 'TYPE' , type 5, 6, dsize 5, p0 s2013510664
out: ftype 1, indp 0, bufl 7, rlen 7
fbh 4: 'NAME' , type 12, 128, dsize 128, p0 s2013510664
out: ftype 1, indp 0, bufl 129, rlen 129
fbh 5: 'PATH' NULLable, type 12, 256, dsize 256, p0 s2013510664
out: ftype 1, indp 0, bufl 257, rlen 257
fbh 6: 'GRP_ID' NULLable, type 4, 11, dsize 10, p0 s2013510664
out: ftype 1, indp 0, bufl 12, rlen 12
!! ERROR: 347 '[IBM][CLI Driver][DB2/Linux] SQL0347W The recursive common
table expression "OBJ.DIR_TREE" may contain an infinite loop. SQLSTATE=01605

'
<- prepare= DBI::st=HASH(0x22fdefc) at /home/serg/www/cgi-bin/rights.cgi
line 62

Попробуй $dbh->>do(). Хотя вряд-ли поможет. Поковыряйся в DBI на предмет

Нашел такую опцию в настройках DB2.

Ограничил степень рекурсии но это не правильно на мой взгляд. Все таки
Ошибки ошибками а предупреждения предупреждениями и путать драйверу их
не стоит.

--

С Уважением,

Сергей.


-*Название листа "Linux: разрешение вопросов, перспективы и общение"; Участников: 1000
Написать в лист: comp.soft.linux.discuss-list@subscribe.ru
Архив Листа - http://subscribe.ru/archive/comp.soft.linux.discuss Поиск: http://www.google.com
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 4118; Возраст листа: 208
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/82994



-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sergey Tamkovich Wed, 18 Feb 2004 12:54:35 +0300 (#82994)

 

Уважаемый Дмитрий Корпушов!!!

SQLNumResultCols failed error 1 recorded: [IBM][CLI Driver][DB2/NT] SQL0347W
The recursive common table expression "OBJ.DIR_TREE" may contain an infinite
loop. SQLSTATE=01605

SQLNumResultCols failed error 1 recorded: [IBM][CLI Driver][DB2/Linux]
SQL0347W The recursive common table expression "OBJ.DIR_TREE" may
contain an infinite loop. SQLSTATE=01605

Собственно Ошибка одна и та же и под виндой (драйвер от ActiveState) и
под линуксом - драйвер от CPAN но, если последний еще можно попытаться
поправить то для того что бы исправить первый у меня не хватит
навыков.

--

С Уважением,

Сергей.


-*Название листа "Linux: разрешение вопросов, перспективы и общение"; Участников: 1000
Написать в лист: comp.soft.linux.discuss-list@subscribe.ru
Архив Листа - http://subscribe.ru/archive/comp.soft.linux.discuss Поиск: http://www.google.com
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 4119; Возраст листа: 208
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/82995



-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sergey Tamkovich Wed, 18 Feb 2004 12:59:29 +0300 (#82995)

 

Sergey Tamkovich пишет:

Я так думаю, что DBI в ActiveState и в других реализациях Perl один и
тот же. Скорее всего, это не глюк DBI, а особенность реализации драйвера
для DB2. Попробуй обойти эту ошибку с другой стороны. Например, вместо
чтения рекурсивного представления организуй в Perl рекурсию (цикл) по
чтению данных из таблиц(ы), на которых(ой) построено данное
представление. Либо что-то еще. В любом случае эту проблему можно обойти.


-*Название листа "Linux: разрешение вопросов, перспективы и общение"; Участников: 1000
Написать в лист: comp.soft.linux.discuss-list@subscribe.ru
Архив Листа - http://subscribe.ru/archive/comp.soft.linux.discuss Поиск: http://www.google.com
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 4122; Возраст листа: 208
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/83026



-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Дмитрий Корпушов Wed, 18 Feb 2004 15:31:20 +0500 (#83026)