本系列文章导航
[Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧
[Oracle]高效的PL/SQL程序设计(二)--标量子查询
[Oracle]高效的PL/SQL程序设计(三)--Package的优点
[Oracle]高效的PL/SQL程序设计(四)--批量处理
[Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
[Oracle]高效的PL/SQL程序设计(六)--%ROWTYPE的使用
批量处理一般用在ETL操作, ETL代表提取(extract),转换(transform),装载(load), 是一个数据仓库的词汇!
类似于下面的结构:
for
x(
select
*
from
...)
loop
Processdata;
insert
into
table
values
(...);
end
loop;
一般情况下, 我们处理大笔的数据插入动作, 有2种做法, 第一种就是一笔笔的循环插入
create
table
t1
as
select
*
from
user_tables
where
1
=
0
;
create
table
t2
as
select
*
from
user_tables
where
1
=
0
;
create
table
t3
as
select
table_name
from
user_tables
where
1
=
0
;
create
or
replace
procedure
Nor_Test
as
begin
for
x
in
(
select
*
from
user_tables)
loop
insert
into
t1
values
x;
end
loop;
end
;
第2种方法就是批量处理(insert全部字段):
create
or
replace
procedure
Bulk_Test1(p_array_size
in
number
)
as
typearray
is
table
of
user_tables
%
rowtype;
l_dataarray;
cursor
c
is
select
*
from
user_tables;
begin
open
c;
loop
fetch
c
bulk
collect
into
l_datalimitp_array_size;
foralli
in
1
..l_data.
count
insert
into
t2
values
l_data(i);
exit
when
c
%
notfound;
end
loop;
end
;
insert部分字段:
create
or
replace
procedure
Bulk_Test2(p_array_size
in
number
)
as
l_tablenamedbms_sql.Varchar2_Table;
cursor
c
is
select
table_name
from
user_tables;
begin
open
c;
loop
fetch
c
bulk
collect
into
l_tablenamelimitp_array_size;
foralli
in
1
..l_tablename.
count
insert
into
t3
values
(l_tablename(i));
exit
when
c
%
notfound;
end
loop;
end
;
在性能方面批量处理有着很大的优势, p_array_size一般默认都是100
博文来源:http://blog.youkuaiyun.com/huanghui22/archive/2007/05/22/1621290.aspx
Oracle批量处理技巧
本文介绍Oracle数据库中批量处理的方法及其实现方式,包括通过循环逐条插入数据和使用批量插入提高效率的技术细节。同时对比了两种不同的批量处理方法,并提供了具体的实现代码。
955

被折叠的 条评论
为什么被折叠?



