DBMS_JOB 是 Oracle 內建排程器(10g 後建議改用 DBMS_SCHEDULER),本文提供從建立存儲過程到提交週期性 Job 的完整可執行範例。
CREATE PROCEDURE bertelsmann AS
BEGIN
INSERT INTO record SELECT * FROM cussent
WHERE adddate <= TRUNC(ADD_MONTHS(SYSDATE, -3));
DELETE FROM cussent
WHERE adddate <= TRUNC(ADD_MONTHS(SYSDATE, -3));
COMMIT;
END;
/
-- 功能:將 3 個月前資料歸檔至 RECORD 表並從 CUSSENT 刪除
DECLARE
v_job NUMBER := 1;
BEGIN
DBMS_JOB.SUBMIT(v_job, 'bertelsmann;', SYSDATE, 'SYSDATE + 1/1440');
COMMIT;
END;
/
-- 參數:job 號、what(過程名)、next_date(首次執行)、interval(間隔)
-- 1/1440 = 1天/24小時/60分 = 1分鐘
-- 查看作業
SELECT * FROM USER_JOBS;
SELECT * FROM ALL_JOBS;
-- 立即執行
EXEC DBMS_JOB.RUN(job_no);
-- 停用/啟用
EXEC DBMS_JOB.BROKEN(job_no, TRUE); -- 停用
EXEC DBMS_JOB.BROKEN(job_no, FALSE); -- 啟用
-- 修改下次執行時間
EXEC DBMS_JOB.NEXT_DATE(job_no, SYSDATE + 1);
-- 修改執行內容
EXEC DBMS_JOB.WHAT(job_no, 'new_proc;');
-- 移除作業
EXEC DBMS_JOB.REMOVE(job_no);
| 頻率 | next_date (首次) | interval (間隔) |
|---|---|---|
| 每天 02:10:10 | TRUNC(SYSDATE)+2/24+10/1440+10/86400 | TRUNC(SYSDATE+1)+2/24+10/1440+10/86400 |
| 每月 2 號 02:10:10 | TRUNC(SYSDATE,'MM')+1+2/24+10/1440+10/86400 | TRUNC(ADD_MONTHS(SYSDATE,1),'MM')+1+2/24+10/1440+10/86400 |
| 每季首日 02:10:10 | TRUNC(SYSDATE,'Q')+1+2/24+10/1440+10/86400 | TRUNC(ADD_MONTHS(SYSDATE,3),'Q')+1+2/24+10/1440+10/86400 |
| 每週一 02:10:10 | NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+2/24+10/1440+10/86400 | NEXT_DAY(TRUNC(SYSDATE+7),'MONDAY')+2/24+10/1440+10/86400 |
JOB_QUEUE_PROCESSES(預設 4,最大 36)控制同時執行 Job 進程數,若為 0 則所有 Job 不會執行,務必設定 ≥1。
掌握上述模板,即可快速部署資料歸檔、統計收集、報表產生等週期性維護作業。