2023年6月1日木曜日

Oracle APEXのアップグレード(5) - アプリケーションのアップグレード

Oracle APEXのアップグレードに伴い、作成済みのアプリケーションで必要になる対応についてまとめてみます。

カナダにあるパートナーのInsum(現在はフランスのTalanという会社の一部)の方が、APEXアプリケーションのアップグレードについて記事を書いてます。参考になります。

10 steps to upgrading your Oracle APEX applications
https://www.insum.ca/10-steps-to-upgrading-oracle-apex/

上記の記事では、最初にリリース・ノートを読むことを推奨しています。

例えば、Oracle APEX 23.1のリリース・ノートは以下です。

https://docs.oracle.com/en/database/oracle/apex/23.1/htmrn/

リリース・ノートが日本語に翻訳されるまでにはタイムラグがあるため、英語で確認する必要があります。

New Featuresについてはapex.oracle.comのトップページから辿れる場所に、わかりやすい形でまとめられることが多いため、そちらを参照することができます。

Changed Behavior、Deprecated Features、Desupported Features、Open Bugs and Known Issuesなどは要確認です。


アップグレード前に必ずバックアップを取得する


アップグレードに限りませんが、アプリケーションの改変を行う前にバックアップを取得しましょう。特にアップグレードの場合は、バックアップからリストアする以外に元に戻す方法はありません。

最初にアプリケーションをエクスポートすることにより、バックアップを取得してみます。

アプリケーション・ビルダーでアップグレードする対象のアプリケーションを開き、エクスポート/インポートを実行します。

実行するタスクとして、エクスポートを選択します。

エクスポートを実行すると、アプリケーションがファイルとしてダウンロードされます。複数のファイルに分割オンにすると、ZIP形式のファイルとしてアプリケーションがエクスポートされます。オフの場合は、ひとつのSQLスクリプトがエスクポートされます。

バックアップの取得を忘れていた場合には、現在から〇〇分前(5分程度の遅延あり)に数値を設定した上でエクスポートを行うと、過去の時点のアプリケーションのエクスポートを取得できます。遡れる時間はUNDO保存期間とUNDO表領域の容量に依存します。

また、エクスポートはしたのだけれどファイルを無くしてしまったような場合(上書きなど)、そのファイルをインポートしてアプリケーションを作成した実績があれば、エクスポート・リポジトリに保存されているかもしれません。諦める前に確認してみましょう。

アプリケーションのバックアップとしてエクスポート以外に、アプリケーションのコピーもバックアップとして使えるでしょう。コピーしたアプリケーションを、アップグレードのテストに使用するケースの方が多いかもしれません。

アプリケーションのコピーは、アプリケーション・ビルダーより呼び出します。


Oracle APEX 20.1からは、アプリケーションのバックアップ機能が標準で提供されています。この機能の説明はこちらの記事で紹介しています。

アプリケーション・ビルダーバックアップの管理、またはユーティリティバックアップの管理から、バックアップの取得/リストアを実施します。

ワークスペースのユーティリティバックアップの管理が含まれます。

対象となるアプリケーションのバックアップを作成します。

バックアップの作成をクリックします。


コメントを入力し、バックアップをクリックします。


作成されたバックアップが一覧に表示されます。このバックアップを使った、リストアダウンロードを実施できます。

コマンドライン・ツールのSQLclが使用できる場合は、ワークスペースに存在するAPEXアプリケーションを一括でエクスポートすることも可能です。こちらの記事で、その方法を紹介しています。


テーマのリフレッシュ


アップグレード対象のアプリケーションの共有コンポーネントを開くと、テーマのリフレッシュとラベルが振られたボタンが表示されます。以下のように説明されています。

新しいバージョンのユニバーサル・テーマを使用できます。テーマをリフレッシュすると、新しい機能、機能拡張およびバグ修正が有効になります。


テーマをリフレッシュすると新しい機能、機能拡張、バグ修正が有効になります。これはテンプレート・ファイルが置き換えられるためですが、結果としてアプリケーションのルック&フィールが変わる可能性があります。Oracle APEX自体のアップグレードよりも、既存のアプリケーションに与える影響が大きいです。本番利用しているアプリケーションでは、テーマをリフレッシュする前に十分な検証を行いましょう

共有コンポーネントテーマからユニバーサル・テーマ(Universal - Theme 42)を開いて、テーマのリフレッシュを実行することによって変更される内容を確認します。

テーマの編集画面にテーマのリフレッシュを行うボタンがあります。こちらはアップグレードに関係なく、いつでも実施可能です。


現在のテーマが参照している静的ファイルは、#IMAGE_PREFIX#themes/theme_42/21.1/以下に配置されてます。


テーマに含まれているテンプレートの更新日付を見てみます。大抵の場合、Oracle APEXがアップグレードされる以前に日付になっていて、APEXのアップグレードによって更新されていないことが確認できるはずです。


テーマのリフレッシュを行います。

