对于大数据量的insert into select的做法,我个人来说不赞成这样做,现实也没这样做,对此,我通过oracle的存储过程写了个大数据量的insert into select 的分批插入方法,代码如下
- createorreplaceprocedurelargedata_insert(ip_table_nameinvarchar2,--目标表
- ip_table_columninvarchar2,--目标字段
- ip_table_selectinvarchar2,--SELECT查询语句
- return_resultoutnumber--返回的结果1,表示成功,0表示失败
- )as
- --适合大数据量的插入模板createTemplatesbychenzhoumin20110614
- runTimenumber;
- inumber;
- amountnumber;
- s_sqlvarchar2(5000);
- begin
- return_result:=0;--开始初始化为0
- --核必逻辑内容,可根据具体的业务逻辑来定义
- s_sql:='selectcount(1)from('||ip_table_select||')';
- executeimmediates_sql
- intoamount;
- --每100万提交一次
- runTime:=amountmod1000000;
- if(runTime>0)then
- runTime:=1+trunc(amount/1000000);
- endif;
- if(runTime=0)then
- runTime:=0+trunc(amount/1000000);
- endif;
- FORiIN1..runTimeLOOP
- executeimmediate'insertinto'||ip_table_name||'('||
- ip_table_column||')
- select'||ip_table_column||'from(selectselectSec.*,rownumrownumType
- from('||ip_table_select||
- ')selectSec
- WHEREROWNUM<='||i*1000000||')
- WHERErownumType>'||(i-1)*1000000;
- --提交
- commit;
- ENDLOOP;
- return_result:=1;
- dbms_output.put_line('结束'||to_char(sysdate,'yyyymmddhh24miss'));
- return;
- exception
- whenothersthen
- return_result:=0;
- raise;
- return;
- end;
以上代码的意思是每100W就向数据库提交一次