Oracle批量事务更新大量数据


在工作中曾经遇到过需要更新生产环境中一张千万级别的表数据,直接全表用update效率太低了,写了一个脚本来实现分批数据更新,更新了千万级别数据大概需要10分钟

--打开日志信息输出到控制台
SET SERVEROUTPUT ON;
DECLARE
    --声明数组,存放主键id
    TYPE t_id IS TABLE OF CVSDB.BVS_UNITY_MSG.ID%TYPE;
    v_id t_id;

    --取数游标
    CURSOR cur IS
    SELECT ID FROM CVSDB.BVS_UNITY_MSG WHERE MSG_TYPE = '3' AND SEND_STATUS = '0';

    --更新数量
    v_cnt INTEGER := 0;

BEGIN
    OPEN cur;

    --循环取数
    LOOP
    EXIT WHEN cur%NOTFOUND;

    --每次批量检索结果:10000条记录
    FETCH cur BULK COLLET INTO v_id LIMIT 10000;

    --批量发送更新语句
    FORALL i IN 1...v_id.COUNT
    UPDATE CVSDB.BVS_UNITY_MSG SET SEND_STATUS = '1', UPDATOR = 'SCRIPT_BATCH_UPD', UPDATE_TIME = CURRENT_TIMESTAMP WHERE ID = v_id(i);
    COMMIT;

    v_cnt := v_cnt + v_id.COUNT;

    END LOOP;

    CLOSE cur;

    DBMS_OUTPUT.PUT_LINE('UPDATE DATA SUCCESSFULLY: '||v_cnt);

    --异常回滚
    EXCEPTION
    WHEN OTHER THEN
    DBMS_OUTPUT.PUT_LINE('UPDATE DATA ERROR, ROLLBACK...');
    ROLLBACK;
END;
/

文章作者: 瑞士军刀废
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 瑞士军刀废 !
评论
  目录