通过 plsql 程序 分页复制表大量数据

--plsql程序将分页将表A数据 复制到 表B中,只需修改v_pagesize页面容量
 declare
   --总数据量
   v_count number;
   --页面容量
   v_pagesize number := 50;
   --总页数
   v_totalpage number;
   --取余的余数
   v_modnum number;
   --起始rownum
   v_startnum number;
   --终止rownum
   v_endnum number;
   --开始时间
   v_starttime number;
   --结束时间
   v_endtime number;
 begin
   --统计总数
   select count(*) into v_count from sf_base.oss_param_busi_actid;
   DBMS_OUTPUT.put_line('表oss_param_busi_actid共有' || v_count || '条数据。');
   
   --通过取余,判断总共分页数
   select mod(v_count, v_pagesize) into v_modnum from dual;
   if v_modnum=0 then
      v_totalpage :=  v_count / v_pagesize;
   else
      v_totalpage := (v_count - v_modnum) / v_pagesize + 1;
   end if;
   DBMS_OUTPUT.put_line('按照每页' || v_pagesize || '条数据,表B可以分为' || v_totalpage || '页。');
   
   --遍历取每页数据,插入到目标表中
   for v_index in 1..v_totalpage loop
     v_startnum := (v_index - 1)*v_pagesize;
     v_endnum := v_index*v_pagesize;
     --开始时间
     select (sysdate - to_date('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000 + to_number(to_char(systimestamp(3), 'FF')) into  v_starttime from dual; 
     --插入sql  
     insert into stu(id, name, age) (
          select b.field1, b.field2, b.field3 from (select  t.*, rownum as n from 表B t) b where n>v_startnum and n<=v_endnum);
     ---注意点:------请注意commit,提交就入库了---------
     --commit;
     --结束时间
     select (sysdate - to_date('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000 + to_number(to_char(systimestamp(3), 'FF')) into  v_endtime from dual;
     --判断最后一页 
     if v_index=v_totalpage then
        v_endnum := v_count;
     end if;
     DBMS_OUTPUT.put_line('第' ||(v_startnum + 1) || '~' ||v_endnum|| '条数据插入完毕。'|| '总共花费' || (v_endtime - v_starttime) || '毫秒。');
   end loop;
 end; 
/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值