創建 JOB
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
:jobno, -- 返回 job 編號
'your_procedure;', -- 執行的存儲過程或 SQL,分號不可省
SYSDATE, -- 首次執行時間
'SYSDATE + 1/24/60' -- 間隔(天為單位),此處為每分鐘
);
COMMIT;
END;
/
實戰示例
-- 建測試表
CREATE TABLE t_time (job_time DATE NOT NULL);
-- 每分鐘插入一條記錄
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:jobno, 'INSERT INTO t_time VALUES (SYSDATE);', SYSDATE, 'SYSDATE + 1/24/60');
COMMIT;
END;
/
-- 每天刪除前一天數據
BEGIN
DBMS_JOB.SUBMIT(:jobno, 'DELETE FROM t_time WHERE job_time < SYSDATE - 1;', SYSDATE, 'SYSDATE + 1');
COMMIT;
END;
/
查看所有 JOB
SELECT job, what, failures, broken FROM user_jobs;
控制 JOB
-- 停用
BEGIN DBMS_JOB.BROKEN(jobno, TRUE); END;
-- 啟用(立即執行一次)
BEGIN DBMS_JOB.RUN(jobno); END;
-- 刪除
BEGIN DBMS_JOB.REMOVE(jobno); END;
修改 JOB
-- 修改執行內容
BEGIN DBMS_JOB.WHAT(jobno, 'new_procedure;'); END;
-- 修改間隔
BEGIN DBMS_JOB.INTERVAL(jobno, 'SYSDATE + 1'); END;
-- 修改下次執行時間
BEGIN DBMS_JOB.NEXT_DATE(jobno, SYSDATE + 1); END;
INTERVAL 經典寫法速查
| 需求 | INTERVAL 表達式 |
| 每分鐘 | TRUNC(SYSDATE,'MI') + 1/(24*60) |
| 每天凌晨 1 點 | TRUNC(SYSDATE) + 1 + 1/24 |
| 每周一凌晨 1 點 | TRUNC(NEXT_DAY(SYSDATE,'星期一')) + 1/24 |
| 每月 1 號凌晨 1 點 | TRUNC(LAST_DAY(SYSDATE)) + 1 + 1/24 |
| 每季度首日 1 點 | TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24 |
| 每半年 1/7 月 1 號 1 點 | ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),6) + 1/24 |
| 每年 1 月 1 日 1 點 | ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),12) + 1/24 |
Toad 風格速查
- 每天:
TRUNC(SYSDATE+1)
- 每周:
TRUNC(SYSDATE+7)
- 每月:
TRUNC(SYSDATE+30)
- 每天 6 點:
TRUNC(SYSDATE+1) + 6/24
- 半小時:
SYSDATE + 30/(24*60)
- 每小時第 15 分:
TRUNC(SYSDATE,'HH') + 75/(24*60)
注意
- 10g+ 推薦使用
DBMS_SCHEDULER,功能更強(鏈、事件驅動、資源管理)。
- JOB 失敗 16 次後自動標記 BROKEN,需人工干預。