Oracle APEX 23.1よりパッケージAPEX_APPLICATION_ADMINが追加されました。このパッケージにはいわゆるアプリーション定義の取得と変更を行うプロシージャが含まれています。
アプリケーションの別名を設定するプロシージャSET_APPLICATION_ALIASを呼び出し、2つのアプリケーションの別名を入れ替えることによって、アクセスするアプリケーションを変更するAPEXアプリケーションを作成してみます。
アプリケーション定義は、以下の画面にまとまっています。パッケージAPEX_APPLICATION_ADMINは別名以外に、可用性やグローバル通知を変更するプロシージャも含んでいます。
サンプル・データセットに含まれる表EMPからアプリケーションを作成します。
オブジェクト・ブラウザより表EMPを選択し、その他のアプリケーションの作成を実行します。
アプリケーションの名前をEmployees Mainとします。単にアプリケーションができればよいので、そのままアプリケーションの作成を実行します。
アプリケーションが作成されたら、共有コンポーネントの認証スキームを開きます。
デフォルトで作成されている認証スキームOracle APEXアカウント - カレントを開きます。
アプリケーションの入れ替え後、再度ログインが要求されない(セッションが継続する)ように、セッション共有を設定します。
タイプをカスタム、Cookie名にSESSION_EMPLOEE_APP(セッションを共有するアプリケーション間で同じCookie名であればよい)を指定します。サイトが暗号化されている場合はセキュアをオンにします。
このアプリケーションをコピーして、入れ替えるアプリケーションを作成します。
このアプリケーションのコピーは、画面右のタスクより実行します。
次へ進みます。
アプリケーションのコピーが完了したら、アプリケーションが入れ替わったことがすぐに確認できるよう、テーマ・スタイルを変更します。
アプリケーション定義のユーザー・インターフェースを開きます。属性のテーマ・スタイルをVitaからVita - Redに変更します。
以上で入れ替えに使用する2つのアプリケーションが準備できました。
アプリケーションの入れ替えを行うAPEXアプリケーションを作成します。
アプリケーション作成ウィザードを開始し、空のアプリケーションを作成します。
アプリケーションの名前はアプリケーションの入れ替えとします。
アプリケーションが作成されます。
最初に入れ替えるアプリケーションの選択に使用する、LOVを共有コンポーネントとして作成します。
共有コンポーネントのLOVを開き、作成を開始します。
LOVの作成は最初からとします。
次へ進みます。
名前はLOV_APPLICATIONSとします。タイプはDynamicです。
次へ進みます。
select application_id, alias, application_name from apex_applications
次へ進みます。
作成をクリックします。
LOVLOV_APPLICATIONSが作成されます。列ALIASを追加列とするため、編集画面を開きます。
追加表示列のセクションにある列の選択をクリックします。
ALIAS(Varchar2)をシャトルの右側に移動し、更新します。
APPLICATION_IDのヘッダーにIDを設定し、表示可能をNoからYesに変更します。
変更の適用をクリックします。
以上で、共有コンポーネントのLOVの作成は完了です。
ホーム・ページにアプリケーションを入れ替えるインターフェースを実装します。
Body以下にリージョンを作成します。識別のタイトルは左、タイプは静的コンテンツです。
識別の名前はP1_APP_L、タイプとしてポップアップLOVを選択します。ラベルはアプリケーションとします。
追加出力としてALIAS:P1_ALIAS_Lを入力します。別名を保持するページ・アイテムP1_ALIAS_Lは、この後に作成します。
LOVのタイプとして共有コンポーネントを選択し、LOVとして先ほど作成したLOV_APPLICATIONSを選びます。
選択されたアプリケーションの別名を保持するページ・アイテムを作成します。
識別の名前をP1_ALIAS_L、タイプはテキスト・フィールド、ラベルは別名とします。
リージョンのタイトルは右、アプリケーションを選択するページ・アイテムの名前はP1_APP_R、追加出力はALIAS:P1_ALIAS_R、別名を保持するページ・アイテムの名前はP1_ALIAS_Rに変わります。
左右のリージョンが横並びになるよう、リージョン右のレイアウトの新規行の開始をオフに変更します。
アプリケーションの入れ替えを実行するボタンを作成します。
識別のボタン名はSWAP、ラベルはアプリケーションの入れ替えとします。動作のアクションはデフォルトのページの送信です。
ボタンが画面幅いっぱいに広がるよう、テンプレート・オプションの詳細のWidthをStretchに変更します。
一旦ページを実行し、画面の表示を確認します。
プロセス・ビューを開き、実際にアプリケーションの入れ替えを行うプロセスを作成します。
ボタンSWAPをクリックしたときに実行されるプロセスをまとめるため、最初に実行チェーンを作成します。
プロセスを作成します。識別の名前をSWAPのクリック...とし、タイプとして実行チェーンを選択します。設定のバックグラウンドで実行はオフです。
サーバー側の条件のボタン押下時としてSWAPを選択します。
作成した実行チェーンSWAPのクリック...に子プロセスを追加します。
識別の名前はアプリケーションの入れ替え、タイプはコードを実行とします。実行チェーンはSWAPのクリック...になります。ソースのPL/SQLコードとして以下を記述します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_left_id apex_applications.application_id%type; | |
l_left_name apex_applications.application_name%type; | |
l_left_alias apex_applications.alias%type; | |
l_right_id apex_applications.application_id%type; | |
l_right_name apex_applications.application_name%type; | |
l_right_alias apex_applications.alias%type; | |
C_TEMP_ALIAS constant varchar2(80) := 'QGEADAFBTEWE'; | |
begin | |
-- 左側のアプリケーションの情報を取得する。 | |
l_left_id := :P1_APP_L; | |
l_left_alias := :P1_ALIAS_L; | |
l_left_name := apex_application_admin.get_application_name( | |
p_application_id => l_left_id | |
); | |
-- 右側のアプリケーションの情報を取得する。 | |
l_right_id := :P1_APP_R; | |
l_right_alias := :P1_ALIAS_R; | |
l_right_name := apex_application_admin.get_application_name( | |
p_application_id => l_right_id | |
); | |
-- 左側のアプリケーションに右側の情報を設定する。 | |
apex_application_admin.set_application_name( | |
p_application_id => l_left_id | |
,p_application_name => l_right_name | |
); | |
apex_application_admin.set_application_name( | |
p_application_id => l_right_id | |
,p_application_name => l_left_name | |
); | |
-- 左のアプリの別名を一時的に変更する。 | |
apex_application_admin.set_application_alias( | |
p_application_id => l_left_id | |
,p_application_alias => C_TEMP_ALIAS | |
); | |
-- 右側のアプリケーションに左側の情報を設定する。 | |
apex_application_admin.set_application_alias( | |
p_application_id => l_right_id | |
,p_application_alias => l_left_alias | |
); | |
-- 左側のアプリケーションに右側の情報を設定する。 | |
apex_application_admin.set_application_alias( | |
p_application_id => l_left_id | |
,p_application_alias => l_right_alias | |
); | |
end; |
プロセスをもうひとつ作成します。
識別の名前をクリア、タイプとしてセッション・ステートのクリアを選択します。アプリケーションが入れ替わると、左と右として選択しているアプリケーションのアプリケーションIDと名前の紐付けが変わります。そして、LOVとしてキャッシュされている内容が無効になります。
そのため、セッション・ステートをクリアして、アプリケーションを未選択の状態へ戻します。
最後にアプリケーション定義のセキュリティを開き、詳細のランタイムAPIの使用状況を変更します。
アプリケーションから管理APIを実行するため、他のアプリケーションを変更にチェックを入れます。
アプリケーションを実行すると、記事の先頭のGIF動画のように動作します。
ビルド・ステータス、可用性、認証スキーム、パーシング・スキーマ、アプリケーション名、アプリケーション・バージョン、ビルド・オプションなどもプロシージャ呼び出しで変更できるようになっています。
APEXアプリケーションの運用の自動化が、とても容易になりました。
今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/swap-app.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完