听说bulk into 能减少SQL和PLSQL之间的切换! 可本公司采用cur cur_mms_send is  --返回数量有500万行
  select provcode from table_a 
open cur_mms_send;
 loop
   fetch cur_detail bulk collect into
     l_ary_provcode_tmp1
    limit 10000;
    
   forall i in 1..l_ary_provcode_tmp1.count 
    insert into sms_down
    (
        provcode
       )
    values
    (
      l_ary_provcode_tmp1(i)
    );
    commit;
   exit when cur_mms_send%notfound or cur_mms_send%notfound is null;             
   end loop;  
   close cur_mms_send; 
上面本来可以用一条语句实现
Insert into sms_down
 select provcode from table_a ;好像并没有发生切换问题!
1 bulk 在什么情况下会发生切换很多次
2 上面本来一条语句实现的 大数量下为什么也要采用BULK INTO 方法?

解决方案 »

  1.   

    使用BULK COLLECT,你可以通过一个显式或隐式游标,只需循环一次就能从数据库中取出多行记录。BULK COLLECT减少了PL/SQL和SQL引擎之间的上下文交换,因此减少了检索数据的开销。
    特别是对于某些时候,我们需要使用游标一条记录、一条记录地处理,就可能使用了多次循环。在这种情况,我们就可以使用批量集合,一次性地把记录取出,放入一个集合变量中,然后再对该变量进行处理,减少系统的开销。
    LIMIT对于BULK COLLECT来说是非常有用的。它帮助你清楚地了解并管理程序所用到过程数据。比如说,你要精确地查询并处理1000条记录。你可以使用BULK COLLECT来取出这些记录,并且产生了一个相对较大的集合。但是这种方法会消耗许多PGA(全局进程区)内存。如果这个代码是被很多独立的会话使用,那么你的应用就会因为PGA频繁的页面交换而效率低下。
      

  2.   

    通过bulk collect减少loop处理的开销 采用bulk collect可以将查询结果一次性地加载到collections中。 
    而不是通过cursor一条一条地处理。 
    注意在使用bulk collect时,所有的into变量都必须是collections. 
      

  3.   


    open cursor;
    loop
      fetch  cursor bulk collect  limite 1
    end loop ;
      如果limite1的话 还是跟普通游标一样了