FINAL TABLE子句非常适合从DB2中的DML获取值,例如:
SELECT id
FROM FINAL TABLE
(
INSERT INTO mySchema.myTable (val)
VALUES ('data')
)
但是,似乎没有办法将此查询的结果存储到另一个表中,将内容保存在某个地方。例如,以下两个都失败并出现错误"在指定的位置不允许使用数据更改表引用。" (我正在运行DB2 for i v7.1):
CREATE TABLE mySchema.otherTable AS (
SELECT id
FROM FINAL TABLE
(
INSERT INTO mySchema.myTable (val)
VALUES ('data')
)
) WITH DATA
在单独的CREATE TABLE语句中创建mySchema.otherTable后,这也会失败:
INSERT INTO mySchema.otherTable (ID)
SELECT id
FROM FINAL TABLE
(
INSERT INTO mySchema.myTable (val)
VALUES ('data')
)
答案 0 :(得分:2)
不确定这是否适用于i Series,但DB2 for LUW允许您这样做:
with i1 (id) as (
SELECT id
FROM FINAL TABLE
(
INSERT INTO mySchema.myTable (val)
VALUES ('data')
)
)
select * from new table (
INSERT INTO mySchema.otherTable (ID)
select id from i1
)
答案 1 :(得分:1)
我今天尝试在OS V7R1上的IBM i上使用FINAL TABLE技术,当尝试将标识列值提供给第二个插入时,它不会像DB2 for LUW所描述的那样工作。我预计我们最终会获得这种能力。
作为替代方案,我能够使用SET命令将分配的标识列值路由到SQL全局变量,然后使用该全局变量将相同的标识列值分配给2个相关关联表的后续插入。对于非编译的SQL脚本,这是一种用于服务器端解决方案的好技术,直到我们获得与DB2 for LUW相同的能力。临时表也可以使用。
create variable MY_SCHEMA.MY_TABLE_ID
;
set MY_SCHEMA.MY_TABLE_ID =
( select ID
from final table ( insert into MY_SCHEMA.MY_TABLE values ('data') ) )
;
insert into MY_SCHEMA.MY_OTHER_TABLE ( ID, DATA )
values( MY_SCHEMA.MY_TABLE_ID, 'more data' )
;
从V7R1 SQL参考手册: 全局变量具有会话范围。这意味着虽然它们是 对于在数据库上处于活动状态的所有会话都可以使用,它们的值是私有的 每次会议。
对于已编译的SQL存储过程,带有SELECT INTO的变量也可以正常工作。