Обновить или вставить несколько строк в таблицу в DB2 - PullRequest
0 голосов
/ 29 марта 2020

У меня есть таблица с 3 столбцами (ID, NAME, DESCRIPTION). «ID» является первичным ключом. Поскольку следующий запрос в MySQL для вставки / обновления двух строк, я хочу написать запрос для таблицы базы данных DB2.

INSERT INTO <Table name> (ID, NAME, DESCRIPTION) VALUES(?, ?, ?), (?, ?, ?)
ON DUPLICATE KEY UPDATE NAME = VALUES(NAME), DESCRIPTION = VALUES(DESCRIPTION);

Я попытался изменить следующий запрос MERGE INTO вставить / обновить две строки в таблице базы данных DB2, но мне не удалось.

MERGE INTO <Table name> USING "SYSIBM".DUAL ON (ID= ?)
WHEN MATCHED THEN UPDATE SET NAME= ? , DESCRIPTION= ? 
WHEN NOT MATCHED THEN INSERT (ID,NAME,DESCRIPTION) VALUES (?, ?, ?);

Как мне это сделать?

1 Ответ

0 голосов
/ 29 марта 2020

Попробуйте это:

--#SET TERMINATOR @
DECLARE GLOBAL TEMPORARY TABLE SESSION.MYTAB (ID INT, NAME VARCHAR(10), DESCRIPTION VARCHAR(20)) 
WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED
@

BEGIN
  DECLARE V_ID1   INT         DEFAULT 1; 
  DECLARE V_NAME1 VARCHAR(10) DEFAULT 'NAME1'; 
  DECLARE V_DESC1 VARCHAR(20) DEFAULT 'DESC1'; 
  DECLARE V_ID2   INT         DEFAULT 2; 
  DECLARE V_NAME2 VARCHAR(10) DEFAULT 'NAME2'; 
  DECLARE V_DESC2 VARCHAR(20) DEFAULT 'DESC2'; 

  PREPARE S1 FROM '
  MERGE INTO SESSION.MYTAB T USING 
  (
  VALUES
    (CAST(? AS INT), CAST(? AS VARCHAR(10)), CAST(? AS VARCHAR(20)))
  , (CAST(? AS INT), CAST(? AS VARCHAR(10)), CAST(? AS VARCHAR(20)))
  ) S (ID, NAME, DESCRIPTION) ON T.ID = S.ID
  WHEN     MATCHED THEN UPDATE SET NAME = S.NAME, DESCRIPTION = S.DESCRIPTION 
  WHEN NOT MATCHED THEN INSERT (ID, NAME, DESCRIPTION) VALUES (S.ID, S.NAME, S.DESCRIPTION)
  ';

  EXECUTE S1 USING 
    V_ID1, V_NAME1, V_DESC1
  , V_ID2, V_NAME2, V_DESC2;
END
@

SELECT * FROM SESSION.MYTAB
@
...