2020年12月15日火曜日

コマンドラインからアプリケーションをインポートする

 Oracle APEXでは、開発環境を含まない実行環境のみのインストールができます。通常はapexins.sql(またはapexins[123].sql)で開発環境込みでデータベースにインストールしますが、実行環境のみはapxrtins.sql(apxrtins[123].sql)を使ってインストールします。

Oracle APEXの開発環境というのも実際は、4000番代のアプリケーションIDが付与されたOracle APEXのアプリケーションです。これらのアプリケーションが最初からインストールされていなければアクセスもできないので、特に外部公開サイトではセキュリティ面で有利になります。

開発環境が含まれていない環境でどのようにOracle APEXのアプリケーションをインストールするかというと、SQLPlusなどのコマンドライン・ツールとAPEX_APPLICATION_INSTALLパッケージを使用します。相当以前のバージョンから、このパッケージは存在しますが、20.1の日本語マニュアルはこちらです。

このAPEX_APPLICATION_INSTALLAPEX_EXPORTパッケージを活用することで、CI/CDのサイクルに組み込むこともできます。

エクスポートしたアプリケーションがf102.sqlとして存在している場合、以下のようにインポートを実行します。

オンプレミスの場合は、デフォルト・パーシング・スキーマとなるデータベース・アカウントで接続します。Autonomous Databaseの場合は、ワークスペースにログインするユーザー自体がデータベース・アカウントなので、そのアカウントで接続します。

実際のインポート処理は以下のように実行します。APEX_APPLICATION_INSTALLのいくつかのプロシージャを実行し、ワークスペースやスキーマ、アプリケーションIDなどを指定した上で、エクスポートされたアプリケーションであるSQLファイルを実行します。

SQL> begin

  2  apex_application_install.set_workspace('APEXDEV');

  3  apex_application_install.generate_application_id;

  4  apex_application_install.generate_offset;

  5  apex_application_install.set_schema('APEXDEV');

  6  apex_application_install.set_application_alias('F' || apex_application_install.get_application_id );

  7  end;

  8  /


PL/SQL procedure successfully completed.


SQL> @f102.sql

--application/set_environment

APPLICATION 102 - タスク

--application/delete_application

--application/create_application

--application/shared_components/navigation/lists/デスクトップ・ナビゲーション・メニュー

--application/shared_components/navigation/lists/デスクトップ・ナビゲーション・バー

--application/shared_components/navigation/lists/ページ・ナビゲーション

--application/shared_components/navigation/lists/アプリケーション構成

--application/shared_components/navigation/lists/ユーザー・インタフェース

--application/shared_components/navigation/lists/アクティビティ・レポート


[中略]


--application/pages/page_10051

--application/pages/page_10053

--application/pages/page_10054

--application/pages/page_10060

--application/pages/page_10061

--application/deployment/definition

--application/deployment/checks

--application/deployment/buildoptions

--application/end_environment

...done

SQL> 


エクスポートしたのと同じワークスペースにインポートする場合は、もっと指定は単純です。

SQL> begin

  2  apex_application_install.set_application_id(102);

  3  apex_application_install.generate_offset;

  4  apex_application_install.set_application_alias('TASKS1');

  5  end;

  6  /


PL/SQL procedure successfully completed.


SQL> @f102.sql

--application/set_environment

APPLICATION 102 - タスク

--application/delete_application

--application/create_application

--application/shared_components/navigation/lists/デスクトップ・ナビゲーション・メニュー

--application/shared_components/navigation/lists/デスクトップ・ナビゲーション・バー

--application/shared_components/navigation/lists/ページ・ナビゲーション

--application/shared_components/navigation/lists/アプリケーション構成

--application/shared_components/navigation/lists/ユーザー・インタフェース

--application/shared_components/navigation/lists/アクティビティ・レポート


[中略]


--application/pages/page_10051

--application/pages/page_10053

--application/pages/page_10054

--application/pages/page_10060

--application/pages/page_10061

--application/deployment/definition

--application/deployment/checks

--application/deployment/buildoptions

--application/end_environment

...done

SQL> 


インポートに失敗した場合には、エラー・メッセージが表示されます。

SQL> begin

  2  apex_application_install.set_application_id(102);

  3  apex_application_install.generate_offset;

  4  apex_application_install.set_application_alias('TASKS');

  5  end;

  6  /


PL/SQL procedure successfully completed.


SQL> @f102.sql

--application/set_environment

APPLICATION 102 - タスク

--application/delete_application

--application/create_application

begin

*

ERROR at line 1:

ORA-00001: unique constraint (APEX_200200.WWV_FLOWS_ALIAS_IDX) violated

ORA-06512: at "APEX_200200.WWV_FLOW_API", line 2870

ORA-06512: at line 2


すでに別のアプリケーションで、アプリケーションの別名が使用済みであることがわかります。

インストール済みのアプリケーションはAPEX_APPLICATIONSビューを検索することで、コマンドラインから確認できます。

SQL> col application_id format 99999 heading id

SQL> col application_name format a40 heading name

SQL> col alias format a20 heading alias

SQL> select application_id, application_name, alias from apex_applications;


    id name alias

------ ---------------------------------------- --------------------

   101 XLIFFの翻訳                              XLIFFの翻訳

   100 世界食堂                                 WORLDDINER

   105 世界食堂 - 完成品                         CWORLDDINER

   103 タスク                                   TASKS

  1100 タスク                                   F

   102 タスク                                   TASKS1


6 rows selected.


SQL>