db2 - 是否可以在 Merge 语句中实现循环并在每 6000 行中提交一次
问题描述
示例合并语句如下
MERGE INTO table_to_upsert AS tab
USING (SELECT * FROM B
) merge
ON tab.key_to_match = merge.key_to_match
WHEN MATCHED THEN
UPDATE SET tab.C1 = merge.C1,
tab.C2 = merge.C2,
tab.C3 = merge.C3
WHEN NOT MATCHED THEN
INSERT (C1, C2, C3)
VALUES (merge.C1, merge.C2, merge.C3)
有没有办法在循环中运行合并语句并在每 6000 行上应用提交..
试图实现上面的 sql,而不是一次提交所有行,有没有办法为每 6000 行提交..?
解决方案
您可以使用复合 sql 来组织B
记录循环。
--#SET TERMINATOR @
BEGIN
DECLARE L_COMMIT_SIZE INT DEFAULT 6000;
DECLARE L_COMMIT_CNTR INT DEFAULT 0;
FOR V AS CUR CURSOR WITH HOLD FOR SELECT key_to_match, c1 FROM B
DO
MERGE INTO table_to_upsert t
USING TABLE(VALUES (V.key_to_match, V.c1)) m (key_to_match, c1)
ON t.key_to_match = m.key_to_match
WHEN MATCHED THEN UPDATE SET C1 = m.C1
WHEN NOT MATCHED THEN INSERT (key_to_match, C1) VALUES (V.key_to_match, V.c1);
SET L_COMMIT_CNTR = L_COMMIT_CNTR + 1;
IF L_COMMIT_SIZE = L_COMMIT_CNTR THEN
COMMIT;
SET L_COMMIT_CNTR = 0;
END IF;
END FOR;
COMMIT;
END
@
推荐阅读
- clojure - 为什么`into` a map (`(into {} ,,,)`) 在 Clojure 中适用于 `vectors` 但不适用于 `lists`?
- c - 是否可以查看已编译 C 程序的宏?
- python - 使用一组迭代步骤迭代基于列表的列表
- javascript - 关闭或隐藏 iframe
- python - Python 的 multiprocessing.shared_memory.SharedMemory.close 是否必要(在这种情况下)?
- node.js - “预期未定义为 GraphQL 类型”的含义?
- assembly - 为什么“向未声明的段发送代码或数据”?
- python - 在仪表板上显示模型摘要
- javascript - 我的程序效率不高。有没有更短的方法来解决它?
- matlab - 在 MATLAB 中同步和合并时间表列?