能否在Merge语句中实现循环,每6000行提交一次。

问题描述 投票:0回答:1

合并报表示例如下

 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
1个回答
1
投票

你可以使用复合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
@
© www.soinside.com 2019 - 2024. All rights reserved.