-- init.ora / spfile 設置
JOB_QUEUE_PROCESSES = 4 -- 啟動 4 個 JOB 隊列進程 (J000-J003)
JOB_QUEUE_INTERVAL = 60 -- 每 60 秒輪詢一次 (10g+ 已廢棄,由 JOB_QUEUE_PROCESSES 控制)
JOB_QUEUE_KEEP_CONNECTIONS = TRUE -- 保持會話連接減少重連開銷
修改後需 STARTUP FORCE 重啟實例生效 (動態參數可 ALTER SYSTEM SET)。
VARIABLE JOBNO NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
JOB => :JOBNO,
WHAT => 'P_TEST;', -- 調用存儲過程
NEXT_DATE => SYSDATE, -- 首次執行時間
INTERVAL => 'SYSDATE + 1/72' -- 每 20 分鐘 (1天=1, 1/24=1小時, 1/72=20分)
);
COMMIT; -- 必須提交,否則作業不生效
END;
/
PRINT JOBNO;
| 需求 | INTERVAL 表達式 |
|---|---|
| 每 5 分鐘 | SYSDATE + 1/288 |
| 每 10 分鐘 | SYSDATE + 1/144 |
| 每 30 分鐘 | SYSDATE + 1/48 |
| 每 1 小時 | SYSDATE + 1/24 |
| 每天凌晨 2 點 | TRUNC(SYSDATE+1) + 2/24 |
| 每周一 3:00 | NEXT_DAY(TRUNC(SYSDATE),'MONDAY') + 3/24 |
| 每月 1 號 00:00 | TRUNC(ADD_MONTHS(SYSDATE,1),'MM') |
| 操作 | API | 示例 |
|---|---|---|
| 刪除作業 | DBMS_JOB.REMOVE(jobno) | EXEC DBMS_JOB.REMOVE(123); |
| 修改執行內容 | DBMS_JOB.WHAT(jobno, 'NEW_PROC;') | EXEC DBMS_JOB.WHAT(123, 'P_TEST2;'); |
| 修改下次執行時間 | DBMS_JOB.NEXT_DATE(jobno, next_date) | EXEC DBMS_JOB.NEXT_DATE(123, SYSDATE+1); |
| 修改間隔 | DBMS_JOB.INTERVAL(jobno, 'SYSDATE+1/24') | EXEC DBMS_JOB.INTERVAL(123, 'SYSDATE+1/48'); |
| 標記失效/啟用 | DBMS_JOB.BROKEN(jobno, TRUE/FALSE [, next_date]) | EXEC DBMS_JOB.BROKEN(123, TRUE); |
| 立即手動運行 | DBMS_JOB.RUN(jobno) | EXEC DBMS_JOB.RUN(123); |
| 查看作業詳情 | SELECT * FROM USER_JOBS WHERE JOB = 123; | -- 查看 NEXT_DATE、INTERVAL、FAILURES、BROKEN 等 |
VAR JOBNO NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:JOBNO, 'P_TEST;', SYSDATE, 'SYSDATE + 1/72');
COMMIT;
END;
/
-- 驗證
SELECT JOB, WHAT, NEXT_DATE, INTERVAL, BROKEN FROM USER_JOBS WHERE JOB = :JOBNO;
Oracle 10g+ 推薦使用 DBMS_SCHEDULER (功能更強、支援日曆語法、事件驅動、遠程作業),DBMS_JOB 僅為相容保留。