【发布时间】: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 插入三个连续的插入确实解决了这个难题,但这只有在只需要插入几条记录时才有用。简而言之,我希望避免这种情况,而不必编写一个小程序来自动化该过程。