解决方案 »

  1.   

    数据库定时任务 每天的6:00,12:00,18:00,24:00这四个时间点执行
    VARIABLE jobno number;↙
    begin
     DBMS_JOB.SUBMIT(:jobno,
        '你定时执行的存储过程;',
        TO_DATE(
          TO_CHAR(SYSDATE,'YYYYMMDD')||
          LPAD(TRUNC(TO_NUMBER(TO_CHAR(SYSDATE,'HH24'))/6)*6,2,'0')
          ,'YYYYMMDDHH24'),
        'sysdate+0.25');
        commit;
    end;
      

  2.   

    2:00-8:00中间隔半小时执行一次
    case when在定时任务中没写过,不知道行不行,你自己测试下吧
    VARIABLE jobno number;↙
    begin
     DBMS_JOB.SUBMIT(:jobno,
        '你定时执行的存储过程;',
        sysdate,
        'case when to_char(sysdate,'hh24')>='08'  then
            trunc(sysdate)+1+2/24
        when to_char(sysdate,'hh24')<'02'  then
            trunc(sysdate)+2/24
        else
            sysdate+1/24/2
        end');
        commit;
    end;
      

  3.   

    上面引号缺失,修正下
    VARIABLE jobno number;↙
    begin
     DBMS_JOB.SUBMIT(:jobno,
        '你定时执行的存储过程;',
        sysdate,
        'case when to_char(sysdate,''hh24'')>=''08''  then
            trunc(sysdate)+1+2/24
        when to_char(sysdate,''hh24'')<''02''  then
            trunc(sysdate)+2/24
        else
            sysdate+1/24/2
        end');
        commit;
    end;
      

  4.   


    我觉得这段代码改成这样可能会更好
    VARIABLE jobno number;↙
    begin
     DBMS_JOB.SUBMIT(:jobno,
        '你定时执行的存储过程;',
        TO_DATE(
          TO_CHAR(SYSDATE,'YYYYMMDD')||
          LPAD(CEIL(TO_NUMBER(TO_CHAR(SYSDATE,'HH24'))/6)*6,2,'0')
          ,'YYYYMMDDHH24'),
        'sysdate+0.25');
        commit;
    也就是说把四舍五入改成向上取整,应为6点以后比如当前时间是7点,下次的执行时间应该是12点,如果四舍五入的话还是6点,可能就有问题
      

  5.   


    我觉得这段代码改成这样可能会更好
    VARIABLE jobno number;↙
    begin
     DBMS_JOB.SUBMIT(:jobno,
        '你定时执行的存储过程;',
        TO_DATE(
          TO_CHAR(SYSDATE,'YYYYMMDD')||
          LPAD(CEIL(TO_NUMBER(TO_CHAR(SYSDATE,'HH24'))/6)*6,2,'0')
          ,'YYYYMMDDHH24'),
        'sysdate+0.25');
        commit;
    也就是说把四舍五入改成向上取整,应为6点以后比如当前时间是7点,下次的执行时间应该是12点,如果四舍五入的话还是6点,可能就有问题
    这么写有问题,如果当前是19点,获取的就是24点,小时的取值范围应该是0-23,to_date就会报错了
    我那个没啥问题,第一次运行的时间是“第三个参数的时间然后再加上0.25天之后的时间”,你可以去测试下,没啥问题的,这个写法我自己用过的
      

  6.   

    select job,next_date,next_sec,failures,broken from user_jobs;
    创建任务之后可以通过上面语句查看任务下次执行的时间,你自己去测试下吧
      

  7.   

    刚才又去测试了下,需要修改的是后面的那个参数,测试通过
    VARIABLE jobno number;↙
    begin
     DBMS_JOB.SUBMIT(:jobno,
        '你定时执行的存储过程;',
        TO_DATE(
          TO_CHAR(SYSDATE,'YYYYMMDD')||
          LPAD(TRUNC(TO_NUMBER(TO_CHAR(SYSDATE,'HH24'))/6)*6,2,'0')
          ,'YYYYMMDDHH24'),
        'TO_DATE(
          TO_CHAR(SYSDATE,''YYYYMMDD'')||
          LPAD(TRUNC(TO_NUMBER(TO_CHAR(SYSDATE,''HH24''))/6)*6,2,''0'')
          ,''YYYYMMDDHH24'')+0.25');
        commit;
    end;
      

  8.   


    我想请教您一个问题关于next_time和interval的,自动任务第一次执行时间是取得next_time的值吧,在自动任务的存储过程执行的开始就算出了下次执行的时间,这个时间应该是用interval它算出来的吧,现在的问题是下次运行的时间是用interval它算出来,还是用next_time和interval这两个一块作用算出来的。或者您可以给我讲一下自动任务执行的顺序,先谢谢您了
      

  9.   

    其实也可以不需要这么复杂,
    只在每天的6:00,12:00,18:00,24:00这四个时间点执行
     Interval => trunc(sysdate,'hh') + 1/24
    然后在要调用的存储过程里判断是不是 6:00,12:00,18:00,24:00就行了.
      

  10.   


    这样的话如果需求该了,改成4:00,8:00,12:00了,还的在改一次存储过程,不利于维护
    存储过程相对还是比较好维护的了.因为有些job的时间段不好用interval去做,所以也是可以考虑这种方法的.
    当然能用interval是最好.呵
      

  11.   

    你这个执行时间点如果是6,12,18,24 有规律的话, 那就 第一次 0点执行,然后  间隔为sysdate+1/4就好了但是如何在2:00-8:00每半小时执行, 没有碰过这种的
      

  12.   

    使用oracle的job实现第一次 0点执行,然后  间隔为sysdate+1/4应该可以了
      

  13.   

    用 oracle 11G scheduler_jobs 可以轻松实现。