アプリケーションの互換性モードに、現在のAPEXのバージョンが含まれていないとテーマのリフレッシュに失敗します。

今回はAPEX 21.1から23.1へのアップグレードを試みているため、互換性モードを更新する必要があります。


互換性モードの違いは、リリース・ノートのCompatibility Modeで説明されています。


互換性モード21.2 / 22.1 / 22.2 / 23.1での変更として、以下の説明がされています。

Prior to Oracle Application Express 21.2, all processes of the current processing point have been executed regardless of the added errors.

In Oracle Application Express 21.2, calling APEX_ERROR.ADD_ERROR in a process stops further processes from executing and immediately displays the inline errors.

APEX 21.2以降は、APEX_ERROR.ADD_ERRORを呼び出した時点で後続の処理をせず、エラーを表示するような動作に変わった、と説明されています。

変更点に問題がないことを確認し、アプリケーション定義プロパティ互換性モードを変更します。


再度、テーマのリフレッシュを実行すると、今度はテンプレートおよびテンプレート・オプションがマスター・テーマからリフレッシュされました。と表示されます。


リフレッシュ後の静的ファイルは、#IMAGE_PREFIX#themes/theme_42/23.1/以下を参照するようになっています。


テーマに含まれているテンプレートは、すべて更新されています。


Oracle APEXの画面で使用しているJavaScriptやCSSのライブラリなどは、セキュリティ上の修正を有効にするため、テーマのリフレッシュの実施にかかわらず更新されるものがあります。そのため、テーマのリフレッシュをしなければ100%以前のユーザー・インターフェースを維持できる、ということではありません。

Oracle APEXは、おおまかに言うと、保存されているHTMLのテンプレート・ファイルにSQLの実行結果を埋め込むことにより、完全なHTMLページを生成します。Oracle DatabaseがアップグレードされていなければSQLの実行結果は変わりませんし、テンプレートが変わっていなければ、その穴埋めした結果も変わりません。そのため、まずはOracle APEX自体はアップグレードして、テーマのリフレッシュを行う前に十分にテストを実施する、といった段階を分けたアップグレードのアプローチが有効です。

テーマのリフレッシュを実施しAPEXのバージョンとユニバーサル・テーマのバージョンを一致させていないと、ページ・デザイナを使ったアプリケーションの修正が制限されることがあります。そのため、APEXのアップグレード後にアプリケーションを修正する場合は、最初にテーマのリフレッシュを実施することをお勧めします。


コンポーネントのアップグレード



更新可能なコンポーネントの一覧は、アプリケーション・ビルダーユーティリティに含まれる、アプリケーションのアップグレードから確認およびアップグレードが可能です。

ユーティリティを開きます。


アプリケーションのアップグレードを開きます。


主に今回のアップグレードで提供されている新機能を適用できる候補がリストされます。


ここにリストされているコンポーネントのアップグレードは必ず実施しなければいけない、といったものではありませんが、検討する価値はあります。

以下のアップグレード・タイプについて、どのような更新が行われるのか確認してみます。

URLでJavaScriptのかわりに宣言型確認ダイアログを使用するためのボタンのアップグレード

候補オブジェクトの数値をクリックし、アップグレードの対象を一覧します。


DELETEボタンの設定がアップグレード対象であることがわかります。

DELETEボタンの設定を確認すると、動作ターゲットとしてjavascriptが埋め込まれていることがわかります。


このjavascriptにより、削除ボタンを押したときにポップアップを表示しています。


アップグレードを実行します。


アップグレードが実施され、候補として表示されなくなりました。


DELETEボタンのターゲットからjavascriptの記述は除かれ、確認の要求にチェックが入れられています。メッセージもjavascriptに埋め込まれていましたが、置換文字列で置き換えられています。


更新されたページを実行すると、以下のように表示されます。


メッセージが英語になりましたが、アプリケーション言語英語(en)の設定であるため、この表示が正しいです。アプリケーション言語日本語(ja)に変更し、確認スタイルデフォルトから危険に変えてみます。


アップグレードされたAPEXに含まれる新機能を、比較的簡単に適用することができました。

Insumの記事では、以下の検討を推奨しています。

  1. 新たに提供されているAPEXのPL/SQL APIやJavaScript APIを確認し、有用なものがあれば過去のコードを書き換える。
  2. 3rdパーティのツールにOliver Lemmさんが作成したAPEX Visualizerというものがあります。これを使うと、非推奨やデサポートになった機能を一覧できるとのことです。
  3. アプリケーションが使用しているプラグインを確認する。
  4. アプリケーションのテストをすること。
アプリケーション定義ユーザー・インターフェースJavaScriptのセクションで、非推奨またはサポート対象外になったJavaScript関数を含むがチェックされている、jQuery移行を含めるオンでないことを確認します。

そのような古い関数を使うJavaScriptのコードを書いている場合は、書き直しの検討をお勧めします。


Oracle APEXのアップグレードに関する説明は以上になります。

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