2025年2月7日金曜日

Oracle APEX 24.2から可能になったページ単位のエクスポート・インポートを確認する

Oracle APEX 24.2の新機能一覧General Builder Enhancementsに、ページ単位のエクスポート・インポートができるようになりました、と記載されています。
Export and Import Pages Across Workspaces
Move pages seamlessly between different APEX environments by exporting one or more pages from one workspace, then importing them into an application in another workspace.
APEX 24.2以前では、ページ単位のエクスポートはできましたが、インポート先はワークスペースIDとアプリケーションIDが一致するアプリケーションである必要がありました。異なるAPEXインスタンスであれば同じIDを持つワークスペースとアプリケーションを作成できますが、同じAPEXインスタンスの場合は必ずワークスペースIDとアプリケーションIDは異なります。そのため、同じインスタンスでは、異なるアプリケーションでのページ単位のエクスポート・インポートはできません。

同じワークスペースかどうかに関わらず、エクスポートしたページを別のアプリケーションにインポートしたい、という要望は以前からありました。しかし、Oracle APEXのアプリケーションは、アプリケーションに含まれるコンポーネントがデータベース内の別々の表に保存され、その表の間で参照制約が設定されていることで、アプリケーションとしての整合性を保っています。そのため、ページ単位のインポートができるといっても、制限はあります。

実際にページ単位のエクスポート・インポートを行って制限を確認することにします。

Oracle APEX 24.2のインスタンスに、ワークスペースとしてAPEXDEVAPEXDEV2を作成します。

ワークスペースAPEXDEVで、サンプル・データセットEMP/DEPTをインストールして、アプリケーションの作成までを実施します。


サンプル・データセットインストールまたは更新を実行すると、アプリケーションの作成までたどり着きます。


一通りの機能が揃ったアプリケーションDemonstration - EMP / DEPTが準備されるので、アプリケーションの作成を実行します。


アプリケーションが作成されます。

エクスポート/インポートを開きます。


エクスポートを開きます。


一旦、アプリケーション全体のエクスポートを取ります。

ワークスペースIDおよびアプリケーションIDが異なるアプリケーションにページをインポートできますが、元が同じアプリケーションであれば制約違反が発生しにくくなります。


今回の作業ではf129.sqlという名前でアプリケーションがエクスポートされました。

ページ番号2のDashboardのページをエクスポートします。

ページ・タブを開き、ページ2. Dashboardを選択します。

エクスポートを実行します。


今回の作業ではf129_page_2.sqlという名前でページがエクスポートされました。

ワークスペースAPEXDEV2の作業に移ります。

最初にサンプル・データセットEMP/DEPTより、先ほどと同じ手順で、アプリケーションDemonstration - EMP / DEPTを作成します。

作成したアプリケーションよりエクスポート/インポートを開きます。


インポートを開きます。


ページ単位のエクスポートf129_page_2.sqlを選択します。

へ進みます。


インポートの対象となるアプリケーションのワークスペースIDおよびアプリケーションIDは異なる値になりますが、ページIDについては変更できません。つまり、ページ番号2をエクスポートした場合、そのページはページ番号2としてインポートされます。

ページのインストールを実行します。


すでにページ番号2のページが存在するため、警告が表示されます。

ページの置換を実行します。


ORAエラーがそのまま表示されるという、結構雑なエラー・メッセージが表示されます。制約違反の解消は開発者の責任ということなのでしょう。

同じアプリケーションに見えても、元が異なるとページ・インポートでエラーが発生する事例です。


作成したアプリケーションを削除し、先ほどエクスポートしたf129.sqlをインポートして、アプリケーションDemonstration - EMP / DEPTを作り直します。

先ほどと同じ手順で、ページf129_page_2.sqlをインポートします。


ページのインストールまで進みます。ページのインストールを実行します。


先ほどと同様にページの置換が表示されます。ページの置換を実行します。


インストール済ページと表示されました。メッセージに「アプリケーション・ページが正常にインストールされました。」とあるように、ページがインポートされ、すでにあったページ番号2を置き換えています。


では、エクスポート/インポートしたアプリケーションをページのインポート先としていたら、必ずインポートに成功するか、というと、必ずしもそうとは言えなさそうです。

ワークスペースAPEXDEVで空のアプリケーションを作成します。名前Emptyとします。


空白のページを作成します。ページの作成をクリックします。


空白ページを選択します。


ページ番号名前Emptyとしてページを作成します。ナビゲーションブレッドクラムオフにし、ページにコンポーネントを含まないようにします。

ページの作成をクリックします。


作成された空白ページをエクスポートします。


ダイアログが開くので、エクスポートをクリックします。


今回はf131_page_2.sqlとしてページがエクスポートされました。このダイアログはエクスポートが完了しても自動的には閉じないようなので、取消をクリックしてダイアログを閉じます。

エクスポートされたf131_page_2.sqlをワークスペースAPEXDEV2にあるアプリケーションDemonstration - EMP/DEPTにインポートします。

ページのインポートの手順は同じです。インポートするファイルとしてf131_page_2.sqlを選択します。


操作を進めると、先ほどと同様にページの置換の画面になります。ページの置換を実行します。


元になったアプリケーションは全く異なりますが、ページの置換が成功します。置き換えるページに何もコンポーネントがなく、制約違反が発生しなかったためと思われます。


インポートしたページは空白のページなので、アプリケーションを実行してDashboardのページを確認すると、空白ページになっています。


以下、補足です。

複数のページを一度にエクスポートするときは、コンポーネントからエクスポートを実行します。


インポートしたアプリケーションにサインインしようすると、以下のようなエラーが発生することがあります。


この場合、共有コンポーネントアプリケーション設定ACCESS_CONTROL_SCOPEをACL_ONLYからALL_USERSに変更します。


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

アプリケーションをエクスポート・インポートして準備する必要がありますが、異なるワークスペース、アプリケーションでページのエクスポート・インポートできるのは、とても便利になったと言えます。