Oracle Bulk Binding
来源:互联网 发布:linux使用ftp上传文件 编辑:程序博客网 时间:2024/06/03 08:53
说明:以下内容整理自网络
-----------------------------------------
1. 通常在SQL语句中给PL/SQL变量赋值叫做绑定(Binding),一次绑定一个完整的集合称为批量绑定(Bulk Binding)。
2. 批量绑定(Bulk binds)可以通过减少在PL/SQL和SQL引擎之间的上下文切换(context switches )提高了性能. 产生的结果是在单程访问SQL Server引擎过程中执行的一组迭代,而不是SQL与PL/SQL之间的交替。这减少了两个引擎间上下文切换的额外负担。
缺点是:如果任何数据值产生了无效的更新(UPDATE),整组迭代都将被退回。
3. 批量绑定(Bulk binds)包括:
(1) Input collections, use the FORALL statement,一般用来改善DML(INSERT、UPDATE和DELETE) 操作的性能。
(2) Output collections, use BULK COLLECT clause,一般用来提高查询(SELECT)的性能。
4. 以下通过实例说明:
1)下面咱们对比一下for与forall的效率:
a. 创建测试表:
SQL> create table test(id number(10),name varchar2(80));表已创建。
b. 执行测试PL/SQL block:
declare type id_table_type is table of number(10) index by binary_integer; type name_table_type is table of varchar2(80) index by binary_integer; id_table id_table_type; name_table name_table_type; start_time number(10); end_time number(10); begin for i in 1..100000 loop id_table(i) := i; name_table(i) :='dylan'||i; end loop; delete from test; start_time:=dbms_utility.get_time; for i in 1..100000 loop insert into test values(id_table(i), name_table(i)); end loop; end_time := dbms_utility.get_time; dbms_output.put_line('循环cost: '||to_char((end_time-start_time)/100)); delete from test; start_time := dbms_utility.get_time; forall i in 1..100000 insert into test values(id_table(i), name_table(i)); end_time := dbms_utility.get_time; dbms_output.put_line('批量绑定cost: '||to_char((end_time-start_time)/100)); end; /
c. 测试结果:
----------------------------------
循环cost: 3.8
批量绑定cost: .27
PL/SQL 过程已成功完成。
2)在9i中使用forall语句时,必须具有连续的元素;从10g开始,通过使用indices of子句和values of子句,可以使用不连续的集合元素,这里forall跟for不一样的是它并不是一个循环语句。从10g开始,forall的语句有三种执行语法:
declare type test_table_type is table of varchar2(100); test_table test_table_type := test_table_type('dylan2','name','asdf'); begin forall i in 1..test_table.count update test set name = 'lucy' where name = 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;------------------------------------------
第二个元素更新的行数:1
第二个元素更新的行数:0
第二个元素更新的行数:0
PL/SQL 过程已成功完成。
3)bulk collect子句的另外一个使用环境就是在DML的返回子句中,执行dml操作会改变数据库数据,为了取得dml操作改变的数据,可以使用returning子句,为了取得dml所作用的多行数据,则需要使用bulk collect子句。例如:
declare type test_table_type is table of varchar2(20) index by binary_integer; test_table test_table_type; begin delete from test where name like 'dylan2222%' returning name bulk collect into test_table; for i in 1..test_table.count loop dbms_output.put_line(test_table(i)); end loop; end;
----------------------------
dylan2222
dylan22220
dylan22221
dylan22222
dylan22223
dylan22224
dylan22225
dylan22226
dylan22227
dylan22228
dylan22229
PL/SQL 过程已成功完成。
4)使用SAVE EXCEPTION语句处理Forall异常:
declaretype NumList is table of number;num_tab NumList :=NumList(100,0,110,300,0,199,200,0,400);bulk_errors EXCEPTION;PRAGMA EXCEPTION_INIT (bulk_errors, -24381);begin forall i in num_tab.first..num_tab.last SAVE EXCEPTIONS delete from orders where order_total < 500000/num_tab(i);EXCEPTION WHEN bulk_errors THEN dbms_output.put_line('Number of errors is: '|| SQL%BULK_EXCEPTIONS.COUNT); for j in 1..SQL%BULK_EXCEPTIONS.COUNT loop dbms_output.put_line(to_char(SQL%BULK_EXCEPTIONS(j).error_index) || '/' || SQLERRM(-SQL%BULK_EXCEPTIONS(j).error_code)); end loop;end;
Number of errors is: 3
2/ORA-01476: 除数为 0
5/ORA-01476: 除数为 0
8/ORA-01476: 除数为 0
PL/SQL 过程已成功完成。
------------------------
present by dylan.
- Oracle Bulk Binding
- ORACLE Bulk Binding批量绑定
- Bulk Binding
- Oracle bulk 示例
- Oracle bulk 示例
- Oracle数据库BULK COLLECT
- oracle bulk collect用法
- Oracle Bulk Collect 学习
- Oracle bulk 示例
- Oracle——Bulk
- Oracle bulk into clause
- Oracle Forall 与BULK COLLECT
- oracle forall 和 BULK COLLECT
- Oracle bulk Insert的用法
- oracle bulk collect for in
- Oracle的bulk collect使用
- Oracle 集合 bulk collect 例子
- oracle中bulk collect用法
- css/seo
- ZF2.0用户向导 —— 5. 路由及控制器
- android构建自定义的视图组件onMeasure
- wifi四种省电模式的控制
- Ubuntu下安装星际译王
- Oracle Bulk Binding
- eclipse不能自动编译
- Android读写XML(中)——SAX
- Hadoop RPC详细分析
- POI读取Excel
- 毕业后五年之内将决定你的一生 人生与励志
- 先写下以防忘了
- C++ DLL调用
- Android读写XML(下)——创建XML文档