-- 動態調整,立即生效 (需 > 0)
ALTER SYSTEM SET job_queue_processes = 10 SCOPE = BOTH;
-- 最大值 1000,視併發排程數量設定
-- 查看背景程序狀態
SELECT name, description FROM v$bgprocess WHERE name LIKE 'J%';
-- J000 ~ J999 為 Job Queue Processes
注意:11gR2 起建議改用 DBMS_SCHEDULER (更強大、支援鏈條、事件驅動、資源管理),DBMS_JOB 僅為相容保留。
| 子程序 | 功能 |
|---|---|
SUBMIT | 提交新 Job,回傳 Job Number |
REMOVE | 刪除 Job |
CHANGE | 修改 Job 定義 (WHAT/INTERVAL/NEXT_DATE) |
BROKEN | 標記 Job 為 Broken/正常 |
RUN | 立即執行 Job (同步) |
NEXT_DATE | 修改下次執行時間 |
INTERVAL | 修改執行間隔運算式 |
WHAT | 修改執行內容 |
USER_EXPORT | 匯出 Job 定義 (供遷移) |
PROCEDURE Broken (
job IN BINARY_INTEGER,
broken IN BOOLEAN,
next_date IN DATE := SYSDATE
);
job:SUBMIT 回傳的 Job Numberbroken:TRUE 標記失效 (不再執行);FALSE 恢復正常next_date:下次執行時間,預設目前時間連續 16 次執行失敗 (例外未捕捉) → Oracle 自動標記 Broken。
BEGIN
DBMS_JOB.RUN(:jobno); -- :jobno 為 SUBMIT 回傳值
END;
/
BEGIN
DBMS_JOB.BROKEN(:jobno, FALSE, SYSDATE + 1/24); -- 1 小時後執行
END;
/
CREATE TABLE test_job (run_time DATE);
CREATE OR REPLACE PROCEDURE my_job_proc AS
BEGIN
INSERT INTO test_job VALUES (SYSDATE);
COMMIT;
END;
/
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
job => :jobno,
what => 'my_job_proc;',
next_date => SYSDATE,
interval => 'SYSDATE + 1/1440' -- 1 分鐘 = 1/1440 天
);
COMMIT;
END;
/
PRINT jobno;
BEGIN
DBMS_JOB.RUN(:jobno);
END;
/
SELECT * FROM test_job;
SELECT job, next_date, next_sec, failures, broken
FROM user_jobs;
-- 改為每小時
BEGIN
DBMS_JOB.INTERVAL(:jobno, 'SYSDATE + 1/24');
COMMIT;
END;
/
-- 改內容
BEGIN
DBMS_JOB.WHAT(:jobno, 'my_job_proc;');
COMMIT;
END;
/
BEGIN
DBMS_JOB.REMOVE(:jobno);
COMMIT;
END;
/
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'MY_JOB',
job_type => 'STORED_PROCEDURE',
job_action => 'MY_JOB_PROC',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY; INTERVAL=1',
enabled => TRUE,
comments => '遷移自 DBMS_JOB'
);
END;
/
優勢:支援時區、事件驅動、鏈條、資源消費控制、詳細日誌 (DBA_SCHEDULER_JOB_RUN_DETAILS)。
| 現象 | 可能原因 | 解決 |
|---|---|---|
| Job 不執行 | job_queue_processes=0 | 設定 > 0 |
| Job 變 Broken | Procedure 拋出未處理例外 | 加入 EXCEPTION WHEN OTHERS THEN NULL/LOG; 並檢查 Alert Log |
| 執行時間漂移 | INTERVAL 運算式以「上次啟動時間」為基準 | 改用 DBMS_SCHEDULER 固定排程 |
| 無法提交 | 無 CREATE JOB 權限 / JOB_QUEUE_PROCESSES 為 0 | 授權 / 設定參數 |