您的位置:首页 > 数据库 > Oracle

[Oracle]高效的PL/SQL程序设计(四)--批量处理

2009-09-23 13:58 531 查看

本系列文章导航

[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


    Process data;


    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


 type array is table of user_tables%rowtype;


 l_data array;


 cursor c is select * from user_tables;


begin


     open c;


     loop


         fetch c bulk collect into l_data limit p_array_size;


         


         forall i 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_tablename dbms_sql.Varchar2_Table;


 cursor c is select table_name from user_tables;


begin


     open c;


     loop


         fetch c bulk collect into l_tablename limit p_array_size;


         


         forall i 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.csdn.net/huanghui22/archive/2007/05/22/1621290.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息