こんにちは。山田です。

Oracle APEXには自動化というジョブを定期的に実行する機能があります。今回は定期実行ではなく、アプリケーション側から手動で実行する方法について、以下の流れで解説いたします。

  • 自動化とジョブの作成
  • ジョブを実行するインターフェースの作成
  • ジョブを実行するプロセスの記載

バージョン情報

項目バージョン
Oracle APEX23.2.0
Oracle Database19c

更新履歴

日付更新概要
2025/07/11記事公開

自動化とジョブの作成

自動化の作成

作成済みのアプリケーション開発ページ > 共有コンポーネント > 自動化と移動します。

共有コンポーネント画面

作成ボタンをクリックし自動化の作成フォームを開きます。

自動化新規作成画面
自動化作成画面
  1. 名前は任意です。
  2. タイプ > オンデマンドを選択します。
    • スケジュール済みは自動化のジョブを指定した間隔や時間で実行します。(今回は選択しません。)
  3. アクションの開始については、問合せを選択してください。

次 >をクリックしソースの設定に移ります。

自動化詳細作成画面
  1. データ・ソース > ローカル・データベース
    • ここでは自動化の実行条件となるソースの種類を選択します。
  2. ソース・タイプ >
  3. 所有者 > 任意のスキーマ
  4. 表/ビューの名前 > 任意のテーブル
  5. アクションの実行時間 > 行が返される
    • 行が返されるを選択すると、表に存在するデータに対して1行ずつジョブを実行します。データを絞る場合は、ソースタイプでSQL問合せを選択するか、実行時にフィルタを構成できます。

表/ビューの名前で指定するのはジョブの実行条件として利用されるテーブルです。取得したデータは作成したジョブのコード内で利用できます。
今回はサンプルとして以下の構成のテーブルを使用します。

  • TESTテーブル
カラム名データ型制約説明
IDNUMBERPRIMARY KEY主キー
VALUEVARCHAR2
  • テーブルデータ
IDVALUE
1a
2b
3c
11aa
22bb
33cc

ジョブの作成

追加した自動化に対してジョブの追加を行います。

自動化追加後のページからアクションセクションまで移動し、ペンマークをクリックしアクションの設定ページを開きます。

アクション追加画面への遷移
こちらのアクションについては自動化作成時点で自動的に追加されるようになっています。

自動化で実行されるジョブの追加を行います。
アクション設定

今回はデバッグメッセージの出力を行います。
取得した行のVALUE列データを、:VALUEバインド変数で利用できます。

以下が実際に使用するPL/SQLコードです。

begin
  APEX_AUTOMATION.LOG_INFO(
    p_message => '動作確認, VALUE:'||:VALUE);
end;

変更後ページ右上の変更の適用ボタンから保存します。

ジョブを実行するインターフェースの作成

次に、自動化を実行する際のインターフェース部分を作成します。

アプリケーションのページデザイナに戻り、適当な場所にボタンを配置します。

ボタン配置画面

ボタン名は任意です、プロセスを設定する際に用います。

次に、プロセスタブに移動し、プロセスを追加します。

プロセス配置画面

プロセス名は任意です。
ソース > PL/SQLコード については後ほど記載するので、空欄のまま進めます。

追加したプロセスの サーバー側の条件 > ボタン押下時 にて先ほど追加したボタンを指定します。

ボタン押下時追加

ジョブを実行するプロセスの記載

今回自動化を実行するために、APEX_AUTOMATIONEXECUTEプロシージャを用いますが、3種類のシグネチャが存在するため、それぞれの実装方法と特徴について記載します。

APEX_AUTOMATION.EXECUTE シグネチャ1を使用した実装

シグネチャ1の説明

まずは構文と各引数について公式ドキュメントのOracle APEX APIリファレンス > 10.4 EXECUTEプロシージャのシグネチャ1を参考に説明させて頂きます。

Oracle APEX APIリファレンス, リリース23.2
F90504-02
10 APEX_AUTOMATION

  • 構文
APEX_AUTOMATION.EXECUTE (
    p_application_id    IN NUMBER                   DEFAULT {current application id},
    p_static_id         IN VARCHAR2,
    p_filters           IN apex_exec.t_filters      DEFAULT apex_exec.c_empty_filters,
    p_order_bys         IN apex_exec.t_order_bys    DEFAULT apex_exec.c_empty_order_bys )
  • 引数
パラメータ説明
p_application_id自動化を含むアプリケーションのID。
p_static_id実行する自動化の静的ID。
p_filters自動化問合せに適用する追加のフィルタ。
p_order_bys自動化問合せに適用するORDER BY句。

こちらは、一番簡素に自動化を実行できるプロシージャです。

シグネチャ1を使用した実装

追加したプロセスの ソース > PL/SQLコード のエディタを開きます。

プロセス記載画面への遷移

以下のPL/SQLコードを記載します。

begin
  APEX_AUTOMATION.EXECUTE (
    p_application_id => <アプリケーション番号>,
    p_static_id      => <自動化の静的ID>
  );
end;

p_application_idには実行したい自動化が存在するアプリケーション番号を選択します。
p_static_idには 共有コンポーネント > 自動化 から実行する自動化を選択し、自動化ページ内の 名前 > 静的ID に記載されているものを指定します。

  • p_static_idの参照先
静的ID

以下が実際に記載したものになります。
シグネチャ1追加

シグネチャ1の動作確認

変更を保存した後、アプリケーションを実行し、追加したボタンをクリックして自動化を実行してみます。

実行ボタン

再び開発画面に戻り、共有コンポーネント > 自動化 と移動し、実行ログの箇所をクリックします。

実行ログ画面への遷移

実行ログ画面へ遷移すると、実行した自動化の履歴が確認できます。
先ほど実行した行のメッセージ列の数字をクリックします。

ログメッセージ画面への遷移

この画面でログの出力がされているので、自動化が実行されたことが確認できます。
メッセージから、バインド変数の:VALUETESTテーブルの各レコードの値に置き換わって出力されているのが確認できると思います。

シグネチャ1実行ログ

ここまでで自動化をオンデマンドで実行することが可能になりました。
この先ではより詳細な設定を行った方法の紹介を行いますので、気になる場合は引き続きご覧いただけると幸いです。

フィルタ・order byを使用する場合

フィルタ・order byを使用した実装

再び実行アプリケーションのページデザイナに戻り、プロセスタブから作成済みのプロセスのコード・エディタを開きます。
今回はID11以上のカラムを降順に処理する、という場合を想定します。

PL/SQLコードは以下になります。

declare
  l_filters APEX_EXEC.t_filters;
  l_order_bys APEX_EXEC.t_order_bys;
begin
  APEX_EXEC.ADD_ORDER_BY(
    p_order_bys     => l_order_bys,
    p_column_name   => 'ID',
    p_direction     => APEX_EXEC.c_order_desc
  );
  APEX_EXEC.ADD_FILTER(
    p_filters        => l_filters,
    p_column_name    => 'ID',
    p_filter_type    => APEX_EXEC.c_filter_gte,
    p_value          => 11
  );
  APEX_AUTOMATION.EXECUTE (
    p_application_id => <アプリケーション番号>,
    p_static_id      => <自動化の静的ID>,
    p_filters        => l_filters,
    p_order_bys      => l_order_bys
  );
end;

ADD_ORDER_BYプロシージャで降順に処理を行う設定を行い、ADD_FILTERプロシージャでID11以上の絞り込みの設定を行っています。
詳細については公式ドキュメントのOracle APEX APIリファレンス > 25 APEX_EXECを参照して頂けますと幸いです。

Oracle APEX APIリファレンス, リリース23.2
F90504-02
25 APEX_EXEC

以下が実際に記載したものになります。
フィルタ使用コード記載

通常のプロセス同様、アプリケーションアイテムのバインド変数を指定することで、動的な自動化の実行を行うことも可能です。

フィルタ・order by使用時の動作確認

実行した結果は以下の通りです。

フィルタ使用時の結果画面

IDが11以上のaa, bb, ccのみが出力されるようになっています。
(わかりやすいようにデバッグメッセージにIDも出力されるように変更しています。)
また、ログは最新のものが上に表記されるため、降順で実行されていることもわかると思います。

APEX_AUTOMATION.EXECUTE シグネチャ2を使用した実装

シグネチャ2の説明

こちらについてもまずは構文と各引数について公式ドキュメントのOracle APEX APIリファレンス > 10.5 EXECUTEプロシージャのシグネチャ2を参考に説明させて頂きます。

