Oracle案例:利用存储过程进行表数据分离(三)

2015-01-21 12:14:13 · 作者: · 浏览: 14
----------- ------------- ------------- -------------
ARCHSTATUS? ? ? ? ? ARCHERRORCODE
-------------------- --------------------
ARCHERRORMSG
----------------------------------------------------------------------------------------------------------------------------------



2014-12-30 10:44:28 2014-12-30 10:44:28 2014-12-30 10:44:28? ? ? ? ? ? 0? ? ? ? ? ? 0? ? ? ? ? ? 0? ? ? ? ? ? 0
success


?


?



SQL>


?



发现执行detach_pro的速度很快,而且原表和归档表的记录都没有发生变化,因为status=8不符合筛选条件,执行存储过程并不会进行迁移操作,即使没有操作成功。由于刚才执行了2次存储过程,就会在记录表中生成2行操作结果的记录



--第3次测试(再次插入1000条符合筛选条件的记录,status=9)
SQL> begin


? 2? for i in 1..1000
? 3? loop
? 4? insert into tabhdr values(i,9);
? 5? insert into tabdet values(i);
? 6? end loop;
? 7? commit;
? 8? end;
? 9? /



PL/SQL procedure successfully completed.



SQL> exec detach_pro;



PL/SQL procedure successfully completed.



SQL> select count(*) from tabdet;


?


? COUNT(*)
----------
? ? 9000



SQL> select count(*) from tabhdr;



? COUNT(*)
----------
? ? 10000



SQL> select count(*) from arch_tabdet;



? COUNT(*)
----------
? ? 102000



SQL> select count(*) from arch_tabhdr;



? COUNT(*)
----------
? ? 101000



SQL> select * from arch_log;



ARCHBEGINTIME? ? ? ARCHMIDDLETIME? ? ? ARCHENDTIME? ? ? ? ARCHINSCOUNT1 ARCHDELCOUNT1 ARCHINSCOUNT2 ARCHDELCOUNT2
------------------- ------------------- ------------------- ------------- ------------- ------------- -------------
ARCHSTATUS? ? ? ? ? ARCHERRORCODE
-------------------- --------------------
ARCHERRORMSG
----------------------------------------------------------------------------------------------------------------------------------
2014-12-30 10:30:45 2014-12-30 10:30:53 2014-12-30 10:31:02? ? ? ? 100000? ? ? ? 100000? ? ? ? 100000? ? ? ? 100000
success


?



2014-12-30 10:43:38 2014-12-30 10:43:38 2014-12-30 10:43:38? ? ? ? ? ? 0? ? ? ? ? ? 0? ? ? ? ? ? 0? ? ? ? ? ? 0
success


?



ARCHBEGINTIME? ? ? ARCHMIDDLETIME? ? ? ARCHENDTIME? ? ? ? ARCHINSCOUNT1 ARCHDELCOUNT1 ARCHINSCOUNT2 ARCHDELCOUNT2
------------------- ------------------- ------------------- ------------- ------------- ------------- -------------
ARCHSTATUS? ? ? ? ? ARCHERRORCODE
-------------------- --------------------
ARCHERRORMSG
----------------------------------------------------------------------------------------------------------------------------------



2014-12-30 10:44:28 2014-12-30 10:44:28 2014-12-30 10:44:28? ? ? ? ? ? 0? ? ? ? ? ? 0? ? ? ? ? ? 0? ? ? ? ? ? 0
success


?



2014-12-30 10:53:15 2014-12-30 10:53:15 2014-12-30 10:53:15? ? ? ? ? 2000? ? ? ? ? 2000? ? ? ? ? 1000? ? ? ? ? 1000
success



ARCHBEGINTIME? ? ? ARCHMIDDLETIME? ? ? ARCHENDTIME? ? ? ? ARCHINSCOUNT1 ARCHDELCOUNT1 ARCHINSCOUNT2 ARCHDELCOUNT2
------------------- ------------------- ------------------- ------------- ------------- ------------- -------------
ARCHSTATUS? ? ? ? ? ARCHERRORCODE
-------------------- --------------------
ARCHERRORMSG
----------------------------------------------------------------------------------------------------------------------------------



第一次迁移操作:
tabdet表中的2000行记录被插入到arch_tabdet表中,然后删除tabdet表中的2000行相应记录;
因此结果是tabdet表剩下9000条记录,arch_tabdet表增加到12000条记录。



第二次迁移操作:


tabhdr表中的1000行记录被插入到arch_tabhdr表中,然后删除tabhdr表中的1000行相应记录;
因此结果是tabhdr表剩下10000条记录,arch_tabhdr表增加到11000条记录。



在实际生产中,具体是哪些符合迁移条件的表是根据存储过程中具体的where条件来定的,这里的测试并不一定很准确。



最后,可以通过创建job来定期自动运行存储过程,如:
declare


v_jobnum number;
begin
dbms_job.submit(v_jobnum,'detach_pro',sysdate,'sysdate