首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle JOB INTERVAL 參數設置全集:從每分鐘到每年的排程寫法

     編輯:Oracle 資料庫基礎

INTERVAL 參數本質

INTERVAL 接受一個 **返回下次執行時間點的 DATE 表達式**,每次執行結束後計算下一次時間。系統會自動跳過錯過的時間點 (不補跑)。

常用排程模板 (直接可用)

頻率場景INTERVAL 表達式
每分鐘高頻監控TRUNC(SYSDATE,'MI') + 1/(24*60) 或 SYSDATE + 1/1440
每天定時凌晨 1 點TRUNC(SYSDATE) + 1 + 1/24
每周定時周一凌晨 1 點TRUNC(NEXT_DAY(SYSDATE,'MONDAY')) + 1/24
每月定時每月 1 號凌晨 1 點TRUNC(LAST_DAY(SYSDATE)) + 1 + 1/24
每季度季首日凌晨 1 點TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
每半年1月1日、7月1日 凌晨 1 點ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),6) + 1/24
每年1月1日 凌晨 1 點ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),12) + 1/24

關鍵函數解析

  • TRUNC(date,'MI'):截斷到分鐘 (秒置零)
  • TRUNC(date,'YYYY'):截斷到年初 (1月1日 00:00:00)
  • LAST_DAY(date):當月最後一天
  • NEXT_DAY(date,'MONDAY'):下一個周一
  • ADD_MONTHS(date,n):加減月份,自動處理月末邊界
  • TRUNC(date,'Q'):截斷到季度首日

創建 JOB 完整示例

DECLARE
  JOBNO NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(
    JOB       => JOBNO,
    WHAT      => 'MY_PACKAGE.MY_PROCEDURE;',
    NEXT_DATE => SYSDATE,
    INTERVAL  => 'TRUNC(SYSDATE) + 1 + 1/24'  -- 每天凌晨 1 點
  );
  COMMIT;  -- 必須提交才生效
  DBMS_OUTPUT.PUT_LINE('JOB NUMBER: ' || JOBNO);
END;
/

-- 查看已提交 JOB
SELECT JOB, WHAT, NEXT_DATE, INTERVAL, FAILURES, BROKEN
FROM USER_JOBS;

避坑指南

  1. INTERVAL 必須為字符串字面量 (單引號包裹),不能是裸露表達式
  2. NEXT_DATE 為首次執行時間,**INTERVAL 計算的是下下次** (即第 2 次執行時間)
  3. JOB 進程 (JOB_QUEUE_PROCESSES > 0) 未啟動時不會執行
  4. 長時間運行的 JOB 可能導致下次執行被跳過 (不並發)
  5. 12c+ 建議遷移至 DBMS_SCHEDULER (功能更強、支援日曆、事件驅動、鏈式任務)

調試技巧

-- 手動觸發測試
EXEC DBMS_JOB.RUN(JOBNO);

-- 查看執行歷史
SELECT LOG_DATE, JOB, WHAT, INSTANCE, BROKEN, FAILURES
FROM DBA_JOB_RUNS ORDER BY LOG_DATE DESC;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved