2022年12月5日月曜日

GitHubにAPEXアプリをエクスポートする(3) - アプリケーションの作成

 APEXアプリケーションをGitHubにエクスポートするアプリケーションを作成します。

最初にアプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。

名前アプリケーション・エクスポートとしました。



ページの作成



作成されたアプリケーションのホーム・ページに、ページ・アイテムを5つ、ボタンをひとつ作成します。


エクスポート対象のアプリケーションは、ポップアップLOVで選択します。選択したアプリケーションの別名をページ・アイテムP1_ALIASに設定するため、LOV共有コンポーネントとして作成します。

LOV名前LOV_APPLICATIONとします。ソースとしてSQL問合せを選択し、SQL問合せとして以下を記述します。戻り値APPLICATION_ID表示値APPLICATION_NAMEです。

select application_id, application_name, lower(alias) alias from apex_applications

追加表示列として、列ALIASを追加します。この通りでなくても構いませんが、表示可能Yes検索可能Noとしています。


エクスポートするアプリケーションを選択するページ・アイテムP1_APPLICATION_IDとして、タイプポップアップLOV設定追加出力としてALIAS:P1_ALIASを指定します。ポップアップLOVで値を選択すると、列APPLICATION_IDの値がページ・アイテムP1_APPLICATION_IDの値になり、列ALIASの値がページ・アイテムP1_ALIASの値になります。

LOVタイプとして共有コンポーネントを選択し、LOVLOV_APPLICATIONを選びます。追加値の表示OFFNULL値の表示ONNULL表示値として-- アプリケーションの選択 --を入力します。


ページ・アイテムP1_ALIASの値は、アプリケーションを選択すると自動的に設定されます。値の設定後に変更ができるよう、タイプテキスト・フィールドにします。ページ・アイテムP1_APPLICATION_IDの右隣に配置されるよう、レイアウト新規行の開始OFFにします。


上書き許可のページ・アイテムP1_ALLOW_OVERWRITEタイプ切替え(英語はSwitch)を選択します。このページ・アイテムの値はそのまま、PL/SQLのboolean値として扱うことができます

こちらもレイアウト新規行の開始OFFにします。


コミットのメッセージを保持するページ・アイテムP1_COMMIT_MESSAGEタイプとしてテキスト領域を選択します。


コミッターを保持するページ・アイテムP1_COMMIT_AUTHOR_NAMEタイプテキスト・フィールドです。


最後に送信ボタンB_EXPORTを作成します。動作アクションページの送信です。


以上でページは完成です。


置換文字列の設定



プロシージャEXPORT_APEX_APP_TO_GITHUBを呼び出す際に、APEX側で決定する固定値をアプリケーション定義置換文字列として設定します。

アプリケーション定義を開き、置換のセクションを選択します。以下の置換文字列を設定します。

G_REPO_NAE = GitHubのリポジトリ名
G_CREDENTIAL = DBMS_CLOUD.CREATE_CREDENTIALで作成したクリデンシャル名 - 今回の例通りに作成しているとGITHUB_CRED
G_OWNER = GitHubのアカウント名
G_DIRECTORY = リポジトリのディレクトリ名。指定されたディレクトリ以下にAPEXアプリケーションをエクスポートする。




プロセスの作成



左ペインでプロセス・ビューを開き、プロセスの作成を実行します。

識別名前アプリケーションのエクスポートとします。タイプとしてAPEX 22.2より追加されたAPIの呼び出しを選択します。

設定タイプとしてPL/SQL Procedure or Functionを選択します。今回はサンプルなのでプロシージャとして機能を実装していますが、製品レベルでの実装ではパッケージとして実装する(その場合はPL/SQL Packageを選択する)ことをお勧めします。

所有者Parsing SchemaプロシージャまたはファンクションとしてEXPORT_APEX_APP_TO_GITHUBを選択します。プロシージャが選択されると、そのパラメータがノードパラメータに一覧されます。

成功メッセージとしてアプリケーションがエクスポートされましたエラー・メッセージとしてアプリケーションのエクスポートに失敗しました。を設定します。エラーメッセージはプログラムからも設定できるので、もっと凝ったメッセージを出力することもできます。


プロシージャのパラメータに与える値を設定します。

p_repo_nameを選択します。パラメータ方向データ型デフォルトありはプロシージャ定義から決まります。APEXでサポートしているデータ型であれば、設定の変更が必要なケースは少ないでしょう。

タイプアイテムアイテムとしてG_REPO_NAMEを指定します。G_REPO_NAMEは実際は置換文字列なので、アイテムとして選ぶことはできません。直接、キーボードから入力します。

以上で置換文字列G_REPO_NAMEとして設定した値が、引数p_repo_nameに渡されます。


同様に、パラメータp_credential_nameにはG_CREDENTIALp_ownerにはG_OWNERp_directoryにはG_DIRECTORY、p_allow_overwriteにはP1_ALLOW_OVERWRITE、p_application_idにはP1_APPLICATION_ID、p_aliasにはP1_ALIASを設定します。

パラメータデータ型BOOLEAN(今回はp_allow_overwrite)の際に、真偽値として使用する文字がデフォルトであると、True値False値の指定を省略できます。


p_branch_nameを選択します。タイプとしてAPIデフォルトを選択します。プロシージャの引数に設定されているデフォルト値がp_branch_nameの値になります。

p_commit_detailsを除いて、他のパラメータはすべてAPIデフォルトを選択します。引数にデフォルト値が定義されていると、値のタイプのデフォルトはAPIデフォルトになります。


p_commit_detailsはDBMS_CLOUD_REPO.PUT_FILE等の引数p_commit_detailsとして与えられる値ですが、これはJSON文字列です。そのためページ・アイテムP1_COMMIT_MESSAGEP1_COMMIT_AUTHOR_NAMEよりJSON文字列を作成し、その値をp_comitt_detailsに与えます。

p_commit_detailsタイプとしてファンクション本体を選択し、言語PL/SQLを選びます。PL/SQLファンクション本体として以下を記述します。




以上でAPI呼び出しを行うプロセスの設定は完了です。

プロセスの実行後、ホーム・ページを再表示するためにブランチを作成します。タイプページまたはURL(リダイレクト)ターゲットとしてページ1を選択します。


以上でアプリケーションは完成です。

YAMLのGitHubへの保存が遅いのが気にはなります。とはいえYAMLファイルは非圧縮であるためファイル・サイズが大きい、またファイル数がそれなりにあることが原因で、APEX側で対応できないように思います。

プロシージャEXPORT_APEX_APP_TO_GITHUBの引数としてb_branch_nameがあり、コミットするブランチを指定できます。ただし、今回作成したAPEXアプリケーションでは常にmainを指定しています。

今のところAPEXではYAML形式のファイルをインポートすることはできません(p_typeの指定はREADABLE_YAMLです)。そのため、ブランチごとの変更をマージするのは、アプリケーション・デザイナーおよびページ・デザイナを使用して手動で行う必要があります。とはいえ、YAMLファイルを比較することでアプリケーションの違いを確認することはできます。アプリケーションがインストールされているインスタンスが異なるという場合など、YAMLファイルで差分を確認できると便利なことも多いでしょう。

今回の記事は以上になります。

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