Oracle Databaseで定期処理を実行したいとき、従来はDBMS_JOB
が使われていましたが、現在はより高機能なDBMS_SCHEDULERが推奨されています。
DBMS_SCHEDULERは、ジョブのスケジュール、依存関係の管理、ログの取得、リソース制御など、多機能で柔軟なジョブ管理が可能です。
本記事では、DBMS_SCHEDULERの基本から実践的な活用方法まで、PL/SQLによる操作例を交えて解説します。
DBMS_SCHEDULERの特徴
DBMS_SCHEDULERは、Oracle 10g以降で導入されたジョブスケジューラです。以下のような特徴があります。
- 複雑なスケジュール(カレンダー形式、間隔指定)が可能
- ジョブ同士の依存関係を管理可能(ジョブチェーン)
- 実行ログやエラーログの管理機能あり
- ファイル実行、外部OSコマンドの呼び出しにも対応
- GUI(Enterprise Manager)からも管理可能
ジョブの基本構成要素
DBMS_SCHEDULERでジョブを実行するには、以下の要素を定義する必要があります。
- Program:実行するPL/SQLや外部プロセス
- Schedule:実行タイミング(日時、間隔など)
- Job:ProgramとScheduleを紐付けた実体
これらを個別に定義して組み合わせることも、直接Jobだけ作成することも可能です。
PL/SQLによるジョブ作成の基本
1. プログラムとスケジュールを分けずに直接ジョブ作成
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'job_hello_world',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DBMS_OUTPUT.PUT_LINE(''Hello World''); END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY; INTERVAL=10',
enabled => TRUE
);
END;
この例では、10分ごとに”Hello World”を出力するジョブを作成しています。
2. ProgramとScheduleを事前定義して使いまわす
-- Programの作成
BEGIN
DBMS_SCHEDULER.create_program (
program_name => 'prog_example',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN your_procedure(); END;',
enabled => TRUE
);
END;
-- Scheduleの作成
BEGIN
DBMS_SCHEDULER.create_schedule (
schedule_name => 'sch_daily_2am',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0',
comments => '毎日午前2時に実行'
);
END;
-- Program + Scheduleを使ってJob作成
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'job_daily_run',
program_name => 'prog_example',
schedule_name => 'sch_daily_2am',
enabled => TRUE
);
END;
ジョブの依存関係(チェーン)の定義
複数のジョブを順に実行したい場合、ジョブチェーンを使います。
-- チェーン定義
BEGIN
DBMS_SCHEDULER.create_chain('chain_example', NULL, NULL);
END;
-- ステップ登録(ステップ名、プログラム名)
BEGIN
DBMS_SCHEDULER.define_chain_step('chain_example', 'step1', 'prog_step1');
DBMS_SCHEDULER.define_chain_step('chain_example', 'step2', 'prog_step2');
END;
-- 依存関係の定義(step1成功時にstep2を実行)
BEGIN
DBMS_SCHEDULER.define_chain_rule('chain_example', 'TRUE', 'START step1');
DBMS_SCHEDULER.define_chain_rule('chain_example', 'step1 COMPLETED', 'START step2');
END;
ジョブのログ確認
ジョブの実行状況やエラーは、以下のビューで確認できます。
DBA_SCHEDULER_JOB_RUN_DETAILS
:ジョブの実行履歴DBA_SCHEDULER_JOB_LOG
:ジョブのログメッセージDBA_SCHEDULER_JOBS
:登録済ジョブの一覧
SELECT job_name, status, error# FROM DBA_SCHEDULER_JOB_RUN_DETAILS
WHERE job_name = 'JOB_DAILY_RUN'
ORDER BY log_date DESC;
ジョブの有効化・無効化・削除
-- 一時的に無効化
BEGIN
DBMS_SCHEDULER.disable('job_daily_run');
END;
-- 再有効化
BEGIN
DBMS_SCHEDULER.enable('job_daily_run');
END;
-- ジョブの削除
BEGIN
DBMS_SCHEDULER.drop_job('job_daily_run');
END;
まとめ:DBMS_SCHEDULERで信頼性の高いジョブ管理を実現
DBMS_SCHEDULERは、Oracleにおける高機能なジョブスケジューラとして、定期実行や複雑な依存関係の制御、ログ管理を簡潔に実装できる強力なツールです。
正しく使えば、ジョブ処理の可視化や保守性の向上につながり、業務の自動化や効率化を大きく推進できます。DBMS_JOBからの移行先としても十分な機能を備えており、今後の開発・運用ではDBMS_SCHEDULERを活用するのが主流となるでしょう。