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'):截斷到季度首日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;
NEXT_DATE 為首次執行時間,**INTERVAL 計算的是下下次** (即第 2 次執行時間)JOB_QUEUE_PROCESSES > 0) 未啟動時不會執行DBMS_SCHEDULER (功能更強、支援日曆、事件驅動、鏈式任務)-- 手動觸發測試
EXEC DBMS_JOB.RUN(JOBNO);
-- 查看執行歷史
SELECT LOG_DATE, JOB, WHAT, INSTANCE, BROKEN, FAILURES
FROM DBA_JOB_RUNS ORDER BY LOG_DATE DESC;