Sql DB2存储来自final table子句的结果

Sql DB2存储来自final table子句的结果,sql,db2,db2-400,Sql,Db2,Db2 400,该子句非常适合在DB2中从DML获取值,例如: SELECT id FROM FINAL TABLE ( INSERT INTO mySchema.myTable (val) VALUES ('data') ) 但是,似乎没有办法将此查询的结果存储到另一个表中,将内容持久化到某个地方。例如,以下两项都失败,错误为“指定的位置不允许数据更改表引用”(我正在运行DB2forIv7.1): 在单独的CREATE TABLE语句中创建mySchema.otherTab

该子句非常适合在DB2中从DML获取值,例如:

SELECT id
FROM FINAL TABLE
( 
  INSERT INTO mySchema.myTable (val)
  VALUES ('data')
)            
但是,似乎没有办法将此查询的结果存储到另一个表中,将内容持久化到某个地方。例如,以下两项都失败,错误为“指定的位置不允许数据更改表引用”(我正在运行DB2forIv7.1):

在单独的CREATE TABLE语句中创建mySchema.otherTable后,此操作也会失败:

INSERT INTO mySchema.otherTable (ID)
SELECT id
FROM FINAL TABLE
( 
  INSERT INTO mySchema.myTable (val)
  VALUES ('data')
)

不确定这是否适用于i系列,但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
)

今天,我尝试在IBMi操作系统V7R1上使用FINAL TABLE技术,但在尝试将标识列值提供给第二个insert时,它无法像DB2forLUW上所描述的那样工作。我预计我们最终会获得这种能力

作为替代方案,我能够使用SET命令将分配的标识列值路由到一个SQL全局变量,然后使用该全局变量将相同的标识列值分配给两个相关关联表的两个后续插入。对于非编译SQL脚本,这是一种用于服务器端解决方案的好技术,直到我们获得与DB2forLUW相同的功能。临时桌也可以

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

一般来说,当您试图插入包含“父”表ID的其他行时,您有多个目标表。由于插入只能命中一个表,因此需要多个表。。。在哪一点上,您必须以任何方式突破单个语句(即,到您的应用程序层,或在存储过程中)。。。。在这一点上,您想要的“功能”是不必要的/有用的。我不同意,这个想法是将ID存储在一个临时对象中,可以利用它在后续DML语句中插入任意多个“子”表。这在SQL Server(和Oracle)中非常简单,例如,使用OUTPUT子句将临时表作为可组合DML的目标。不幸的是,这也会导致“指定的位置不允许数据更改表引用”似乎根本不允许在CTE中使用数据更改表引用。这一定是System i的限制。或者您的声明中可能存在其他错误,因为根据fine手册,数据更改声明我认为是前者,这似乎是错误SQ20165,如中所述。我认为上面的例子不符合“外部fullselect”的条件。还有其他恼人的限制。也就是说,下面的示例失败了:select*from old table(从mySchema.myTable中删除)@mustaccio的链接引用提到select语句中的
数据更改表引用使光标为只读。这意味着不能使用“更新当前位置”和“删除当前位置”。
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' )
;