DBMS_JOB 是 Oracle 傳統作業排程機制(10g 前主流,11g+ 建議遷移至 DBMS_SCHEDULER),適用於簡單週期性 PL/SQL 執行需求。本文以實戰範例完整示範建立、監控、停止全流程。
-- 建立測試表
CREATE TABLE HWQY.TEST (
CARNO VARCHAR2(30),
CARINFOID NUMBER
);
-- 建立序列與存儲過程
CREATE SEQUENCE S_CarInfoID START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE PROCEDURE PRO_TEST AS
V_CARINFO_ID NUMBER;
BEGIN
SELECT S_CarInfoID.NEXTVAL INTO V_CARINFO_ID FROM DUAL;
INSERT INTO TEST (CARNO, CARINFOID) VALUES (V_CARINFO_ID, '123');
COMMIT;
END PRO_TEST;
VARIABLE JOBNO NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
JOB => :JOBNO,
WHAT => 'PRO_TEST;',
NEXT_DATE => SYSDATE,
INTERVAL => 'SYSDATE + 1/24/12' -- 每 5 分鐘執行一次
);
COMMIT;
END;
/
參數說明:
WHAT:要執行的 PL/SQL 區塊(必須以分號結尾)NEXT_DATE:首次執行時間INTERVAL:重複間隔運算式,回傳下一次執行日期| 需求 | INTERVAL 運算式 |
|---|---|
| 每 5 分鐘 | SYSDATE + 1/24/12 |
| 每小時 | SYSDATE + 1/24 |
| 每天固定時間 | TRUNC(SYSDATE+1) + 3/24 -- 次日 03:00 |
| 每週一 | NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 6/24 |
| 每月 1 號 | ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1) + 2/24 |
-- 查詢使用者作業佇列
SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN
FROM USER_JOBS;
-- 查詢詳細執行狀態
SELECT JOB, LAST_DATE, LAST_SEC, THIS_DATE, THIS_SEC,
FAILURES, BROKEN, INTERVAL
FROM USER_JOBS;
關鍵欄位:BROKEN='Y' 表示作業中斷需人工介入,FAILURES 累計失敗次數(達 16 次自動標記 BROKEN)。
-- 停用/移除作業 (JOB=1)
BEGIN DBMS_JOB.REMOVE(1); COMMIT; END;
/
-- 暫停作業 (標記 BROKEN)
BEGIN DBMS_JOB.BROKEN(1, TRUE); COMMIT; END;
/
-- 恢復作業
BEGIN DBMS_JOB.BROKEN(1, FALSE); COMMIT; END;
/
-- 強制立即執行一次
BEGIN DBMS_JOB.RUN(1); COMMIT; END;
/
-- 修改執行間隔
BEGIN DBMS_JOB.INTERVAL(1, 'SYSDATE + 1/24'); COMMIT; END;
/
-- 修改下次執行時間
BEGIN DBMS_JOB.NEXT_DATE(1, SYSDATE + 1/24); COMMIT; END;
/
-- 檢查作業佇列進程數 (必須 > 0)
SHOW PARAMETER JOB_QUEUE_PROCESSES;
-- 啟用/調整 (需重啟實例或 ALTER SYSTEM)
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 10 SCOPE=BOTH;
VARIABLE JOBNO NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT(
JOB => :JOBNO,
WHAT => 'PRO_TEST;',
NEXT_DATE => TO_DATE('21-02-2008 17:37:26', 'DD-MM-YYYY HH24:MI:SS'),
INTERVAL => 'SYSDATE + 1/24/12'
);
COMMIT;
END;
/
Oracle 10g+ 強烈建議遷移至 DBMS_SCHEDULER,提供: