oracle 在schedule这个新功能出现以前,定时任务都是靠dbms_jobs这个包来创建job实现的,作为DBA来说也会经常根据dba_jobs视图来查一些job相关信息,那关于dbms_jobs里边的几个时间不知大家是否有关注?
通过以下job的测试:
create or replace procedure pro_job_print
as
begin
dbms_output.put_line('系统时间:' || to_char(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
insert into wk.JOB_TEST values(sysdate);
dbms_lock.sleep(40);
dbms_output.put_line('系统时间:' || to_char(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
insert into wk.JOB_TEST values(sysdate);
end;
/




variable job2010 number;
begin
  dbms_job.submit(:job2010,'PRO_JOB_PRINT;',sysdate,'sysdate+2/1440');
  dbms_output.put_line(:job2010);
  end;
/

最终发现:
1.dba_jobs视图中的LAST_DATE,LAST_SEC显示的最后执行开始的时间,而不是结束的时间
2.last_date,last_sec,next_date,next_sec的更新却是在job执行完成以后才会体现在dba_jobs视图中的,也就是在job的执行过程中,我们从dba_jobs里边看不到job的开始执行时间的

另外,关于停掉正在执行的job的,通过alter system kill session的方法是没有用的,因为kill 掉执行job的session以后,dba_jobs里边的next_date时间是不会更新到下一个时间窗口,也就是next_date是小于当前时间的,那么job还是发起来的。有人想到那我直接broken掉这个job不就好了吗?不好意思,对于正在执行的job,broken是没有作用的。所以正确的做法应该是先改掉job_quene_process

09-27 01:15