パッケージ
APEX_IRのAPIリファレンスを参照したところ、このようなファンクションやプロシージャはあったかな?というのを見つけました。
EXPORT_SAVED_REPORTSと
IMPORT_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をソースとした対話モード・レポートをひとつ作成しています。その他に以下のコンポーネントを作成しています。
- 対話モード・レポートに作成されているレポートを選択するポップアップLOVのページ・アイテムP1_REPORT_IDS
- 上記のポップアップLOVで選択したレポートを、テキスト領域のページ・アイテムにエクスポートするボタンEXPORT
- テキスト領域のページ・アイテムの内容を、対話モード・レポートのレポートとしてインポートするボタンIMPORT
- インポートするレポートの新しい所有者を指定するページ・アイテムP1_NEW_OWNER
- レポートの出力先であるテキスト領域のページ・アイテム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_NAMEとREPORT_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_report、p_new_application_idはAPIデフォルト、p_new_ownerにはページ・アイテムP1_NEW_OWNERを割り当て変更できるようにしていますが、通常は無指定にしてサインインしたユーザーを対象にします。
作成したAPEXアプリケーションの説明は以上です。
アプリケーションを実行し、レポートのエクスポートとインポートの動作を確認します。
最初に対話モード・レポートに表示する列としてEmployee Name、Job、Salary、Commissionを選択し、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のアプリケーション作成の参考になれば幸いです。
完