要把dbms_job每天分3個時段執行 8:30 9:00 9:30
有個辦法是有每半小時執行一次 但是 一天下來  除了這3個時段外的都沒有意義
job能不能指定到3個時間段的問題2
之前我定義了一個job 是8:12執行的 每小時執行一次 每次執行要用5分鐘  半個月job的執行時間變為8.49分
是不是job的下一次執行時間為這次執行完成后的時間再加上每次執行的時間
如 8:12執行  8:16完成  那下一次的時間是不是為9:16的

解决方案 »

  1.   

    这是我们用的SCHED JOBBEGIN
      SYS.DBMS_SCHEDULER.CREATE_JOB
        (
           job_name        => 'SCH_JOB_AP030'
          ,start_date      => TO_TIMESTAMP_TZ('2009/03/31 15:45:00.000000 +08:00','yyyy/mm/dd hh24:mi:ss.ff tzh:tzm')
          ,repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=9,10,11,13,14,15,16,17;
    BYMINUTE=15,45;BYSECOND=0'

          ,end_date        => NULL
          ,job_class       => 'DEFAULT_JOB_CLASS'
          ,job_type        => 'PLSQL_BLOCK'
          ,job_action      => 'BEGIN
       SP_MAKE_AP030
      ( );
       END;'
          ,comments        => '上班时间每半时更新次AP030'
        );
      SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
        ( name      => 'SCH_JOB_AP030'
         ,attribute => 'RESTARTABLE'
         ,value     => FALSE);
      SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
        ( name      => 'SCH_JOB_AP030'
         ,attribute => 'LOGGING_LEVEL'
         ,value     => SYS.DBMS_SCHEDULER.LOGGING_RUNS);
      SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
        ( name      => 'SCH_JOB_AP030'
         ,attribute => 'MAX_FAILURES');
      SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
        ( name      => 'SCH_JOB_AP030'
         ,attribute => 'MAX_RUNS');
      BEGIN
        SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
          ( name      => 'SCH_JOB_AP030'
           ,attribute => 'STOP_ON_WINDOW_CLOSE'
           ,value     => FALSE);
      EXCEPTION
        -- could fail if program is of type EXECUTABLE...
        WHEN OTHERS THEN
          NULL;
      END;
      SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
        ( name      => 'SCH_JOB_AP030'
         ,attribute => 'JOB_PRIORITY'
         ,value     => 3);
      SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
        ( name      => 'SCH_JOB_AP030'
         ,attribute => 'SCHEDULE_LIMIT');
      SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
        ( name      => 'SCH_JOB_AP030'
         ,attribute => 'AUTO_DROP'
         ,value     => FALSE);  SYS.DBMS_SCHEDULER.ENABLE
        (name                  => 'SCH_JOB_AP030');
    END;
    /
      

  2.   

    不过你个SCHED JOB不太好定义,因为你是半小时执行一次,用SCHED JOB的话,8:00,8:30,9:00,9:30都会执行的问题2,如果你不是SYSDATE+1/24的话,则每次都会准时,不管执行时间需要多少,从开始时间计算
    如果是用SYSDATE的话,会有累积误差
      

  3.   

    按你的例子作了以下改動
    BEGIN
      DBMS_SCHEDULER.CREATE_JOB
        (
           job_name        => 'job1216'
          ,start_date      => TO_TIMESTAMP_TZ('2009/12/16 15:45:00.000000 +08:00','yyyy/mm/dd hh24:mi:ss.ff tzh:tzm')
          ,repeat_interval => 'FREQ=minutely; BYDAY=0;BYHOUR=0;
    BYMINUTE=1;BYSECOND=1'
          ,end_date        => NULL
          ,job_type        => 'PLSQL_BLOCK'
          ,job_action      => 'BEGIN
       PR1216    //存儲過程名
      ( );
       END;'
          ,comments        => '備注內容??'
        );
    END;   如果想要從12月16日開始每天的8:30 ,8.:45,9:00,9:15都執行一次
    start_date,repeat_interval 要如何設置
    現在想先做個測試 每分鐘執行一次的話  又要如何設置 
      

  4.   

    將這個參數改為 repeat_interval => 'FREQ=minutely; BYSECOND=11'
    就能實現1分鐘執行一次http://space.itpub.net/7607759/viewspace-612589
    這里有詳細的解釋
      

  5.   

    试试这样可以不:begin
      sys.dbms_job.submit(job => :job,
                          what => 'begin
        if to_char(sysdate, ''hh24mi'') in (''0830'', ''0845'', ''0900'', ''0915'') then
            存储过程名;
        end if;
    end;',
                          next_date => to_date('16-12-2009 17:15:03', 'dd-mm-yyyy hh24:mi:ss'),
                          interval => 'sysdate + 15/(24*60)');
      commit;
    end;