【PL/SQL】DBMS_SCHEDULERでジョブを管理する方法|定期実行・依存関係の制御とログ管理

【PL/SQL】DBMS_SCHEDULERでジョブを管理する方法|定期実行・依存関係の制御とログ管理 PL/SQL

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を活用するのが主流となるでしょう。