在 DB2 中更新或插入多行到 Table
Update or Insert Multiple Rows into a Table in DB2
我有一个包含 3 列(ID、名称、描述)的 table。 'ID' 是主键。
如下面在MySQL到insert/update两个行的查询,我想为DB2数据库table.
写一个查询
INSERT INTO <Table name> (ID, NAME, DESCRIPTION) VALUES(?, ?, ?), (?, ?, ?)
ON DUPLICATE KEY UPDATE NAME = VALUES(NAME), DESCRIPTION = VALUES(DESCRIPTION);
我试图将以下 MERGE INTO 查询修改为 insert/update 两行到 DB2 数据库中的 table,但我失败了。
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 (?, ?, ?);
我该怎么做?
试试这个:
--#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
@
我有一个包含 3 列(ID、名称、描述)的 table。 'ID' 是主键。 如下面在MySQL到insert/update两个行的查询,我想为DB2数据库table.
写一个查询INSERT INTO <Table name> (ID, NAME, DESCRIPTION) VALUES(?, ?, ?), (?, ?, ?)
ON DUPLICATE KEY UPDATE NAME = VALUES(NAME), DESCRIPTION = VALUES(DESCRIPTION);
我试图将以下 MERGE INTO 查询修改为 insert/update 两行到 DB2 数据库中的 table,但我失败了。
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 (?, ?, ?);
我该怎么做?
试试这个:
--#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
@