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

Oracle 預存程序定時執行兩大方案:Shell+Crontab 與 DBMS_JOB 實戰詳解

     編輯:Oracle 資料庫基礎

在生產環境中,預存程序的定時自動執行是常見需求。本文詳細對比兩種主流實現方案:作業系統層面的 Shell 腳本搭配 Crontab,與資料庫內建的 DBMS_JOB 套件,提供完整可落地的配置範例。

方案一:Shell 腳本 + Crontab(OS 層面調度)

適用於需執行複雜邏輯、依賴 OS 資源、或跨資料庫協同的場景。

1. Shell 腳本範例

#!/bin/sh
# 環境變數設定
ORACLE_BASE=/oracle/home
ORACLE_HOME=/oracle/home/data
NLS_LANG=american_america.ZHS16GBK
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/oracle/home/data/bin
export ORACLE_BASE ORACLE_HOME NLS_LANG PATH

# 執行 PL/SQL 區塊
sqlplus -s username/password <

2. Crontab 配置

# 每天 22:30 執行,日誌導向指定檔案
30 22 * * * /export/home/bss/bss/pr_merge_query_report.sh >> /export/home/bss/log/mergequery.log 2>&1

時間格式:分 時 日 月 週

方案二:DBMS_JOB 套件(資料庫內建調度)

適用於純資料庫內部邏輯、需緊密整合交易、避免外部依賴的場景。可透過 PL/SQL Developer 等工具圖形化配置,或直接執行 PL/SQL 區塊。

實戰範例

BEGIN
  -- 提交作業:每天凌晨 1 點執行
  SYS.DBMS_JOB.SUBMIT(
    job       => :job,
    what      => 'RATING.JOB_PRESS;',
    next_date => TO_DATE('01-01-4000', 'dd-mm-yyyy'),  -- 遠期日期配合 interval
    interval  => 'TRUNC(SYSDATE + 1)');                 -- 每天午夜

  -- 標記為 broken 狀態(需手動啟用),防止立即執行
  SYS.DBMS_JOB.BROKEN(
    job       => :job,
    broken    => TRUE,
    next_date => TO_DATE('01-01-4000', 'dd-mm-yyyy'));
  COMMIT;
END;

關鍵參數說明:

  • what:要執行的 PL/SQL 程式碼或程序呼叫
  • next_date:首次執行時間
  • interval:重複執行間隔運算式,需回傳下次執行日期
  • broken:TRUE 表示暫停,FALSE 表示啟用

方案選型建議

維度Shell + CrontabDBMS_JOB
部署複雜度需 OS 存取權、環境變數配置純資料庫操作,權限較簡單
可靠性依賴 OS 服務狀態隨資料庫啟停,HA 環境更穩健
監控與管理查看系統日誌查詢 DBA_JOBS 視圖,支援啟停修改
跨資料庫協調容易實現需 Database Link 支援
版本相容性所有版本通用10g+ 建議改用 DBMS_SCHEDULER

進階提示

Oracle 10g 及以上版本強烈建議使用功能更強大的 DBMS_SCHEDULER,支援日曆語法、事件驅動、鏈式作業、資源管理等企業級特性。DBMS_JOB 已標記為不推薦,僅為相容性保留。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved