2025年4月15日火曜日

パッケージAPEX_IRのEXPORT_SAVED_REPORTSとIMPORT_SAVED_REPORTSを使ってみる

パッケージAPEX_IRのAPIリファレンスを参照したところ、このようなファンクションやプロシージャはあったかな?というのを見つけました。EXPORT_SAVED_REPORTSIMPORT_SAVED_REPORTSです。Oracle APEXのいつのバージョンから追加されたのか、ChatGPTに聞いてみました。

「Oracle APEX: from which version provides IMPORT_SAVED_REPORTS and EXPORT_SAVED_REPORTS in PL/SQL package APEX_IR?」

ChatGPTによる回答としては、23.2からとのこと。23.1と23.2のAPIリファレンスを確認したところ、確かに23.2から追加された機能でした。

The IMPORT_SAVED_REPORTS and EXPORT_SAVED_REPORTS procedures in the APEX_IR PL/SQL package were introduced in Oracle APEX version 23.2. These procedures allow developers to programmatically import and export saved interactive reports, including both default and user-defined reports, facilitating easier migration and backup of report configurations.

For detailed information on these procedures, you can refer to the Oracle APEX 23.2 documentation:

APIリファレンスの説明には、EXPORT_SAVED_REPORTSには「This function exports multiple saved reports from the current app and workspace. Exports default or user-saved reports.」、IMPORT_SAVED_REPORTSには「This procedure imports saved reports into an app in the current workspace. Supports importing default or user-saved reports.」と書いてあるだけで、インポートできるレポートの条件が記載されていません。

調べたところ、レポートをインポートできる条件は以下でした。
  • 同じワークスペースまたはワークスペースIDが同じワークスペース(この場合インスタンスは異なる)にあり、元のIDオンにしてエクスポートしたファイルをインポートしたアプリケーション間で、対話モード・レポートに作成したレポートのエクスポートとインポートができる。
  • アプリケーションIDは異なっていても、対話モード・レポートに作成したレポートのエクスポートとインポートができる。
  • ワークスペースが異なる(つまりインスタンスが異なる)場合、同じ公開鍵と秘密鍵を元にWeb資格証明のキー・ペアを作成する必要がある。
手短に言うと、対話モード・レポートで作成したレポートのエクスポートとインポートは、同一もしくは同一と見做せるAPEXアプリーション間で実施できます。

APEXアプリケーションを作成し、動作を確認してみました。作成したAPEXアプリケーションのエクスポートは、以下に置いています。
https://github.com/ujnak/apexapps/blob/master/exports/ir-report-export-and-import.zip

最初にopensslを使ってRSAのキー・ペアを生成します。秘密鍵がprivate.pem、公開鍵がpublic.pemとして作成されます。

openssl genrsa -out private.pem 4096
openssl rsa -in private.pem -outform PEM -pubout -out public.pem

% openssl genrsa -out private.pem 4096                            

% openssl rsa -in private.pem -outform PEM -pubout -out public.pem


writing RSA key

% ls

private.pem public.pem

% 


認証タイプキー・ペアWeb資格証明を作成します。

共有コンポーネントWeb資格証明を開きます。


作成をクリックします。


名前はAPIリファレンスの例にあったmy_API_key_pairにします。静的IDも同じ値にします。認証タイプキー・ペアを選択します。

公開キーに先ほど生成したpublic.pemの内容を貼り付けます。秘密キーおよび秘密キーの検証private.pemの内容を貼り付けます。

以上で作成をクリックします。


Web資格証明としてmy_API_key_pairが作成されます。


検証を行うAPEXアプリケーションを紹介します。

ページに表EMPをソースとした対話モード・レポートをひとつ作成しています。その他に以下のコンポーネントを作成しています。
  1. 対話モード・レポートに作成されているレポートを選択するポップアップLOVのページ・アイテムP1_REPORT_IDS
  2. 上記のポップアップLOVで選択したレポートを、テキスト領域のページ・アイテムにエクスポートするボタンEXPORT
  3. テキスト領域のページ・アイテムの内容を、対話モード・レポートのレポートとしてインポートするボタンIMPORT
  4. インポートするレポートの新しい所有者を指定するページ・アイテムP1_NEW_OWNER
  5. レポートの出力先であるテキスト領域のページ・アイテムP1_EXPORT_CONTENT


