首页 > 解决方案 > 是否可以在 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 行提交..?

标签: db2

解决方案


您可以使用复合 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
@

推荐阅读