对SQL Server熟悉的朋友,应该都知道,SQL Server的作业是按照固定时刻来设置调度的,比如设置为每日23:00运行,如果此时,恰逢服务器关机,或者SQLServerAgent服务不在运行,则本次作业将不会执行,直到下次满足调度条件再执行.
而Oracle的JOB是按照调度公式来设置下次执行时刻的.让我们来测试一下Oracle的JOB遇到关机或者数据库关闭的情况吧.
----创建表:
create table bak_testJob(runtime date);
----创建存储过程:
create or replace procedure bak_testJob_Proc
is
begin
insert into bak_testJob values(sysdate);
end ;
----调用存储过程测试:
begin
bak_testJob_Proc;
end ;
----测试成功(select 有结果),清空表:
delete from bak_testJob;
----创建作业(PL/SQL Developer交互界面创建)下面是相关操作对应的"View SQL"的结果:
begin
sys.dbms_job.submit(job => :job,
what => 'bak_testJob_Proc;',
next_date => to_date('10-10-2011 19:15:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'sysdate+5/1440');
commit;
end;
/
----创建的JobID是101
----此时:19:09:45
19:10:00 停服务,模拟关机
19:19:35 开服务(仅启动主服务,监听服务,Agent服务,此处说明一下,Oracle9i一定要开启Agent服务,而Oracle10g则可以不启动OracleJobSchedule服务)
select * from bak_testJob;
结果:2011-10-10 19:19:38
看101作业:
Last date:2011-10-10 19:19:35
Next date:2011-10-10 19:24:37
----删除Job(PL/SQL Developer交互界面进行删除,语句略)
----删除procedure和table
drop procedure bak_testJob_Proc
select * from bak_testjob
1 2011-10-10 19:24:39
2 2011-10-10 19:19:38
drop table bak_testJob
----结论:Oracle会在数据库启动后,马上将应该调度的Job补充执行,此后按间隔公式定时调度
看来,与SQL Server跳过了本次作业调度不同,Oracle会记得补上.
另外,说明一点,作业是使用的dbms_job来创建的,不是使用Oracle10g新的dbms_schedule来创建的,所以,与OracleJobSchedule$SID服务的状况是无关的.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29512902/viewspace-1176323/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29512902/viewspace-1176323/