使用Bulk Binding批量绑定的模式高效处理ORACLE大量数据

       用批量绑定(bulk binding)的方式。当循环执行一个绑定变量的sql语句时候,在PL/SQL 和SQL引擎(engines)中,会发生大量的上下文切换(context switches)。使用bulk binding,能将数据批量的从plsql引擎传到sql引擎,从而减少上下文切换过程,提升效率。

       在Oracle使用过程中经常会遇到需要插入大量数据的情况,这种情况下就可以使用Bulk Binding插入数据。

      参考资料:Oracle逐行提交、批量提交及极限提速方法

        ORACLE Bulk Binding批量绑定

       Oracle PL/SQL 优化与调整 -- Bulk 说明

 

参考代码:

DECLARE
  -- Local variables here
  l_date_f DATE;
  l_date_t DATE;
  TYPE t_event_id IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  l_event_id t_event_id;

  CURSOR c_data(p_date_f DATE, p_date_t DATE) IS
    SELECT xe.event_id,
           xe.event_date,
           xe.application_id,
           xe.process_status_code
      FROM xla_events xe
     WHERE xe.application_id = 707
       AND xe.process_status_code <> 'P'
       AND xe.event_date > p_date_f
       AND xe.event_date <= p_date_t;

  TYPE t_tab IS TABLE OF c_data%ROWTYPE;
  l_event t_tab;
BEGIN
  -- Test statements here
  l_date_f := to_date('2008/01/01', 'yyyy/dd');
  l_date_t := to_date('2017/05/31', 'yyyy/dd');

  FOR i IN 1 .. (l_date_t - l_date_f) LOOP
    --dbms_output.put_line('l_date_f:'||to_char(l_date_f+i-1,'yyyy/dd'));
    --dbms_output.put_line('l_date_t:'||to_char(l_date_f+i,'yyyy/dd'));
  
    OPEN c_data(l_date_f + i - 1, l_date_f + i);
    LOOP
      FETCH c_data BULK COLLECT
        INTO l_event LIMIT 10000;
      --dbms_output.put_line(l_event.count);
      EXIT WHEN l_event.count = 0;
      FORALL j IN 1 .. l_event.count
        INSERT INTO xla_events_bak
          (application_id,
           event_id,
           event_date,
           event_status_code,
           process_status_code)
        VALUES
          (l_event(j).application_id,
           l_event(j).event_id,
           l_event(j).event_date,
           l_event(j).event_status_code,
           l_event(j).process_status_code);
    
      FORALL j IN 1 .. l_event.count
        UPDATE xla_events xe
           SET xe.process_status_code = 'P', xe.event_status_code = 'P'
         WHERE xe.event_id = l_event(j).event_id
           AND xe.application_id = l_event(j).application_id;
    
      COMMIT;
    END LOOP;
    CLOSE c_data;
  END LOOP;
END;

 

        

转载于:https://www.cnblogs.com/huanghongbo/p/7426676.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值