powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / РЕКУРСИЯ работает, в курсоре не работает
6 сообщений из 6, страница 1 из 1
РЕКУРСИЯ работает, в курсоре не работает
    #39077062
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, здравствуйте!

Есть запрос возвращающий последний по дате создания узел:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with
    tree (id,pid) as (
      select ic.ID,ic.PID from test.tbl ic
  ),
    rr (id,pid) as (
    select tr.id, tr.pid from tree tr where tr.pid in (select  id
                                                       from test.tbl2
                                                        where  id=123456 --для одного ключа
    )
    union all
    select tt.id,tt.pid from tree tt, rr
    where tt.pid = rr.id
  )
select rec.id from rr rec, test.tbl i
where rec.id = i.id  order by  i.DATE  desc fetch first 1 row only;



работает, не пойму как его запустить в курсоре, в курсоре не работает:
Код: plsql
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.
DECLARE GLOBAL TEMPORARY TABLE SESSION.TREE(ID BIGINT, PID BIGINT)
WITH REPLACE
ON COMMIT PRESERVE ROWS NOT LOGGED;

BEGIN
 
  DECLARE SQLCODE INT;
  DECLARE Vrb_Id BIGINT;
  DECLARE TRG_ID INT;

DECLARE Crs_Upd CURSOR WITH HOLD FOR   SELECT DISTINCT  id
                                       from test.tbl2
                                       WITH UR
FOR READ ONLY;
OPEN Crs_Upd;

SET TRG_ID = 0;
FETCH FROM Crs_Upd into Vrb_Id;
WHILE (SQLCODE != 100) DO
  begin 
   
 tree (id,pid) as (
      select ic.ID,ic.PID from test.tbl ic
  ),
    rr (id,pid) as (
    select tr.id, tr.pid from tree tr where tr.pid = Vrb_id --для переменной курсора
    )
    union all
    select tt.id,tt.pid from tree tt, rr
    where tt.pid = rr.id
  )
select rec.id INTO TRG_ID from rr rec, test.tbl i
where rec.id = i.id  order by  i.DATE  desc fetch first 1 row only;

 
    
 INSERT INTO SESSION.TREE( ID, PID) VALUES( TRG_ID, Vrb_Id);
end;

  FETCH FROM Crs_Upd into Vrb_Id;
END WHILE;
CLOSE Crs_Upd;
COMMIT;
END;



ошибка:
Код: sql
1.
2.
3.
4.
5.
java.sql.SQLException: An unexpected token "with
          tree (id,pid) as" was found following "100) DO
    begin

".  Expected tokens may include:  "<psm_if>".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.7.85



ну и просто внутри begin ... end, таже ошибка.

1. хранимку нет возможности создать
2. писать шелл где отдельно залью во времянку те PID для которых надо найти детей, потом дергать по одному и подавать в голый селект заполняя в той же времянке второе поле - конечно могу, но верю в sql и db2

Помогите советом. Спасибо
...
Рейтинг: 0 / 0
РЕКУРСИЯ работает, в курсоре не работает
    #39077365
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kT_________,

Добрый день.

вместо tree (id,pid) as (
select ic.ID,ic.PID from test.tbl ic
),
rr (id,pid) as (
select tr.id, tr.pid from tree tr where tr.pid = Vrb_id --для переменной курсора
)
union all
select tt.id,tt.pid from tree tt, rr
where tt.pid = rr.id
)
select rec.id INTO TRG_ID from rr rec, test.tbl i
where rec.id = i.id order by i.DATE desc fetch first 1 row only;

попробуйте
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
FOR C1 AS
 WITH tree (id,pid) as (
      select ic.ID,ic.PID from test.tbl ic
  ),
    rr (id,pid) as (
    select tr.id, tr.pid from tree tr where tr.pid = Vrb_id --для переменной курсора
    )
    union all
    select tt.id,tt.pid from tree tt, rr
    where tt.pid = rr.id
  )
select rec.id 
from rr rec, test.tbl i
where rec.id = i.id  
order by  i.DATE  desc 
fetch first 1 row only;
DO
  SET TRG_ID = C1.ID;
END FOR;

...
Рейтинг: 0 / 0
РЕКУРСИЯ работает, в курсоре не работает
    #39077506
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

Можете дать пример любого рабочего цикла содержащего WITH?

например:

FOR vrb AS
with tree (........


Дело даже не в union all, складывается впечатление что конструкция WITH имеет очень ограниченное применение, внутри курсоров и анонимных блоков просто не работает . Да?
...
Рейтинг: 0 / 0
РЕКУРСИЯ работает, в курсоре не работает
    #39077594
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Олег, Спасибо Марк)
...
Рейтинг: 0 / 0
РЕКУРСИЯ работает, в курсоре не работает
    #39077602
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kT_________,

db2 -f myfile.sql
Код: sql
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.
--#SET TERMINATOR @

SET SERVEROUTPUT ON@

BEGIN
 
DECLARE SQLCODE INT;
DECLARE Vrb_Id BIGINT;
DECLARE TRG_ID INT;

DECLARE Crs_Upd CURSOR WITH HOLD FOR   
  SELECT DISTINCT  id
  from table(values 1,2,3) t(id)
  WITH UR
  FOR READ ONLY;
OPEN Crs_Upd;

SET TRG_ID = 0;
FETCH FROM Crs_Upd into Vrb_Id;
WHILE (SQLCODE != 100) DO
  for c1 as
  with t(id, v_id) as (
    values  (1, Vrb_id)
      union all
    select id+1, v_id+1
    from t
    where t.id<5
  )
  select v_id
  from t
  fetch first 1 row only
  do
    set TRG_ID=c1.v_id;
    call dbms_output.put_line(trg_id);
  end for;
  FETCH FROM Crs_Upd into Vrb_Id;
END WHILE;
CLOSE Crs_Upd;
--COMMIT;
END@

...
Рейтинг: 0 / 0
РЕКУРСИЯ работает, в курсоре не работает
    #39077723
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

Спасибо, дружище!!!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / РЕКУРСИЯ работает, в курсоре не работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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