首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

PL/SQL温习六 批量绑定

2012-08-25 
PL/SQL复习六 批量绑定一、效率比较1.不适用批量:declare?? ?type id_table_type is table of number(6) in

PL/SQL复习六 批量绑定

一、效率比较

1.不适用批量:

declare

?? ?type id_table_type is table of number(6) index by binary_integer;

?? ?type name_table_type is table of varchar2(10) 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..5000 loop

?? ?id_table(i) := i;

?? ?name_table(i) := 'name' || to_char(i);

??end loop;

??start_time := dbms_utility.get_time;

??for i in 1..id_table.count loop

?? ?insert into demo values(id_table(i),name_table(i));

??end loop;

??end_time := dbms_utility.get_time;

??dbms_output.put_line('总时间:'||to_char((end_time - start_time)/100));

end;

/

执行时间:0.25秒;

2.使用批量绑定:

declare

?? ?type id_table_type is table of number(6) index by binary_integer;

?? ?type name_table_type is table of varchar2(10) 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..5000 loop

?? ?id_table(i) := i;

?? ?name_table(i) := 'name' || to_char(i);

??end loop;

??start_time := dbms_utility.get_time;

?? ?--使用批量提取:

??forall i in 1..id_table.count?

?? ?insert into 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;

/

执行时间:0.03秒 ?快了将近8倍?


--------------------------------------------------------------------


二、批量绑定语法:

bulk collect: 用于取得批量数据,只能用于select、fetch和DML返回子句中

forall:只适用于执行批量的DML操作

1.forall语句:

语法:

1) ?forall index in lower_bound..upper_bound?

?? ? ? ? ? ? sql_statement;

2) forall index in indices of collection [between lower_bound and upper_bound]

?? ? ? ? ? sql_statement;

?? ?indices of 用于指定取得对应于collection集合元素下标的index值

3) forall index in values of index_collection

?? ? ? ? sql_statement;

?? ?value of 用于指定index值从集合变量index_collection中取得

注意:9i只能使用第一种

示例:

使用部分:

forall i in 8..10

??insert into demo(id) values(id_table(i));


indices of:用于指定取得对应于collection集合元素下标的index值

id_table := id_table_type(1,null,3,null,5);

forall i in indices of id_table

??delete from demo where id=id_table(i);


values of:用于指定index值从集合变量index_collection中取得

index_pointer := index_pointer_type(6,8,10);

forall i in values of index_pointer

??insert into new_demo values(in_table(i),name_table(i));

--插入的是表的6 8 10位元素 因为i是从表里面取的


sql%bulk_rowcount:

专门为forall语句提供,作用是取得在执行批量绑定操作时第i个元素所作用的行数

用法:sql%bulk_rowcount(2);--返回第2个元素的SQL所作用的行数


---------------------------------------------------------------------------------


三、批量提取

declare

??type emp_table_type is table of emp%rowtype index by binary_integer;

??emp_table emp_table_type;

begin

??select * bulk collect into emp_table from emp where deptno = &no;

??....

end;

/


returning:返回受影响的数据

declare

??type ename_table_type is table of emp.ename%type index by binary_integer;

??ename_table ename_table_type;

begin

??delete from emp where deptno = &no returning ename bulk collect into ename_table;

end;

/


?

热点排行