oracle存储过程大数据量insert

来源:互联网 发布:福山雅治结婚 知乎 编辑:程序博客网 时间:2024/05/10 19:08

对于大数据量的insert into select的做法,我个人来说不赞成这样做,现实也没这样做,对此,我通过oracle的存储过程写了个大数据量的insert into select 的分批插入方法,代码如下

 

 

view plain
  1. create or replace procedure largedata_insert(ip_table_name   in varchar2, --目标表  
  2.                                           ip_table_column in varchar2, --目标字段  
  3.                                           ip_table_select in varchar2, --SELECT 查询语句  
  4.                                           return_result   out number --返回的结果1,表示成功,0表示失败  
  5.                                           ) as  
  6. --适合大数据量的插入模板  create Templates by chenzhoumin 20110614  
  7.   runTime number;  
  8.   i       number;  
  9.   amount  number;  
  10.   s_sql   varchar2(5000);  
  11. begin  
  12.   return_result := 0; --开始初始化为0  
  13.   --核必逻辑内容,可根据具体的业务逻辑来定义  
  14.   s_sql := 'select count(1) from (' || ip_table_select || ')';  
  15.   execute immediate s_sql  
  16.     into amount;  
  17.   --每100万提交一次  
  18.   runTime := amount mod 1000000;  
  19.   if (runTime > 0) then  
  20.     runTime := 1 + trunc(amount / 1000000);  
  21.   end if;  
  22.   if (runTime = 0) then  
  23.     runTime := 0 + trunc(amount / 1000000);  
  24.   end if;  
  25.   FOR i IN 1 .. runTime LOOP  
  26.     execute immediate 'insert into ' || ip_table_name || ' (' ||  
  27.                       ip_table_column || ')  
  28.      select ' || ip_table_column || ' from (select selectSec.*, rownum rownumType  
  29.           from (' || ip_table_select ||  
  30.                       ') selectSec  
  31.          WHERE ROWNUM <= ' || i * 1000000 || ')  
  32.  WHERE rownumType > ' || (i - 1) * 1000000;  
  33.     --提交  
  34.     commit;  
  35.   END LOOP;  
  36.   return_result := 1;  
  37.   dbms_output.put_line('结束' || to_char(sysdate, 'yyyymmddhh24miss'));  
  38.   return;  
  39. exception  
  40.   when others then  
  41.     return_result := 0;  
  42.     raise;  
  43.     return;  
  44. end;  

 

以上代码的意思是每100W就向数据库提交一次