アプリケーション内でWeb資格証明置換文字列G_CREDENTIALで指定できるように、アプリケーション定義置換に、置換値としてmy_API_key_pairを設定します。


エクスポートするレポートの選択にはタイプポップアップLOVのページ・アイテムP1_REPORT_IDSを使用します。ラベルReport IDsとします。

APEX_IR.EXPORT_SAVED_REPORTSは複数のレポートを一度にエクスポートできるため、複数の値タイプ区切りリストを選択し、セパレータに':'を指定します。

ポップアップLOVにレポート名とレポート・タイプを表示するため、共有コンポーネントLOVとしてIR_REPORTSを作成し、それをLOVに設定します。


共有コンポーネントLOVとしてIR_REPORTSを作成します。ソースSQL問合せに以下を記述します。サインインしたユーザーが所有しているレポートと、公開レポートを選択できる対象としています。
select
    report_id
    ,report_name
    ,report_type
from apex_application_page_ir_rpt
where application_id = :APP_ID and page_id = :APP_PAGE_ID
and (
    status = 'PUBLIC'
    or /* status = 'PRIVATE' and */
    report_type = 'PRIVATE' and application_user = :APP_USER
)
列のマッピング戻り値REPORT_IDを選択し、それに加えて追加表示列としてREPORT_NAMEREPORT_TYPEを含めています。


ボタンEXPORTをクリックしたときに、プロセスEXPORTを実行します。プロセスEXPORTではタイプAPI呼出しを選択し、APEX_IR.EXPORT_SAVED_REPORTSを呼び出します。


ファンクションの結果はページ・アイテムP1_EXPORT_CONTENTに出力します。


引数p_report_idsには、PL/SQL式として以下を設定します。

apex_string.split_numbers(:P1_REPORT_IDS,':')


引数p_credential_static_idには静的値として&G_CREDENTIAL.を設定します。


ボタンIMPORTをクリックしたときに、プロセスIMPORTを実行します。プロセスIMPORTではタイプAPI呼出しを選択し、APEX_IR.IMPORT_SAVED_REPORTSを呼び出します。


引数p_export_contentにはページ・アイテムP1_EXPORT_CONTENTを指定します。それ以外の引数p_replace_reportp_new_application_idAPIデフォルトp_new_ownerにはページ・アイテムP1_NEW_OWNERを割り当て変更できるようにしていますが、通常は無指定にしてサインインしたユーザーを対象にします。


作成したAPEXアプリケーションの説明は以上です。

アプリケーションを実行し、レポートのエクスポートとインポートの動作を確認します。

最初に対話モード・レポートに表示するとしてEmployee NameJobSalaryCommissionを選択し、Employee Name = SCOTTフィルタ条件を設定します。


アクション・メニューのレポートからレポートの保存を開きます。


名前付きレポートとして保存を選択し、名前My Reportを指定します。

適用をクリックします。


対話モード・レポートに設定されている条件が、レポートMy Reportとして保存されます。


ポップアップLOVをクリックすると、作成したレポートMy Reportが選択できます。タイプはPRIVATEです。


My Reportを選択しボタンExportをクリックします。Export ContentにエクスポートされたレポートがJSONドキュメントとして表示されます。


保存されたレポート = "My Report"の右に表示されている X をクリックします。


これらのレポート設定を削除しますか。」と聞かれるので、適用をクリックします。


レポートMy Reportは削除されますが対話モード・レポートに設定された条件は残るので、一旦レポートをリセットします。


今度はExport Contentに出力されているJSONドキュメントを、レポートとしてインポートします。

ボタンImportをクリックします。


レポートがインポートされ、対話モード・レポートに適用されます。


同一のアプリケーションへのレポートのエクスポート/インポートが確認できました。

アプリケーション間でレポートをコピーするには、エクスポート時に元のIDオンにしたエクスポートを元にアプリケーションを作成する必要があります。


インスタンスが異なる場合は、コピーするワークスペースの間でIDが一致している必要があります。また、双方のワークスペースにWeb資格証明が必要です。

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

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