2022年12月14日水曜日

アプリケーション・インポート後の自動化を自動的にアクティブにする

 アプリケーションに作成されている自動化は、アプリケーションをインポートした時点では無効になっています。インポート後にいきなりアクティブになり、知らないうちに処理が実行されても困るので、これは妥当な仕様でしょう。

Oracle APEX 22.1のマニュアルでは以下のセクションに説明があります。

アプリケーション・ビルダー・ユーザーズ・ガイド
19.5.2 自動化のインポートとエクポートについて

とはいえ、インポート後に操作しなくてもアクティブになって欲しい自動化の処理もあるようです。少し実装方法について考えてみました。

これも自動化を使って実装します。

Oracle APEXの自動化はAPEXの標準ビューAPEX_APPL_AUTOMATIONSより、登録されている自動化やそのステータスを確認できます。

以下のSELECT文で無効になっている自動化を見つけることができます。静的ID(列static_id)がauto-enabled-で始まるという条件を付けることにより、インポート後に自動的にアクティブにしたい自動化を選択しています。

自動化をアクティブにするためにプロシージャAPEX_AUTOMATION.ENABLEが使えます。このプロシージャの引数は自動化が作成されているアプリケーションIDと自動化の静的IDです。そのため、上記のSELECT文で検索された値を引数としてAPEX_AUTOMATION.ENABLEを呼び出すことで、自動化をアクティブにできそうです。

APEXアプリケーションを作成し、上記の処理を実装してみます。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前自動化親アプリとします。

アプリケーションの作成をクリックします。


アプリケーションが作成されたら、自動化の作成を行います。

共有コンポーネント自動化を開きます。


作成済みの自動化が一覧されます。作成をクリックします。


名前自動有効化とします。タイプスケジュール済(翻訳がいまひとつです。定期実行または繰り返し実行のことです。)、アクションの開始問合せを選択します。実行スケジュールは、この中で一番短い15分ごとを選択します。

へ進みます。


データ・ソースローカル・データベースソース・タイプとしてSQL問合せを選択し、SQL SELECT文を入力に、アクティブに変更する自動化を検索するSELECT文を記述します。アクションの実行時間(これも翻訳が今ひとつです。アクションが実行されるタイミングです。)として行が返されるを選択します。


以上で作成をクリックします。

自動化が作成されます。

最初にアクションの実行のセクションを変更します。

アクションの実行時間行が返されるのままです。主キー列としてAUTOMATION_ID(Number)を選択します。設定ミスなどがあり自動化が大量に実行されることを防ぐため、処理する最大行数アクションのエラーの処理自動化の無効化を選択します。動作の確認ができたら、より緩やかな設定に変更します。


アクションにデフォルトで作成されている新規アクションを編集します。


アクション名前自動化をアクティブにするに変更し、コードからはAPEX_AUTOMATION.ENABLEを呼び出します。


以上で自動化の作成は完了です。

スケジュール・ステータスアクティブにし、保存して実行します。


実行ログは、自動化実行ログより確認できます。


動作確認のために別にAPEXアプリケーションを作成し、自動化を作成します。静的IDauto-enable-testとします。スケジュール・ステータス無効にします。

特にAlways Freeのインスタンスを使用している場合ですが、OCPUに限りがあるので無駄に自動化が動かないよう、一日に一度など少ない実行間隔にしておきます。


アプリケーション・ビルダーには複数のアプリケーションの自動化の状態を一度に確認する画面は無いみたいなので、以下のSELECT文により動作を確認します。


POLLING_STATUS_CODEがDISABLEDだった自動化がACTIVEに変わっていたら、期待通りに動作していると言えます。

自動化以外なにもないですが、アプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/enable-automation-by-automation.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。