那么就可以在此时将其数据备份到emp_table_bk,即:+ @& t$ N- u& @9 f
- ~2 G$ x8 z7 X; P
create table emp_table_bk$ L# r, b+ j+ q+ a/ I
as
/ Y! N0 @) k, \; C! [select * from emp_table;
# A5 k7 d1 r/ r 这样,就把以前误操作的数据给恢复回来了。7 L! f* t; a' |6 E2 U8 S
+ g* X. y- s4 A+ S: `$ H$ ^: |
从上面的结果看的出,调用DBMS_FLASHBACK包的ENABLE_AT_TIME函数,可以将数据库的当前查询时间调整到以前,这样给数据恢复提供了帮助。
5 p+ S Z3 B, ~9 x, g
' A8 C# O7 M* ~7 Z6 ?' u" \- Z 在使用DBMS_FLASHBACK包的时候还应该注意以下几点:! k9 k* }. Z4 F3 F0 _6 p9 o4 {
3 S0 q* `; y1 q M6 a ·倒叙查询是有前提的,即该数据库必须具有撤消管理功能。具体做法是,DBA应该建立一个撤消表空间,并启动自动撤消管理,并建立一个撤消保留时间窗。这样,Oracle将在撤消表空间中维护足够的撤消信息以便在保留时间内支持倒叙查询。
% s1 J+ j" k& o: e
: x4 ?/ K& U* z7 D' k7 ~8 S ·由于撤消表空间的大小直接决定了倒叙查询执行的成败。即撤消表空间越大,那么可以查询的时间可以越早,那么对于一般的撤消表空间的大小,为了保证倒叙查询的成功,尽量查询5天以内的数据,这样成功的可能性更高一些。
5 x) w$ q5 V* |* J9 j2 |. ] V& D6 Z$ J/ q4 b3 L4 t
三.任务调度
% @, l) }# Z' V: t/ y/ u+ G4 g6 R# n: S% _2 N: P0 O6 _
在UNIX系统中,任务与进程的概念是等同的,即当系统执行一段程序代码时会自动给其分配一个进程号和任务号,这样使用进程号和任务号就可以对该任务进行操作(如挂起,停止,启动等)。而Oracle数据库内部也存在任务调度,比如,需要对某一操作进行周期性的执行,或者是在某事件发生的时候才执行。一般性的做法是使用触发器,即将所有操作封装在触发器里,然后通过指定触发事件即可将该操作等待执行。另外,还可以直接利用操作系统来实现,比如在Windows平台就可以编写Windows脚本并结合"任务计划"来实施;如果在Unix平台,就可以写Shell来实现任务的周期性的执行操作。; Y/ `! g8 N8 N5 c0 I
3 _8 Z; w* g1 ~! `6 K/ u6 K9 ? 而这里主要是采用Oracle数据库的DBMS_JOB包来实现的。
% e4 {5 A) c0 ?; O: a# u; b+ p" L! N F" m0 M/ l
例如,由于每个月都需要对员工进行考评以进行薪水的调整,那么就需要对emp_table表进行更新处理。更新处理代码如下:
) r% v) m" |2 [) i5 g( Q5 x! o. b& c* ~# ?' P
create or replace procedure salary_upt(v_emp_no varchar2,v_salary number)
3 H8 _+ A [7 Z# k |% e; P* kas6 d) o4 i ~% X$ ?# \
begin5 t% c- I7 l, W4 K! @7 {
update emp_table
# s! c6 `5 O+ c! qset emp_salary=v_salary* z+ ~8 ?, ~! P+ R8 o/ \
where emp_no=v_emp_no;5 q' l) l& P3 |1 w' p2 A. r) H4 h
commit;
( I" Q, R/ v( H' y$ Wend ;
/ [' G" M a4 Y* c# x8 p( \! e/! y* S4 M' d' Q. W6 w1 ^
为了定期每个月都运行上面的程序,可以执行如下代码:
$ f1 Y+ Y7 H7 O& Q4 _
6 X$ ]. w7 c! ]) `- QVariable v_jobNum number;; f% i E2 P( V; {( n% u1 Q ^
Begin
3 x4 c5 \1 p2 e0 lDbms_job.submit(:v_jobNum,’salary_upt’,sysdate,’sysdate+30’);
5 J& t3 b/ I3 `4 n- Q8 }9 eCommit; L, M" Z& P7 E* E( v, u! n
End;0 o9 t, ^/ x9 @4 E. ^* a3 ^
/6 O9 x! P# D# V3 |5 g8 ~6 k& v B
submit执行后将使得salary_upt过程马上执行。在上面的代码中,v_jobNum是该作业返回的作业号(任务号),后面两个时间分别为开始时间和结束时间,所以salary_upt过程将每隔30天执行一次salary_upt程序,以此达到了定期更新的目的。
& Q' s' f0 t5 c$ X1 @0 Z
4 s1 C+ Z& G' t; s 如果要禁止该作业的继续执行,可以执行下面的命令:
5 P% F; g8 J0 U9 \9 T8 b- U
" k3 H& X; ~( b3 k4 m$ Z$ `: a3 Vdbms_job.remove(:v_jobNum);
2 ~8 u. X( E) C A, W6 R 使用DBMS_JOB包来实现任务的调度便于跟应用程序集成,有时候这样处理更为的便捷。
5 L" ~" \ p7 x- F6 d/ c- ~
4 {9 n u- u3 [3 k 四.小结
! L; s& m" x A& m8 l$ E6 w) e' T
很多时候,数据库的功能可以通过应用程序来进行扩展,对于进行后台数据库开发操作的用户而言,除了对数据库整体架构熟悉以外,掌握一定的应用程序开发能力是很有必要的。系统通过本文能够给读者一定的启发。
0 E) I! i+ z; i- r! u
. S# P/ s. V! S; c; N# D$ ~ 本文的开发环境为:- \8 X& Z1 g5 l4 o' g
; Z# k! L7 K2 s. [# i, k' t- } | 服务器端:UNIX+Oracle9.2
0 p7 A5 s( X' E+ S) O' Q% c9 L: ~* R, ^# @
客户端:WINDOWS2000 PRO+TOAD(或者SQL*PLUS)
* k) \* J3 ^0 z3 B6 x
! w3 J) s0 d3 L$ ?) v 本文中的代码在上述环境已调试通过。 |