【问题标题】:Update or Insert Multiple Rows into a Table in DB2在 DB2 的表中更新或插入多行
【发布时间】:2020-07-09 14:58:33
【问题描述】:

我有一个包含 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 (?, ?, ?);

我该怎么做?

【问题讨论】:

    标签: db2 insert-update upsert db2-luw


    【解决方案1】:

    试试这个:

    --#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
    @
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2014-07-10
      • 2016-11-21
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2014-06-26
      相关资源
      最近更新 更多