powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / INSERT в CTE
3 сообщений из 3, страница 1 из 1
INSERT в CTE
    #35685133
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для обучения работы с DB2 стажёр делает реализацию виртуальной файловой системы.
Имеем:
Код: 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.
CREATE TABLE AWOLF.FILE_LIST (
  FILE_ID        BIGINT NOT NULL,
  FILE_PARENT    BIGINT,
[куча полей]
  /* Keys */
  PRIMARY KEY (FILE_ID),
  /* Foreign keys */
  CONSTRAINT FILE_PARENTS
    FOREIGN KEY (FILE_PARENT)
    REFERENCES AWOLF.FILE_LIST(FILE_ID)
    ON DELETE CASCADE
    ON UPDATE NO ACTION, 
) IN USERSPACE1@

CREATE TABLE AWOLF.FILE_BLOB (
  FILE_ID       BIGINT NOT NULL,
  FILE_BLOB     BLOB( 2147483647 ) NOT LOGGED,
  FILE_VERSION  BIGINT,
  /* Foreign keys */
  CONSTRAINT FILE_LIST_ID_FK
    FOREIGN KEY (FILE_ID)
    REFERENCES AWOLF.FILE_LIST(FILE_ID)
    ON DELETE CASCADE
    ON UPDATE NO ACTION
) IN USERSPACE1@

Делаем копирование файлов. То есть надо скопировать одну ветку дерева файловой системы в некоторую другую ветку, при этом перенося содержимое файлов.
Я попытался схитрить и сделать в одном WITH-е сразу всё:
Код: 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.
INSERT INTO AWOLF.FILE_BLOB(FILE_ID, FILE_BLOB, FILE_VERSION)
with 
a (FILE_ID, FILE_PARENT, [куча полей])
as
(
     SELECT * 
     FROM awolf.FILE_LIST 
     WHERE file_id =  3  --pfile_id
     UNION ALL
     SELECT fl.*
     FROM awolf.FILE_LIST fl, a
     WHERE fl.FILE_PARENT = a.file_id
),
b (file_id, new_file_id) as 
(
select a.file_id, nextval for FILE_LIST_ID_SEQ as new_file_id
from a
),
c(new_file_id, new_parent, FILE_ID, FILE_PARENT, [куча полей])
as(
select id.new_file_id, coalesce(pid.new_file_id,  1 ) as new_parent, a.*
from a
     join b id on a.file_id=id.file_id
     left join b pid on a.file_parent=pid.file_id
),
NEW_FILES AS
(
     SELECT  1  as n 
     FROM NEW TABLE
     (INSERT INTO AWOLF.FILE_LIST(new_file_id, new_parent,  [куча полей])
     SELECT FILE_ID, FILE_PARENT, [куча полей]
     FROM c
     )
)
SELECT c.new_file_id, fb.file_blob, fb.file_version
FROM file_blob fb, c
WHERE fb.file_id = c.FILE_ID

Если убрать инсерт сверху, то выполняется нормально
С инсёртом лезет ошибка
SQL20165N Оператор изменения данных SQL в условии FROM недопустим в том контексте, в котором он задан. SQLSTATE=428FL

В чём причина проблемы и как её решать?
...
Рейтинг: 0 / 0
INSERT в CTE
    #35685245
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
with 
a (FILE_ID, FILE_PARENT, [куча полей])
as
(
     SELECT * 
     FROM awolf.FILE_LIST 
     WHERE file_id =  3  --pfile_id
     UNION ALL
     SELECT fl.*
     FROM awolf.FILE_LIST fl, a
     WHERE fl.FILE_PARENT = a.file_id
),
b (file_id, new_file_id) as 
(
select a.file_id, nextval for FILE_LIST_ID_SEQ as new_file_id
from a
),
c(new_file_id, new_parent, FILE_ID, FILE_PARENT, [куча полей])
as(
select id.new_file_id, coalesce(pid.new_file_id,  1 ) as new_parent, a.*
from a
     join b id on a.file_id=id.file_id
     left join b pid on a.file_parent=pid.file_id
),
NEW_FILES AS
(
     SELECT  1  as n 
     FROM NEW TABLE
     (INSERT INTO AWOLF.FILE_LIST(new_file_id, new_parent,  [куча полей])
     SELECT FILE_ID, FILE_PARENT, [куча полей]
     FROM c
     )
)
select count( 1 )
from new table(
INSERT INTO AWOLF.FILE_BLOB(FILE_ID, FILE_BLOB, FILE_VERSION)
SELECT c.new_file_id, fb.file_blob, fb.file_version
FROM file_blob fb, c
WHERE fb.file_id = c.FILE_ID
) d
...
Рейтинг: 0 / 0
INSERT в CTE
    #35686040
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Mark Barinstein
Спасибо, помогло
:-)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / INSERT в CTE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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