多语言展示
当前在线:1744今日阅读:155今日分享:35

一定时间段内并发导入数据(oracle动态游标使用)

在一段时间内并发地从旧表中导入数据到新表!原因:由于表CLMXX为非分区表,且数据量已达T级,每天仍有140多万条数据插入,造成该表的查询业务非常缓慢。我将表A改造成range分区表(分区列jgsj为 date类型,按每天分区如一个分区CLMXX20150310),原始表A rename成CLMXX_3,当时只是将2个月内的数据导入分区表中,因为当时导入数据的时候使用insert select 并且设置了nologing模式,所以导入的速度比较快,现在分区表已经创建了,但是由于查询业务的需要,还需要将原始表CLMXX_3两年内的数据导入表B中!测试:测试了一下:将CLMXX_3表一天内的数据(如:2015-03-10 00:00:00
方法/步骤
1

1:创建临时表,并按一定的数据create table ZXX.TEST_TIME(  T_TIME   VARCHAR2(50),  T_STATUS VARCHAR2(1))插入数据如:insert into ZXX.TEST_TIME values('2013-08-08 00:00:00','0');T_STATUS 初始都为0

2

2:创建存储过程create or replace procedure pro_import_clmxxas  v_now_time number; --记录当前时间  type rec is table of clmxx_3%rowtype;--can not  sa.clmxx_3%rowtype;   --定义数据类型  recs rec; --申明数组  cursor c_exec_time is select * from zxx.test_time where t_status='0' and rownum < 2;--申明显示游标  type c_clmxx is ref cursor; --申明动态游标  l_c_clmxx c_clmxx;begin  v_now_time :=to_number(to_char(sysdate,'hh24')); ----记录当前时间的小时来判断是晚上还是白天  if (v_now_time > 17) or (v_now_time < 7) then     for r_exec_time in c_exec_time loop      update zxx.test_time set t_status='2' where t_time=r_exec_time.t_time; --锁定正在导入数据,防止后启动存储再次执行      commit;      open l_c_clmxx for select * from sa.clmxx_3 where jgsj >= to_date(r_exec_time.t_time,'yyyy-mm-dd hh24:mi:ss')                        and jgsj <  to_date(r_exec_time.t_time,'yyyy-mm-dd hh24:mi:ss')+1; --打开动态游标        while (true) loop         fetch l_c_clmxx bulk collect           into recs limit 1000;--每次存放1000个记录到数组中             forall i in 1 .. recs.count               insert into sa.clmxx values recs(i);--插入数组中的数据               commit;         exit when l_c_clmxx%notfound;        end loop;      close l_c_clmxx;      update zxx.test_time set t_status='1' where t_time=r_exec_time.t_time;--更新status状态      commit;    end loop;  end if;end;

3

3:创建jobdeclarejob number;begin  --每30分钟执行一次  sys.dbms_job.submit(job,'pro_import_clmxx;',sysdate,'sysdate+30/1440');end;job详细信息,参考我的经验:http://jingyan.baidu.com/article/a3761b2bbbdd2f1577f9aa75.html

4

4:验证以上步骤创建完成之后,一定要验证是否导入数据