创建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博客 ” ,链接:https://blog.itpub.net/17012874/viewspace-693797/ ,如需转载,请注明出处,否则将追究法律责任。