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

2015-01-21 12:14:13 · 作者: · 浏览: 11
te,'yyyy-mm-dd hh:mi:ss'), v_inscount1,v_delcount1,v_inscount2,v_delcount2,'success',null,null);
?51? ? commit;
?52? exception
?53? ? when others then
?54? ? ? ? v_errcode :=sqlcode;
?55? ? ? ? v_errerrm :=sqlerrm;
? ? ? insert into arch_log values (v_begintime,v_middletime,to_char(sysdate,'yyyy-mm-dd hh:mi:ss'),? v_inscount1,v_delcount1,v_inscount2,v_delcount2,'failure',v_errcode,v_errerrm);
?57? ? ? ? commit;
?58? end;
?59? /



Procedure created.



--开始第1次测试
SQL> select count(*) from tabdet;



? COUNT(*)
----------
? ? 100000



SQL> select count(*) from tabhdr;



? COUNT(*)
----------
? ? 100000


?



SQL> select count(*) from arch_tabdet;



? COUNT(*)
----------
? ? ? ? 0



SQL> select count(*) from arch_tabdet;



? COUNT(*)
----------
? ? ? ? 0



SQL> exec detach_pro;



PL/SQL procedure successfully completed.



SQL> select count(*) from tabdet;



? COUNT(*)
----------
? ? ? ? 0



SQL> select count(*) from tabhdr;



? COUNT(*)
----------
? ? ? ? 0



SQL> select count(*) from arch_tabdet;



? COUNT(*)
----------
? ? 100000



SQL> select count(*) from arch_tabhdr;



? COUNT(*)
----------
? ? 100000



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



可以看到,执行了存储过程detach_pro以后,原来的两张表中都没有数据了,全部分离到归档表arch_tabdet和arch_tabhdr中去了,当然这是一种极端情况,之前插入的数据都是符合插入到归档表的筛选条件的,即字段"status=9"。操作日志表中记录了各表的插入和删除操作,以及执行的时间。



如果有新的记录插入原表,但是并不符合插入归档表中的筛选条件,比如status=8,来看一下测试结果:



--第2次测试(插入10000条status=8的记录)
SQL> begin


? 2? for i in 1..10000
? 3? loop
? 4? insert into tabhdr values(i,8);
? 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> exec detach_pro;



PL/SQL procedure successfully completed.



SQL> select count(*) from tabdet;



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



SQL> select count(*) from tabhdr;



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



SQL> select count(*) from arch_tabdet;



? COUNT(*)
----------
? ? 100000



SQL> select count(*) from arch_tabhdr;



? COUNT(*)
----------
? ? 100000



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
------------------- ------------------- ------------------- --