【问题标题】:DB2 NOT ATOMIC WAS Expected , how can we fix this?DB2 NOT ATOMIC WAS Expected ,我们如何解决这个问题?
【发布时间】:2019-05-28 19:01:31
【问题描述】:

我不确定,为什么在我的 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

错误发生在: 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) UN , 'DB', 'MDK', '0', '2', '002', 766473)

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

我正在使用以下 DB2 版本

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

我做错了什么?

【问题讨论】:

  • 错误信息仅仅意味着服务器无法理解你要求它做什么。您的 insert 语句在语法上无效;您正在混淆 insert ... values...insert ... select ... 变体。选择一个并坚持下去。

标签: sql db2 db2-zos


【解决方案1】:

你不能使用两个单独的 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

【讨论】:

  • 是的,这会起作用,但我仍然不确定,为什么我看到 NOT ATOMIC 错误,有没有办法我们可以在单个语句中插入。
  • @user1993412 嗯...第二个选项使用单个 SQL 语句插入。
  • @user1993412 我更新了第二个选项。试试看。
【解决方案2】:

由于语法不准确,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 的 INSERT 和 VALUES。 @The Impaler 提供的两个示例似乎是有效的语法:1) INSERT with VALUES using valid expression 和 2) INSERT with fullselect。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2020-02-18
    • 2019-10-14
    • 2020-03-25
    • 2020-02-14
    • 2020-07-30
    相关资源
    最近更新 更多