期望使用DB2 NOT ATOMIC,我们如何解决这个问题?

时间:2019-05-28 19:01:32

标签: sql db2 db2-zos

我不确定,为什么在我的DB2 SQL编辑器(DB2 for z / OS)中执行以下SQL时出现以下错误

DECLARE GLOBAL TEMPORARY TABLE SESSION.VTI_GUI_TMP ( 
  ENCRP_PRC_RL_ID INTEGER NOT NULL,  
  PROC_SYS_CD VARCHAR(10) NOT NULL,  
  VER_KEY_SET_CD VARCHAR(10) NOT NULL,  
  TRNSLT_TP_CD VARCHAR(10) NOT NULL,  
  SET_INDEX_NUM VARCHAR(10) NOT NULL,  
  SET_MDK_DKI_NUM VARCHAR(10) NOT NULL,  
  PACKET_NUM INTEGER NOT NULL ) ON COMMIT PRESERVE ROWS; 

INSERT INTO SESSION.VTI_GUI_TMP ( 
  ENCRP_PRC_RL_ID, PROC_SYS_CD, VER_KEY_SET_CD, TRNSLT_TP_CD, 
  SET_INDEX_NUM, SET_MDK_DKI_NUM, PACKET_NUM
) 
VALUES (500159, 'DB', 'MDK', '0', '1', '001', 766473) 
UNION ALL 
(500151, 'DB', 'MDK', '0', '2', '002', 766473);

select * from SESSION.VTI_GUI_TMP; 

DROP TABLE SESSION.VTI_GUI_TMP; 

我在执行上面的SQL时遇到了下面的错误

  

关键字联盟的非法使用。预期没有原子标记。 SQLCODE = -199,SQLSTATE = 42601,DRIVER = 3.63.75 SQL代码:-199,SQL状态:42601

     

发生错误:        插入SESSION.VTI_GUI_TMP(ENCRP_PRC_RL_ID,PROC_SYS_CD,VER_KEY_SET_CD,TRNSLT_TP_CD,SET_INDEX_NUM,SET_MDK_DKI_NUM,PACKET_NUM)值(500159,'DB','MDK','0','1','500' ,“ DB”,“ MDK”,“ 0”,“ 2”,“ 002”,766473)

如何解决以上错误?我不想将SELECT语句与UNION ALL一起使用来修复。有什么办法可以使这项工作。

我正在使用下面的DB2版本

  SELECT GETVARIABLE('SYSIBM.VERSION') FROM SYSIBM.SYSDUMMY1
  -----------
  DSN11015

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

您不能使用两个单独的 INSERT语句吗?例如:

DECLARE GLOBAL TEMPORARY TABLE SESSION.VTI_GUI_TMP (
  ENCRP_PRC_RL_ID INTEGER NOT NULL, 
  PROC_SYS_CD VARCHAR(10) NOT NULL, 
  VER_KEY_SET_CD VARCHAR(10) NOT NULL, 
  TRNSLT_TP_CD VARCHAR(10) NOT NULL, 
  SET_INDEX_NUM VARCHAR(10) NOT NULL, 
  SET_MDK_DKI_NUM VARCHAR(10) NOT NULL, 
  PACKET_NUM INTEGER NOT NULL
) ON COMMIT PRESERVE ROWS; 

INSERT INTO SESSION.VTI_GUI_TMP (
  ENCRP_PRC_RL_ID, PROC_SYS_CD, VER_KEY_SET_CD, TRNSLT_TP_CD, 
  SET_INDEX_NUM, SET_MDK_DKI_NUM, PACKET_NUM
) VALUES (500159, 'DB', 'MDK', '0', '1', '001', 766473) 

INSERT INTO SESSION.VTI_GUI_TMP (
  ENCRP_PRC_RL_ID, PROC_SYS_CD, VER_KEY_SET_CD, TRNSLT_TP_CD, 
  SET_INDEX_NUM, SET_MDK_DKI_NUM, PACKET_NUM
) VALUES (500151, 'DB', 'MDK', '0', '2', '002', 766473);

或者也许:

INSERT INTO SESSION.VTI_GUI_TMP (
  ENCRP_PRC_RL_ID, PROC_SYS_CD, VER_KEY_SET_CD, TRNSLT_TP_CD, 
  SET_INDEX_NUM, SET_MDK_DKI_NUM, PACKET_NUM)
SELECT 500159, 'DB', 'MDK', '0', '1', '001', 766473 FROM sysibm.sysdummy1
UNION ALL
SELECT 500151, 'DB', 'MDK', '0', '2', '002', 766473 FROM sysibm.sysdummy1

答案 1 :(得分:0)

由于语法不正确,因此Db2尝试提供有关可能期望的指导。在示例SQL中,Db2认为您可能希望使用 multiple-row-insert ,其中期望 NOT ATOMIC 。对于INSERT语句,VALUES子句支持表达式DEFAULT和NULL(https://www.ibm.com/support/knowledgecenter/SSEPEK_12.0.0/sqlref/src/tpc/db2z_sql_insert.html)。当前不支持使用UNION ALL将VALUES插入。 @The Impaler提供的两个示例似乎是有效的语法:1)使用有效表达式的VALUES进行INSERT,以及2)使用fullselect的INSERT。