2021年9月9日木曜日

CSVをつなげて1つのファイルとしてダウンロードする

 1ページに対話モード・レポートを2つ作り、両方を1つのCSVファイルとしてダウンロードしてみます。元にした実装は、Ajaxコールバックを使ったCSVのダウンロードです。

以下、実装手順になります。

サンプル・データセットEMP/DEPTがインストール済みとします。それに含まれる表EMPを対話モード・レポートのソースとします。

最初に空のアプリケーションを作成します。アプリケーションが作成されたら、ホーム・ページに対話モード・レポートを2つ作成します。

最初の対話モード・レポートの静的IDとして、emp1を設定します。

次の対話モード・レポートの静的IDは、emp2とします。


Ajaxコールバックとして、プロセスCSVEXPORTを作成します。PL/SQLコードとして以下を記述します。

declare
l_ctx_emp1 apex_exec.t_context;
l_ctx_emp2 apex_exec.t_context;
l_rid_emp1 number;
l_rid_emp2 number;
l_exp_emp1 apex_data_export.t_export;
l_exp_emp2 apex_data_export.t_export;
begin
-- Generate CSV of IR region emp1
select region_id into l_rid_emp1 from apex_application_page_regions
where application_id = :APP_ID and page_id = 1.
and static_id = 'emp1';
apex_debug.info('region_id of emp1 is ' || l_rid_emp1);
l_ctx_emp1 := apex_region.open_query_context (
p_page_id => 1,
p_region_id => l_rid_emp1 );
l_exp_emp1 := apex_data_export.export (
p_context => l_ctx_emp1,
p_format => apex_data_export.c_format_csv,
p_file_name => 'emp1' );
apex_exec.close(l_ctx_emp1);
-- Generate CSV of IR region emp1
select region_id into l_rid_emp2 from apex_application_page_regions
where application_id = :APP_ID and page_id = 1
and static_id = 'emp2';
apex_debug.info('region_id of emp2 is ' || l_rid_emp2);
l_ctx_emp2 := apex_region.open_query_context (
p_page_id => 1,
p_region_id => l_rid_emp2 );
l_exp_emp2 := apex_data_export.export (
p_context => l_ctx_emp2,
p_format => apex_data_export.c_format_csv,
p_file_name => 'emp2' );
apex_exec.close(l_ctx_emp2);
-- merge BLOB output into 1
dbms_lob.append(l_exp_emp1.content_blob, l_exp_emp2.content_blob);
-- download as a single file.
apex_data_export.download( p_export => l_exp_emp1 );
end;

対話モード・レポートに設定されている検索条件でSQL問合せ行うコンテキストをapex_region.open_query_contextを呼び出して取得します。その問合せからCSVのデータをapex_data_export.exportを呼び出して生成します。

l_exp_emp1には対話モード・レポートemp1のデータ、l_exp_emp2には対話モード・レポートemp2のデータが保持されています。dbms_lob.appendを呼び出して、l_exp_emp2の出力をl_exp_emp1に追記したのち、apex_data_export.downloadを呼び出して、ファイルとしてl_exp_emp1の内容を出力しています。

画面上にAjaxコールバックCSVEXPORTを呼び出すボタンを追加します。

ブレッドクラムのリージョンでボタンの作成を実行します。識別ボタン名B_EXPORTラベルCSVエクスポートとします。動作アクションとして、このアプリケーションのページにリダイレクトを選択します。


ターゲットページには&APP_PAGE_ID. (今回の例では1に置き換わります)、詳細リクエストとして、APPLICATION_PROCESS=CSVEXPORTを設定します。


以上でアプリケーションは完成です。アプリケーションを実行すると、最初のGIF動画の動作を確認できます。

以下に作成したアプリケーションのエクスポートを置きました。
https://github.com/ujnak/apexapps/blob/master/exports/combinedcsvexport.sql

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