Chinaunix
标题:
请教oracle job queue问题
[打印本页]
作者:
quanjinzhang
时间:
2007-08-09 10:11
标题:
请教oracle job queue问题
请教oracle job queue问题
各位大侠好:
这几天小弟一直很郁闷,为什么同样的存储过程,通过oracle job queue设置在不同的时间执行时,一个成功,而另一个不成功。
下面是job queue的设置情况:
select a.job,a.last_date,a.last_sec,a.next_date,a.next_sec,
a.broken,a.interval,a.failures,a.what,a.misc_env
from user_jobs a where a.job in (1, 22);
JOB: 22
LAST_DATE: 2007-8-7 8:12:42
LAST_SEC: 08:12:42
NEXT_DATE: 2007-8-9 7:00:00
NEXT_SEC: 07:00:00
BROKEN: N
INTERVAL: trunc(sysdate)+1+7/24
FAILURES: 0
WHAT: stoptuanxianusers;
MISC_ENV: 0102000200000000
JOB: 1
LAST_DATE: 2007-8-8 21:30:06
LAST_SEC: 21:30:06
NEXT_DATE: 2007-8-9 21:30:00
NEXT_SEC: 21:30:00
BROKEN: N
INTERVAL: trunc(sysdate+1)+21/24+numtodsinterval(30,'MINUTE')
FAILURES: 0
WHAT: stoptuanxianusers;
MISC_ENV: 0102000200000000
job1 和job22都是执行存储过程stoptuanxianusers,只不过job1定在每晚21:30执行,job22定在每天早上7:00,但根据这几天的观察,每晚21:30的job1正常执行,而每天早上7:00的job22没有一次执行过,user_jobs中的failures字段每也没值,这说明没有失败吧?那为什么不成功呢?是我设置的interval不对了?
[
本帖最后由 quanjinzhang 于 2007-8-9 11:36 编辑
]
作者:
quanjinzhang
时间:
2007-08-09 11:11
标题:
回复 #1 quanjinzhang 的帖子
请各位不吝赐教啊!
作者:
quanjinzhang
时间:
2007-08-09 11:55
不会吧?没人知道吗?
作者:
quanjinzhang
时间:
2007-08-09 14:02
还是自己先分析分析吧:
job22的LAST_DATE为2007-8-7 8:12:42,LAST_SEC为08:12:42是因为:我看它不执行,所以只能手动执行了一次。执行时间为2007-8-7 8:12:42,所以就有了这样的job信息。
而:NEXT_DATE: 2007-8-9 7:00:00,NEXT_SEC: 07:00:00,是因为我昨天看它不执行,所以对job22执行了如下修改:
begin
dbms_job.next_date(22,trunc(sysdate)+1+7/24);
end;
/
begin
dbms_job.interval(22,'trunc(sysdate)+1+7/24');
end;
/
commit;
从昨天执行修改后的next_date和next_sec值看来,我设置的interval应该是正确的啊。
作者:
quanjinzhang
时间:
2007-08-10 00:03
自己发一个话题,又是自己在一回复,真是有意思了。
作者:
quanjinzhang
时间:
2007-08-10 07:37
标题:
回复 #1 quanjinzhang 的帖子
无奈,为了验证当前我对job22的设置没有错误,今天早上06:55之前,我执行了如下命令
variable job_no2 number;
begin
dbms_job.submit(:job_no2,'stoptuanxianusers;',trunc(sysdate)+6/24+numtodsinterval(55,'MINUTE'),'trunc(sysdate)+1+6/24+numtodsinterval(55,''MINUTE'')');
end;
/
commit;
begin
dbms_job.submit(:job_no2,'stoptuanxianusers;',trunc(sysdate)+7/24,'trunc(sysdate)+1+7/24');
end;
/
commit;
查询job信息显示如下:
JOB 41
LAST_DATE:null
LAST_SEC: null
NEXT_DATE:2007-8-10 6:55:00
NEXT_SEC: 06:55:00
BROKEN: N
INTERVAL: trunc(sysdate)+1+6/24+numtodsinterval(55,'MINUTE')
FAILURES: null
WHAT: stoptuanxianusers;
MISC_ENV: 0102000200000000
JOB 42
LAST_DATE:null
LAST_SEC: null
NEXT_DATE:2007-8-10 7:00
NEXT_SEC: 7:00:00
BROKEN: N
INTERVAL: trunc(sysdate)+1+7/24
FAILURES: null
WHAT: stoptuanxianusers;
MISC_ENV: 102000200000000
这些信息显示新job提交正确。
时间过了07:00之后,我再次查询job信息显示如下
JOB 41
LAST_DATE:2007-8-10 6:55:07
LAST_SEC: 06:55:07
NEXT_DATE:2007-8-11 6:55:00
NEXT_SEC: 06:55:00
BROKEN: N
INTERVAL: trunc(sysdate)+1+6/24+numtodsinterval(55,'MINUTE')
FAILURES: 0
WHAT: stoptuanxianusers;
MISC_ENV: 0102000200000000
JOB: 42
LAST_DATE:2007-8-10 7:00
LAST_SEC: 7:00:09
NEXT_DATE:2007-8-11 7:00
NEXT_SEC: 7:00:00
BROKEN: N
INTERVAL: trunc(sysdate)+1+7/24
FAILURES: 0
WHAT: stoptuanxianusers;
MISC_ENV: 102000200000000
从新设置任务的运行结果看来,新的job已经的在预定时间正确正常运行了!
那么为什么之前的job22不能正常执行呢?现在基本上可以判定为第一次提交job时对job的相关设置有误,导致第一次没有正常执行,之后修改也不起作有了。而这又给我们大家提出了另外一个问题:为什么第一次设置next_date和interval出错后,再通过dbms_job的next_date和interval对该job的参数进行重新设置后,没有起到实际作用呢?
作者:
ferrywong
时间:
2007-08-10 12:12
我觉得
NEXT_DATE:应该写trunc(sysdate)+1+7/24
INTERVAL:应该写'SYSDATE+1'
这样的间隔才是1天
作者:
quanjinzhang
时间:
2007-08-10 12:46
标题:
回复 #7 ferrywong 的帖子
那你就错了!这个错误之处确实让人难以察觉,因为
(1)job本身运行可能会有一定的延迟;
(2)job运行需要一定的时间,
而next_date的计算是在job运行完成之后计算的,这样的话,下次执行时间就不会是在07:00整了,为了达到每天都在07:00整开始执行,必须使用trunc()函数。
作者:
zwh307
时间:
2011-10-20 17:19
过来学习这个函数了
西安人才网
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2