DB2 NOT ATOMIC WAS Expected , как мы можем это исправить?

Я не уверен, почему я получаю приведенную ниже ошибку при выполнении приведенного ниже SQL в моем редакторе SQL для DB2 (DB2 для z/OS)

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

НЕЗАКОННОЕ ИСПОЛЬЗОВАНИЕ КЛЮЧЕВОГО СЛОВА UNION. ТОКЕН ДЛЯ НЕ АТОМНОГО БЫЛ ОЖИДАН. SQLCODE=-199, SQLSTATE=42601, ДРАЙВЕР=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', '0061', 3) ОБЪЕДИНЕНИЕ ВСЕ(500151, 'ДБ', 'МДК', '0', '2', '002', 766473)

Как мы можем исправить вышеуказанную ошибку? Я не хочу использовать оператор SELECT вместе с UNION ALL для исправления. Есть ли способ сделать эту работу.

Я использую приведенную ниже версию DB2.

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

Что я делаю не так?


person user1993412    schedule 28.05.2019    source источник
comment
Сообщение об ошибке просто означает, что сервер не может понять, что вы просите его сделать. Ваш оператор insert синтаксически неверен; вы путаете insert ... values... и insert ... select ... варианты. Выберите один и придерживайтесь его.   -  person mustaccio    schedule 29.05.2019


Ответы (2)


Разве вы не можете использовать два отдельных оператора 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
person The Impaler    schedule 28.05.2019
comment
Да, это сработает, но я до сих пор не уверен, почему я вижу ошибку NOT ATOMIC, и есть ли способ вставить ее в один оператор. - person user1993412; 28.05.2019
comment
@user1993412 user1993412 Ну... второй вариант вставляется с использованием одного оператора SQL. - person The Impaler; 28.05.2019
comment
@ user1993412 Я обновил второй вариант. Попробуйте. - person The Impaler; 29.05.2019

Так как синтаксис был неточным, Db2 попыталась дать рекомендации о том, чего можно ожидать. В примере SQL Db2 предположил, что вы можете использовать множественную вставку строк, где ожидается НЕ АТОМИЧЕСКИЙ. Для оператора INSERT предложение VALUES поддерживает выражение, DEFAULT и NULL (https://www.ibm.com/support/knowledgecenter/SSEPEK_12.0.0/sqlref/src/tpc/db2z_sql_insert.html). INSERT со VALUES с использованием UNION ALL в настоящее время не поддерживается. Два примера, предоставленные @The Impaler, кажутся допустимым синтаксисом: 1) INSERT со VALUES с использованием допустимых выражений и 2) INSERT с полной выборкой.

person meg    schedule 12.12.2019