DB2存储final table子句的结果

时间:2014-08-09 18:57:43

标签: sql db2 db2-400

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')
)

2 个答案:

答案 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的变量也可以正常工作。