powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Не видно столбцов из соседнего набора
5 сообщений из 5, страница 1 из 1
Не видно столбцов из соседнего набора
    #36917502
BuryCommoner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть запрос с несколькими уровнями подзапросов. В общем выглядит деревообразно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select ...
from
  (select ...
  from
    (select ... ) q1
  left join
    (select ... ) q2 on ...
  ) q3
left join
  (select ...
  from
    (select ... ) q4
  left join
    (select xmlagg(...) from table1 t where t.field1 = q4.field1) q5 on ... -- пример возникновения ошибки
  ) q6 on ...

Итого в глубину 5 уровней. При очередном join-е для оптимизации нужно в where подставить значение из уровня выше. Если ставить его в условие on, то подзапрос сначала формирует выборку по всем данным таблицы и только потом отбирает нужные строки для сцепки по join.
Проблема заключается в том, что при переносе условия в where и использования в нём значений из предыдущего уровня DB2 перестает их узнавать. Даже переменные хранимой процедуры (запрос выполняется в процедуре) становятся неизвестными.
Код: plaintext
SQL0204N  Имя "q4.field1" не было определено.
Хотя, вроде, на более простых запросах всё отрабатывало нормально. В чем может быть дело?
Может есть ограничение на количество уровней?

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
Не видно столбцов из соседнего набора
    #36921536
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BuryCommonerХотя, вроде, на более простых запросах всё отрабатывало нормально. В чем может быть дело?
Может есть ограничение на количество уровней?Покажите более простой работающий запрос.
Дело в том, что вы не можете использовать в подзапросе поля внешних таблиц (а только параметры или переменные процедуры или функции, в которой запрос написан), если только вы перед подзапросом не указываете слово table:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select  1 
from sysibm.sysdummy1 a, 
--table
(
select  1 
from sysibm.sysdummy1 b
where b.IBMREQD=a.IBMREQD
) c
Раскомментируйте table и посмотрите, что получится...
...
Рейтинг: 0 / 0
Не видно столбцов из соседнего набора
    #36930369
BuryCommoner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, проглючил, был напуган :)
Действительно, так делать нельзя. Но проблема была. Потому что в where подзапроса я так же пытался использовать переменную хранимой процедуры. Причем в подзапросах выше она нормально находилась, а именно в данном подзапросе происходила ошибка SQL0204N Имя не было определено. Проблему пока решил изменением структуры хранения.
...
Рейтинг: 0 / 0
Не видно столбцов из соседнего набора
    #36930865
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BuryCommonerНо проблема была. Потому что в where подзапроса я так же пытался использовать переменную хранимой процедуры. Причем в подзапросах выше она нормально находилась, а именно в данном подзапросе происходила ошибка SQL0204N Имя не было определено. Проблему пока решил изменением структуры хранения.Очень странно.
Вот вам тестовая процедура, она генерирует вложенность любого уровня, заданного первым параметром. Текст выполняемого запроса выводится в 3-ем параметре.
У меня до уровня 100 работает, т.е. параметр процедуры на этом уровне распознаётся.
Если будете проверять, не задавайте уровень слишком большим - инстанс упасть может по переполнению стека.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace procedure test_nested(p_lvl int, p_ibmreqd char( 1 ), out p_stmt clob(32K), out p_res int)
begin

for v as
with t(lvl, stmt) as (
values ( 1 , cast('(select * from ' as clob(32K)))
  union all
select lvl+ 1 , stmt||'(select * from '
from t
where lvl<p_lvl)
select 'set ? = (select count(1) from '||stmt||'sysibm.sysdummy1 where ibmreqd=cast(? as char(1))'||repeat(')', lvl)||')' stmt
from t
where lvl=(select max(lvl) from t)
do
  set p_stmt=v.stmt;
end for;

prepare s_stmt from p_stmt;
execute s_stmt into p_res using p_ibmreqd;

end@

call test_nested( 100 , 'Y', ?, ?)@
...
Рейтинг: 0 / 0
Не видно столбцов из соседнего набора
    #37090331
BuryCommoner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за поздний ответ. Сам ошибочный запрос был утерян при оптимизации и повторить его не получилось. Проблема, скорее всего, была не в глубине вложенности. Запрос выполнялся в теле хранимой процедуры и занимал 5 экранов текста. Вероятно было превышено какое-то ограничение компилятора.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Не видно столбцов из соседнего набора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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