首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle DBMS_JOB 實戰範例:從建表、建 Procedure 到提交、執行、查詢、刪除完整流程

     編輯:Oracle 資料庫基礎

完整實戰步驟

1. 建立測試表


SQL> CREATE TABLE test (a DATE);
Table created.

2. 建立排程執行的 Procedure


SQL> CREATE OR REPLACE PROCEDURE myproc AS
  2  BEGIN
  3    INSERT INTO test VALUES (SYSDATE);
  4  END;
  5  /
Procedure created.

3. 宣告變數並提交 Job (每分鐘執行一次)


SQL> VARIABLE job1 NUMBER;
SQL> BEGIN
  2    DBMS_JOB.SUBMIT(
  3      job     => :job1,
  4      what    => 'myproc;',
  5      next_date => SYSDATE,
  6      interval  => 'SYSDATE + 1/1440'  -- 1 天 = 1440 分鐘
  7    );
  8    COMMIT;
  9  END;
 10  /
PL/SQL procedure successfully completed.

SQL> PRINT job1
JOB1
----------
14144

4. 立即手動執行驗證


SQL> BEGIN
  2    DBMS_JOB.RUN(:job1);
  3  END;
  4  /
PL/SQL procedure successfully completed.

5. 查詢執行結果 (格式化時間顯示)


SQL> SELECT TO_CHAR(a, 'YYYY/MM/DD HH24:MI:SS') "執行時間" FROM test;

執行時間
-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24

每分鐘精確執行一次,驗證成功。

6. 刪除 Job


SQL> BEGIN
  2    DBMS_JOB.REMOVE(:job1);
  3    COMMIT;
  4  END;
  5  /
PL/SQL procedure successfully completed.

關鍵語法重點整理

操作關鍵語法注意事項
提交DBMS_JOB.SUBMIT(:job, 'proc;', SYSDATE, 'SYSDATE+1/1440')INTERVAL 必須為字串運算式,以「上次啟動時間」為基準計算下次
立即執行DBMS_JOB.RUN(:job)同步執行,會阻塞至完成;非同步請用 DBMS_SCHEDULER.RUN_JOB(..., USE_CURRENT_SESSION=>FALSE)
查詢SELECT * FROM USER_JOBS含 NEXT_DATE、FAILURES、BROKEN、WHAT
刪除DBMS_JOB.REMOVE(:job)需 COMMIT 生效

INTERVAL 運算式常用範例

  • 'SYSDATE + 1/24':每小時 (1/24 天)
  • 'SYSDATE + 1/1440':每分鐘 (1/1440 天)
  • 'TRUNC(SYSDATE+1) + 6/24':每天凌晨 06:00
  • 'NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'') + 9/24':每週一 09:00
  • 'ADD_MONTHS(TRUNC(SYSDATE,''MM''),1) + 2/24':每月 1 號 02:00

缺點:以「上次實際啟動時間」為基準,若執行耗時長或系統忙碌導致延遲,後續排程會逐漸漂移。DBMS_SCHEDULER 的 REPEAT_INTERVAL 採固定時刻表 (Calendaring Syntax),無漂移問題。

常見錯誤與解決

錯誤原因解決
ORA-23421: job number not foundJob Number 錯誤或已刪除確認 USER_JOBS 存在的 Job Number
ORA-04068: existing state of packages has been discardedProcedure 重新編譯導致狀態失效重新提交 Job 或重新連線
Job 不執行JOB_QUEUE_PROCESSES = 0ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 10
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved