Oracle游标批量提交,解决更新大批量数据耗尽内存的问题

一,业务场景

Oracle 更新数据时,数据库会对整个更新动作做一个事务,如果一次更新的记录太大会用完内存,导致影响业务运行。

二,解决办法

思路就是用游标处理每条数据,安需批量提交。

三、举例

我们要更新某个渠道的订单的所有商品的价格,我们每2万行提交一次。

参考脚本

declare
    v_count integer;
begin
    v_count := 0;
    for i in (
        --这里可以把要修复的数据放临时表,或者关联查询把数据准备好
        select h.ID, i.ID as ITEM_ID, i.ORIGIN_PRICE
        from ORDERS h
                 join ORDERS_ITEM i on h.ID = i.ORDER_ID
        where h.CHANNEL_ID = 'A'
        )
        loop
            v_count := v_count + 1;

            update ORDERS_ITEM t
            set t.ACTUAL_PRICE = i.ORIGIN_PRICE
            where t.ID = i.ITEM_ID;

            if (MOD(v_count, 20000) = 0) -- 每两万行提交一次
            then
                commit;
            end if;
        end loop;
    commit;
end;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值