免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 890 | 回复: 0
打印 上一主题 下一主题

oracle批量绑定的概念 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-19 13:56 |只看该作者 |倒序浏览
从oracle9i开始,oracle提供批量绑定关键词forall和bulk collect通过批量绑定技术,极大地加快了数据的处理速度。在不使用批量绑定的时候,为了将嵌套表中的数据插入数据库表中,需要循环执行insert语句,而使用forall关键词可以让所有插入内容集中在一次insert中执行,从而加快了执行速度。Bulk collect子句用于取得批量数据,该子句只能用于select语句、fetch语句和DML返回子句中;而forall语句只适用于执行批量的DML操作。
declare
 type id_table_type istableofnumber(6) indexbybinary_integer;
 type name_table_type istableofvarchar2(10) indexbybinary_integer;
 id_table id_table_type;
 name_table name_table_type;
 start_time number(10);
 end_time number(10);
begin
 for i in1..100000loop
    id_table(i) := i;
    name_table(i) := 'name'||i;
 endloop;
 deletefrom demo;
 start_time := dbms_utility.get_time;
 for i in1..100000loop
    insertinto demo values(id_table(i),name_table(i));
 endloop;
 end_time := dbms_utility.get_time;
 dbms_output.put_line('花费时间:'||to_char((end_time-start_time)/100));
 
 deletefrom demo;
 start_time := dbms_utility.get_time;
 forall i in1..100000
    insertinto demo values(id_table(i),name_table(i));
 end_time := dbms_utility.get_time;
 dbms_output.put_line('花费时间:'||to_char((end_time-start_time)/100));
end;
在oracle9i中,当使用forall语句时,必须具有连续的元素;从10g开始,通过使用indices of子句和values of子句,可以使用不连续的集合元素,这里forall跟for不一样的是它并不是一个循环语句。从10g开始,forall的语句有三种执行语法:
l         Forall index in lower_bound..upper_bound sql_statement; 其中index是隐含定义的整数变量,lower_bound和upper_bound为集合元素的上下限。
l         Forall index in indices of collection [between lower_bound..upper_bound] sql_statement;其中collection为嵌套表名称,这里只取嵌套表collection中下标位于lower_bound和upper_bound之间的非空元素值。
l         Forall index in values of index_collection sql_statement; 其中index_collection为存储下标的集合变量,就是说本集合变量的内容为要取的集合collection的下标,例如(2,3,5)。
另外,为了记录forall更新的行数,特别定义了sql%bulk_rowcount,使用方法如下。
declare
 type test_table_type istableofvarchar2(100);
 test_table test_table_type := test_table_type('name2','name','asdf');
begin
 forall i in1..test_table.count
    update demo setname = 'zhanglei'wherename = test_table(i);
 dbms_output.put_line('第二个元素更新的行数:'||sql%bulk_rowcount(1));
dbms_output.put_line('第二个元素更新的行数:'||sql%bulk_rowcount(2));
 dbms_output.put_line('第二个元素更新的行数:'||sql%bulk_rowcount(3));
end;
bulk collect子句用于取得批量数据,它只适用于select into语句,fetch into语句和dml返回子句。语法为 select * bulk collect into collection_name …其中collection_name为集合名称。
declare
 type test_table_type istableofvarchar2(20) indexbybinary_integer;
 test_table test_table_type;
begin
 selectnamebulkcollectinto test_table from demo wherename = 'zhanglei';
 for i in1..test_table.countloop
    dbms_output.put_line(test_table(i));
 endloop;
end;
bulk collect子句的另外一个使用环境就是在DML的返回子句中,执行dml操作会改变数据库数据,为了取得dml操作改变的数据,可以使用returning子句,为了取得dml所作用的多行数据,则需要使用bulk collect子句。
declare
 type test_table_type istableofvarchar2(20) indexbybinary_integer;
 test_table test_table_type;
begin
 deletefrom demo wherename = 'zhanglei'
 returningnamebulkcollectinto test_table;
 for i in1..test_table.countloop
    dbms_output.put_line(test_table(i));
 endloop;
end;
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/47522341/archive/2008/03/18/2195131.aspx
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP