一、DBMS_JOB 核心操作語法
| 操作 | 語法 | 說明 |
| 建立 Job | dbms_job.submit(:jobno, 'procedure;', next_date, 'interval') | 系統自動分配 jobno;interval 以「天」為單位 |
| 刪除 Job | dbms_job.remove(jobno) | |
| 修改執行內容 | dbms_job.what(jobno, 'new_procedure;') | |
| 修改下次執行時間 | dbms_job.next_date(jobno, next_date) | |
| 修改間隔時間 | dbms_job.interval(jobno, 'interval') | |
| 立即執行一次 | dbms_job.run(jobno) | |
| 啟用/停用 | dbms_job.broken(jobno, TRUE/FALSE, next_date) | TRUE=停用,FALSE=啟用 |
二、初始化參數 job_queue_processes
- 控制並發 Job 執行緒數量,0 表示完全停用排程功能
- 查看:
show parameter job_queue_processes 或 select * from v$parameter where name='job_queue_processes'
- 修改:
alter system set job_queue_processes = 10;
三、USER_JOBS 監控視圖關鍵欄位
| 欄位 | 型別 | 說明 |
| JOB | NUMBER | 任務唯一編號 |
| LOG_USER | VARCHAR2(30) | 提交任務的使用者 |
| PRIV_USER | VARCHAR2(30) | 授予權限的使用者 |
| SCHEMA_USER | VARCHAR2(30) | 語法解析的結構擁有者 |
| LAST_DATE | DATE | 上次成功執行時間 |
| NEXT_DATE | DATE | 下次排程執行時間 |
| FAILURES | NUMBER | 連續失敗次數 |
| BROKEN | VARCHAR2(1) | Y=停用,N=啟用 |
四、實戰範例:每分鐘寫入時間戳記
1. 建立測試表與程序
create table t (id varchar2(30), name varchar2(30));
create or replace procedure proce_t is
begin
insert into t(id, name) values('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));
commit;
end proce_t;
/
2. 建立排程(每 1 分鐘)
variable jobno number;
begin
dbms_job.submit(:jobno, 'proce_t;', sysdate, 'sysdate+1/24/60');
commit;
end;
/
-- 回傳 jobno 例如 25
3. 追蹤執行狀態
select job, next_date, next_sec, failures, broken from user_jobs;
-- JOB NEXT_DATE NEXT_SEC FAILURES BROKEN
-- 25 2012/9/14 10:59:46 0 N
4. 停用與啟用示範
-- 停用
begin dbms_job.broken(25, true, sysdate); commit; end; /
-- 查看 BROKEN=Y, NEXT_DATE=4000/1/1
-- 啟用
begin dbms_job.run(25); commit; end; /
-- 查看 BROKEN=N, NEXT_DATE 恢復正常
五、常用排程 Interval 寫法速查表
| 需求 | Interval 寫法 |
| 每分鐘 | trunc(sysdate,'mi') + 1/(24*60) |
| 每天固定時間(如 01:00) | trunc(sysdate) + 1 + 1/24 |
| 每週一 01:00 | trunc(next_day(sysdate,'星期一')) + 1/24 |
| 每月 1 號 01:00 | trunc(last_day(sysdate)) + 1 + 1/24 |
| 每季首日 01:00 | trunc(add_months(sysdate,3),'Q') + 1/24 |
| 每半年(1/1、7/1)01:00 | add_months(trunc(sysdate,'yyyy'),6) + 1/24 |
| 每年 1/1 01:00 | add_months(trunc(sysdate,'yyyy'),12) + 1/24 |
| 每天 08:10 | trunc(sysdate+1) + (8*60+10)/(24*60) |
| 每小時第 15 分 | trunc(sysdate,'hh') + (60+15)/(24*60) |
| 每 30 分鐘 | sysdate + 30/(24*60) |
六、注意事項
- 所有 DDL 操作後需
COMMIT 才生效
job_queue_processes 必須 > 0,否則排程不會執行
- 12c 建議改用
DBMS_SCHEDULER,功能更強大且支援雲端架構
- 排程間隔以「天」為單位,需自行換算分鐘/小時