Oracle APEX APIリファレンス, リリース23.2
F90504-02
10 APEX_AUTOMATION

  • 構文
APEX_AUTOMATION.EXECUTE (
    p_application_id    IN NUMBER DEFAULT {current application id},
    p_static_id         IN VARCHAR2,
    p_run_in_background IN BOOLEAN )
  • 引数
パラメータ説明
p_application_id自動化を含むアプリケーションのID。
p_static_id実行する自動化の静的ID。
p_run_in_backgroundTRUEの場合、同期はワンタイムDBMS_SCHEDULERジョブとしてバックグラウンドで実行されます。

こちらは、バックグラウンドで自動化を実行可能なプロシージャです。
p_run_in_backgroundTRUEに設定した場合、フォアグラウンドで実行する場合と異なり、セッションのタイムアウトを超えるほど時間のかかる処理を行うことが可能です。

シグネチャ2を使用した実装

実際にシグネチャ2を使用して実装してみます。

追加したプロセスの ソース > PL/SQLコード のエディタを開きます。
以下のPL/SQLコードを記載します。

begin
  APEX_AUTOMATION.EXECUTE (
    p_application_id    => <アプリケーション番号>,
    p_static_id         => <自動化の静的ID>,
    p_run_in_background => TRUE
  );
end;

以下が実際に記載したものになります。
シグネチャ2追加画面

シグネチャ2の動作確認

手順についてはシグネチャ1の時と同様です。
実行結果を確認します。

シグネチャ2実行結果確認画面

実行結果としては、シグネチャ1の簡易的な方式の実行結果と同様です。
こちらの実行結果では確認できませんが、バックグラウンドで実行されました。

APEX_AUTOMATION.EXECUTE シグネチャ3を使用した実装

シグネチャ3の説明

こちらについてもまずは構文と各引数について公式ドキュメントのOracle APEX APIリファレンス > 10.6 問合せコンテキストのEXECUTEプロシージャを参考に説明させて頂きます。

Oracle APEX APIリファレンス, リリース23.2
F90504-02
10 APEX_AUTOMATION

ドキュメントには問い合わせコンテキストのEXECUTEプロシージャと記載されているのですが、ここではシグネチャ3と呼ばせて頂きます。

  • 構文
APEX_AUTOMATION.EXECUTE (
    p_application_id    IN NUMBER   DEFAULT {current application id},
    p_static_id         IN VARCHAR2,
    p_query_context     IN apex_exec.t_context )
  • 引数
パラメータ説明
p_application_id自動化を含むアプリケーションのID。
p_static_id実行する自動化の静的ID。
p_query_context問合せのアクションを実行するコンテキスト。

こちらはシグネチャ1のフィルタ機能をSQLのクエリで実現することができるシグネチャです。

シグネチャ3を使用した実装

こちらも実装を行います。

追加したプロセスの ソース > PL/SQLコード のエディタを開きます。
以下のPL/SQLコードを記載します。

declare
  l_context APEX_EXEC.t_context;
begin
  l_context := APEX_EXEC.OPEN_QUERY_CONTEXT(
    p_location         => APEX_EXEC.c_location_local_db,
    p_sql_query        => <SQLクエリ>
  );
  APEX_AUTOMATION.EXECUTE (
    p_application_id => <アプリケーション番号>,
    p_static_id      => <自動化の静的ID>,
    p_query_context  => l_context
  );
end;

以下が実際に記載したものになります。
シグネチャ3追加画面

こちらではAPEX_EXECOPEN_QUERY_CONTEXTファンクションを使用してSQLクエリをEXECUTEに渡します。
今回の場合はTESTテーブルからIDが1と11のレコードを取得して実行しました。

シグネチャ3の動作確認

これまでと同様に自動化を実行し、結果を確認します。

シグネチャ3実行結果画面

実行結果からわかるように、IDが1と11のレコードでのみ実行されています。
わかりやすいようにデバッグメッセージにIDも出力されるように変更しています。

シグネチャ3に関してもフォアグラウンドで実行する形なので、時間のかかる処理を行う場合はシグネチャ2を使用する必要があります。

以上で、Oracle APEXの自動化を画面のボタンから実行する方法についての解説を終わります。
ご覧いただきありがとうございました。