当前位置:  数据库>oracle

多行数据的批处理之bulk collect

    来源: 互联网  发布时间:2017-06-17

    本文导语: 在写pl/sql的时候,很多时候都会用比较经典的模式,定义一个游标cursor,然后循环从游标中取值进行处理。 类似下面的格式declare cursor xxxx is xxxxx; begin loop cur in xxxxx loop xxxxx end loop; end; / 如果cursor中包含的数据太多的时候...

在写pl/sql的时候,很多时候都会用比较经典的模式,定义一个游标cursor,然后循环从游标中取值进行处理。
 类似下面的格式
declare
 cursor xxxx is xxxxx;
 begin
 loop cur in xxxxx loop
 xxxxx
 end loop;
 end;
 /

如果cursor中包含的数据太多的时候,可能会有性能问题,性能的考虑主要在于pl/sql引擎和sql引擎的切换,和编程中的上下文环境是类似的。
 这个时候可以考虑采用bulk collect 的方式直接一次性读取数据岛缓存然后从缓存中进一步处理。
 这种方式可以打个比方比较形象,比如 你带着一个新人去完成一个任务,可能一天他要问你100个问题,你是希望他每隔几分钟想到了就问你呢,还是让他自己把问题积累起来,专门设定一个时间来集中回答呢。可能你在忙另外一个事情,他问你一个问题,这个时候就会有上下文环境的切换,等你回答了之后,继续工作的时候,又一个问题来了,这时候又得进行一次切换。。。。
 比方说我们设定一个表test,希望把test里面的数据选择性的插入到test_all中去
 实现的原始Pl/sql如下:
declare
 cursor test_cursors is select object_id,object_name from test;
 begin
 for test_cursor in test_cursors loop
 dbms_output.put_line('object_id: '||test_cursor.object_id);
 insert into test_all values(test_cursor.object_id,test_cursor.object_name);
 end loop;
 commit;
 end;
 /

如果采用bulk collect 方式,就会是如下的方式:
 declare
  type id_t is table of test.object_id%type;
  type name_t is table of test.object_name%type;
  object_id id_t;
  object_name name_t;
  cursor test_cursors is select object_id,object_name from test;
  begin
  open test_cursors;
 fetch test_cursors bulk collect into object_id,object_name;
 close test_cursors;
  for i in object_id.FIRST .. object_id.LAST loop
  dbms_output.put_line('object_id: '||object_id(i));
  insert into test_all values(object_id(i),object_name(i));
  end loop;
  commit;
  end;
  /


或者采用隐式游标的方式:
 declare
  type id_t is table of test.object_id%type;
  type name_t is table of test.object_name%type;
  object_id id_t;
  object_name name_t;
  begin
  select object_id,object_name bulk collect into object_id,object_name from test where rownum


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • eidt.jsp对网页进行编辑,网页内容存放在数据库中,其中有些字段用textarea多行编辑框显示,保存提交数据库后,再次对它编辑,那些用多行
  • Python实现多行注释的另类方法
  • 多行 grep 工具 mgrep
  • 提示文字怎样才能按多行显示?
  • 怎样才能使JTable可以在一行中多行显示单元内容?
  • 用VIM做多行匹配,怎样才能将匹配结果输出到文件?
  • shell多行匹配如何实现
  • mysql如何将多行数据合并成一行
  • 如何给String加回车,既给一个string赋多行值,立刻给分
  • echo 能回显多行内容吗?
  • 多行文字TextArea的问题
  • 求救:sed 删除多行!!!
  • 怎么在命令行下输入多行文字
  • eidt.jsp对网页进行编辑,网页内容存放在数据库中,其中有些字段用textarea多行编辑框显示,保存提交数据库后,再次对它编辑,那些用多行 iis7站长之家
  • 求助啊,可多行选择的下拉列表的取值问题,马上给分!
  • 多行 文本框 怎样产生 换行 (在线 等待)
  • 求问怎么匹配多行文本
  • Shell编程的,可以在shell中访问多行的属性吗?如:
  • sed命令删除多行数据
  • mysql利用group_concat()合并多行数据到一行


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3