ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 作业job

作业job

原创 Linux操作系统 作者:hjianping 时间:2011-04-26 19:42:17 0 删除 编辑

创建jobs
-------------------------------------------------------------------
declare
  jobno number;
begin
  sys.dbms_job.submit(job => :jobno,
                      what => 'db_monitor_hrdb1;',
                      next_date => to_date('22-12-2010 10:30:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'trunc(sysdate+1)+(10*60+30)/(24*60)');
  commit;
end;
/
-------------------------------------------------------------------

修改jobs
-------------------------------------------------------------------
begin
  sys.dbms_job.change(job       => 21,
                      what      => 'db_monitor;',
                      next_date => to_date('2010-12-15 18:00:00',
                                           'yyyy-mm-dd hh24:mi:ss'),
                      interval  => 'trunc(sysdate+1)+18/24');
end;
/
-------------------------------------------------------------------


描述     Interval参数值
-----------------------------------------------------------------------------------------
每天运行一次    'SYSDATE + 1'
每小时运行一次    'SYSDATE + 1/24'
每10分钟运行一次   'SYSDATE + 10/(60*24)'
每30秒运行一次    'SYSDATE + 30/(60*24*60)'
每隔一星期运行一次   'SYSDATE + 7'
不再运行该任务    NULL

每天午夜12点    'TRUNC(SYSDATE + 1)'
每天早上8点30分   'TRUNC(SYSDATE+1)+(8*60+30)/(24*60)'
每星期二中午12点   'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12点   'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11点  'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6点10分  'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'
-----------------------------------------------------------------------------------------

 

 1、Job的next_date是在JOB运行完毕以后被Oracle自动修改的,而不是在JOB刚开始运行的时候,但是JOB的next_date是JOB开始执行时间的1天以后(假设间隔时间为1天),而不是JOB结束时间的1天以后;就是:JOB在运行结束之后才会更新next_date,但是计算的方法是JOB刚开始的时间加上interval设定的间隔

        2、如果job执行的时间大于间隔时间(比如job的间隔执行时间定义为半个小时,但是执行却需要1个小时),则job不会报错,job的实际执行间隔时间会被调整为job的实际执行时间(如本例子中的1个小时)

        3、JOB的下一次运行时间是会受上一次影响的,如果我们的interval仅仅是sysdate+1/24这样的形式的话,无疑,上次执行的时间再加上1小时就是下次执行的时间。那么如果JOB因为某些原因延迟执行了一次,这样就会导致下一次的执行时间也同样顺延了,这通常不是我们希望出现的现象。解决方法是需要设定正确的interval就可以了。 比如,我们要JOB在每天的凌晨3:30执行而不管上次执行到底是几点,只需要设置interval为trunc(SYSDATE)+3.5/24+1即可(而不是简单sysdate+1之类的)

        4、如果job运行出错,job会自动在某段时间后再次执行,直到连续16次执行失败后中断.所以当job出现异常的时候会出现job的执行时间和next时间和最初定义的会有很大的延迟--这就是为什么你定义的job下次执行时间老是后延的原因(解决这个问题最好在job执行的存储过程中加异常捕捉代码)


-------------------------------------------------------------------
begin
  sys.dbms_job.change(job => 21,
                      what => 'declare
       ddl_string1 varchar2(100):=''drop sequence order_no'';
       ddl_string2 varchar2(200):=''create sequence order_no
             minvalue 1000 maxvalue 1999 start with 1000 increment by 1'';
begin
     execute immediate ddl_string1;
     commit;
     execute immediate ddl_string2;
     commit;
end;',
                      next_date => to_date('20-10-2008', 'dd-mm-yyyy'),
                      interval => 'sysdate+60/(24*60)');
  commit;
end;
/
-------------------------------------------------------------------

 

运行JOB
--------------------------------------
begin
 dbms_job.run(:job1);
end;
/
--------------------------------------

删除JOB
--------------------------------------
begin
 dbms_job.remove(:job1);
end;
/
--------------------------------------

job_queue_processes

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17012874/viewspace-693797/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 异常处理
下一篇: 读写OS文件
请登录后发表评论 登录
全部评论

注册时间:2011-04-24

  • 博文量
    80
  • 访问量
    72868