首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle DBMS_JOB 定時排程完整教學:建立、管理與排程語法大全

     編輯:Oracle 資料庫相關知識

一、DBMS_JOB 核心操作語法

操作語法說明
建立 Jobdbms_job.submit(:jobno, 'procedure;', next_date, 'interval')系統自動分配 jobno;interval 以「天」為單位
刪除 Jobdbms_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 監控視圖關鍵欄位

欄位型別說明
JOBNUMBER任務唯一編號
LOG_USERVARCHAR2(30)提交任務的使用者
PRIV_USERVARCHAR2(30)授予權限的使用者
SCHEMA_USERVARCHAR2(30)語法解析的結構擁有者
LAST_DATEDATE上次成功執行時間
NEXT_DATEDATE下次排程執行時間
FAILURESNUMBER連續失敗次數
BROKENVARCHAR2(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:00trunc(next_day(sysdate,'星期一')) + 1/24
每月 1 號 01:00trunc(last_day(sysdate)) + 1 + 1/24
每季首日 01:00trunc(add_months(sysdate,3),'Q') + 1/24
每半年(1/1、7/1)01:00add_months(trunc(sysdate,'yyyy'),6) + 1/24
每年 1/1 01:00add_months(trunc(sysdate,'yyyy'),12) + 1/24
每天 08:10trunc(sysdate+1) + (8*60+10)/(24*60)
每小時第 15 分trunc(sysdate,'hh') + (60+15)/(24*60)
每 30 分鐘sysdate + 30/(24*60)

六、注意事項

  1. 所有 DDL 操作後需 COMMIT 才生效
  2. job_queue_processes 必須 > 0,否則排程不會執行
  3. 12c 建議改用 DBMS_SCHEDULER,功能更強大且支援雲端架構
  4. 排程間隔以「天」為單位,需自行換算分鐘/小時
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved