【问题标题】:How can I INSERT data into two tables simultaneously with only one sql script db2?如何仅使用一个 sql 脚本 db2 同时将数据插入到两个表中?
【发布时间】:2017-03-04 04:36:59
【问题描述】:

如何在 db2 中使用一个 sql 脚本插入多个表

例如,在 T1 DOCK_DOOR 中插入一行,然后根据第一个表中的 dock_door_sysid 多次插入 T2 DOCK_DOOR_LANE

我的第一个方法如下。我试图使用带有三个插入的 a with 。另一方面,如果可以通过一次插入自动执行插入,则不是和选项。 感谢您的任何反馈

sql 示例

WITH ins AS (
  INSERT INTO DBF1.DOCK_DOOR    (DOCK_DOOR_SYSID,DOOR_NUMBER,DOOR_NAME,DOCK_SYSID,DOOR_SEQ,ENCRYPTION_CODE,RFID_ENBLD_FLAG,LANES_COUNT,CMNT_TEXT,CREATE_TS,CREATE_USERID,UPDATE_TS,UPDATE_USERID,VER_NUMBER,ACTIVE_FLAG,STATUS_SYSID,DOOR_TYPE_SYSID) 
VALUES (nextval for DBF1.DOCK_DOOR_SEQ,'026','DOOR025',61,25,NULL,'N','2',NULL,current timestamp,'SQL_INSERT',current timestamp,'SQL_INSERT',0,NULL,1723,1142)
  RETURNING door_number,dock_door_sysid),
ins2 AS (
INSERT INTO SIT.DOCK_DOOR_lane (DOCK_DOOR_LANE_SYSID,DOOR_LANE_ID,DOCK_DOOR_SYSID,LANE_ID,CREATE_TS,CREATE_USERID,UPDATE_TS,UPDATE_USERID,VER_NUMBER) 
VALUES (nextval for DBF1.DOCK_DOOR_LANE_seq,door_number||''||'A',dock_door_sysid,'A',current timestamp},'SQL_INSERT',current timestamp,'SQL_INSERT',0)
  SELECT door_number,dock_door_sysid FROM DBF1.DOCK_DOOR
  RETURNING door_number,dock_door_sysid)
INSERT INTO DBF1.DOCK_DOOR_lane (DOCK_DOOR_LANE_SYSID,DOOR_LANE_ID,DOCK_DOOR_SYSID,LANE_ID,CREATE_TS,CREATE_USERID,UPDATE_TS,UPDATE_USERID,VER_NUMBER) 
VALUES (nextval for DBF1.DOCK_DOOR_LANE_seq,door_number||''||'B',dock_door_sysid,'B',current timestamp},'SQL_INSERT',current timestamp,'SQL_INSERT',0)
SELECT door_number,dock_door_sysid FROM DBF1.DOCK_DOOR;

表 1 = dock_door

表 2 = Dock_door_lane

【问题讨论】:

  • 这是一个很好的问题,但我认为没有等价物。在 Oracle 中有一个 INSERT FIRST 和 INSERT ALL。在 SQL Server 中,有一个 OUTPUT 子句可让您链接多个操作。有什么理由不能将 INSERT 全部包装在事务中?
  • 感谢凯德的反馈。我希望这可能在 DB2 中成为可能,因为使用 SQL 插入三个连续的插入确实解决了这个难题,但这只有在只需要插入几条记录时才有用。简而言之,我希望避免这种情况,而不必编写一个小程序来自动化该过程。

标签: sql db2-400


【解决方案1】:

您可以使用dock_door 表上的触发器来实现。

但是,如果您使用的是 IBM i 上的最新版本。您也许可以使用data change table reference

你的陈述应该是这样的

insert into dock_door_lane
  select <....>
    from final table (insert into dock_door <...>)

我不确定它是否会起作用,因为 article 表明至少在几年前 DB2 for i 不支持所需的辅助插入。

这个旧的SO question 似乎也确认至少在 v7.1 中不支持双插入。

如果有机会,我会在周一在 7.2 系统上运行测试。

【讨论】:

  • 运行 v7.2 TR 4,插入中不支持数据更改表引用。我收到一个 SQ20165 错误。我在 v7.3 的“新增功能”部分也没有看到任何表明限制已解除的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多