declare jobEvd number;
begin
sys.dbms_job.submit(jobEvd,'evd_go;',to_date('2011-02-22 15:00:00','yyyy-mm-dd hh24:mi:ss'),'TRUNC(SYSDATE + 1)+(8*60+30)/(24*60)');
end;提交了job以后到15:00:00准时执行了,但是用select * from user_jobs查看任务发现next_date显示为15:30:15,过了三点半以后再查看就变成16:02:15(如图)
这个时间'TRUNC(SYSDATE + 1)+(8*60+30)/(24*60)'应该是早上8:30吧
为什么会这样呢?另外求更改Interval的详细做法

解决方案 »

  1.   

    楼主用的9i?
    10G的作业在(DBA|ALL|USER)_SCHEDULER_JOBS视图看直接去EM控制台改下就行了,有按(秒/分/天)
      

  2.   

    select TRUNC(SYSDATE + 1)+(8*60+30)/(24*60) from dual2011/2/23 8:30:00
     
    看上去是8.30,原因不知道了
      

  3.   

    -- I服了You,楼主:我不想再说什么啦,你就为这个问题尽情的倒腾吧......
      

  4.   

    第一个参数是作业开始时间,第二个参数是作业间隔时间select TRUNC(SYSDATE + 1)+(8*60+30)/(24*60) from dual2011/2/23 8:30:00
    汗,这个间隔时间对不对吧,直接写间隔时间,应该是
      

  5.   

    奇怪,看着没问题的.在我这里是正常的
    SQL> declare
      2  jobEvd number;
      3  begin
      4  sys.dbms_job.submit(jobEvd,'begin evd_go; end;',to_date('2011-02-22 15:00:00','yyyy-mm-dd hh24:mi:ss'),'TRUNC(SYSDATE + 1)+(8*60+30)/(24*60)');
      5  commit;
      6  dbms_output.put_line(jobEvd);
      7  end;
      8  /
     
    362
     
    PL/SQL procedure successfully completed
     
    SQL> select * from user_jobs t where t.JOB=362;
     
           JOB LOG_USER                       PRIV_USER                      SCHEMA_USER                    LAST_DATE   LAST_SEC         THIS_DATE   THIS_SEC         NEXT_DATE   NEXT_SEC         TOTAL_TIME BROKEN INTERVAL                                                                           FAILURES WHAT                                                                             NLS_ENV                                                                          MISC_ENV                                                           INSTANCE
    ---------- ------------------------------ ------------------------------ ------------------------------ ----------- ---------------- ----------- ---------------- ----------- ---------------- ---------- ------ -------------------------------------------------------------------------------- ---------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ---------------------------------------------------------------- ----------
           362 SCOTT                          SCOTT                          SCOTT                          2011-2-22 1 16:46:02                                      2011-2-23 8 08:30:00                  0 N      TRUNC(SYSDATE + 1)+(8*60+30)/(24*60)                                                      0 begin evd_go; end;                                                               NLS_LANGUAGE='SIMPLIFIED CHINESE' NLS_TERRITORY='CHINA' NLS_CURRENCY='¥' NLS_ISO 0102000200000000                                                          0
     
    SQL> 
      

  6.   

    interval参数是在job运行前使用的,会通过类似execute immediate 'select '||interval||' from dual'的动态调用得到下次运行的时间. 
      

  7.   

    ~~>_<~~奇怪了昨天broken了一下 然后时间定在今天早上,今天早上来运行完了以后按说应该按interval计算下次执行的时间,可是next_date还是不对
    莫非我RP不好……?
      

  8.   

    突然发现我的这个job里的failures是7,是不是失败了会过一段时间继续执行呀?
    如果一直失败,怎么检查问题出在哪里?
      

  9.   

    从前面的帖子看,你job中调用的procedure处于invalid状态
      

  10.   

    procedure 的状态不影响JOB,楼主写JOB的时候没有写失败后重复执行
    JOB按时运行还是会显示状态SCHEDULED,会有显示failed,我昨天试了一下就是这样的,你还是看一下你的interval时间到底写对了没有吧另外楼主你测试的话测试服务器上没别的东西..你直接改下系统时间就行了..不用等一天
      

  11.   

    procedure的状态不影响添加job,但是影响job运行
      

  12.   

    重复执行时间应该是没有问题的,写在其他job里是正常的,但是这里失败次数一直增加,next date也一直不是预期的。我的存储过程直接用execute evd_go执行过,可以执行的。不知道为什么放到job里就不行了,似乎只执行了一,把一个表删除了而没有执行建表的操作,于是下一次执行的时候就变成无效的存储过程了,不知道为什么会出现这个情况呢……
      

  13.   

    你的next_date不对是因为作业失败了,所以变成next retry date。你可以执行
    exec dbms_job.run(<作业ID>);
    看它的调用错在哪里。我想可能是因为你的job.what有问题,你可以贴出来看看。
      

  14.   

    哦,你的what有问题,应该是 BEGIN evd_go;END;