请教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: 0102000200000000JOB: 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: 0102000200000000job1 和job22都是执行存储过程stoptuanxianusers,只不过job1定在每晚21:30执行,job22定在每天早上7:00,但根据这几天的观察,每晚21:30的job1正常执行,而每天早上7:00的job22没有一次执行过,user_jobs中的failures字段每也没值,这说明没有失败吧?那为什么不成功呢?是我设置的interval不对了?

解决方案 »

  1.   

    从user_jobs中的数据看,job是被执行了。但有一点很奇怪,你设置的是早上7点执行,怎么last_sec是08:12:42?
      

  2.   

    那是因为我看他不执行,所以手动执行了一次,所以last_date就有值了。
      

  3.   

    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应该是正确的啊。
      

  4.   

    记得手工执行和修改next_date之前,user_jobs中的内容吗?怀疑原先设置时next_date或interval写错了。
      

  5.   

    bobfang(匆匆过客),你好!非常感谢你的指点!现在基本上可以确定是“原先设置时next_date或interval写错了”,请看下术内容:为了验证当前我对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: 0102000200000000JOB 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: 0102000200000000JOB:      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的参数进行重新设置后,没有起到实际作用呢?