2016年12月16日 星期五

[Oracle]Oracle Job定時時間格式

原本是想設定Job每天同一時間執行
所以設定next_date => 隔天凌晨1點
                interval => 'SYSDATE+1'
後來發現如果有執行時間較長的批次,時間一路往後推的結果
竟然變成隔天上班的時候才會執行,影響到User操作系統的效能

修改後如下
每天1點執行的一個Job範例:
       
         DECLARE
            X NUMBER;
         BEGIN
            SYS.DBMS_JOB.SUBMIT
            ( job => X
               ,what => 'INSERT_TXN;'
               ,next_date => to_date('01-01-2016 01:00:00','dd/mm/yyyy hh24:mi:ss')
               ,interval => 'trunc(sysdate+1)+(1/24)'
               ,no_parse => FALSE
            );
                SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
               COMMIT;
         END;
        /

以上是明確指定每天的1點執行此job,如果指定是每天中午12點執行interval需要指定為 'trunc(sysdate)+1+12/24',如果僅僅指定interval為一天,這樣當你手工用dbms_job.run(job)去運行一次時,job每天的執行時間是會改變的,如果你想Job每天在固定時間執行,可以參考上面的例子.
描述 INTERVAL參數值:
  每天午夜12點 'TRUNC(SYSDATE + 1)'
  每天早上8點30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
  每星期二中午12點 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
  每個月第一天的午夜12點 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
  每個季的最後一天的晚上11點 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
  每星期六和日早上6點10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE,"SUNDAY"))) + (6×60+10)/(24×60)'
  每分鐘執行
  Interval => TRUNC(sysdate,'mi') + 1/ (24*60) 或 Interval => sysdate+1/1440
  每半年定時執行 例如:每年7月1日和1月1日淩晨1點
  Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
  每年定時執行  例如:每年1月1日淩晨1點執行
  Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

沒有留言:

張貼留言