このp_outer_sqlの使い方のひとつを、以前に記事「ファセットによる検索結果の合計や平均を計算する」で紹介しています。ファセットを適用した検索結果の列SALおよびCOMMの合計、平均、最小値、最大値、件数を別のレポートに表示しています。この例ではAPEX_REGION.OPEN_QUERYに引数p_outer_sqlを指定して、その結果をパイプライン表関数とする、少々複雑な実装を行っています。
本記事では引数p_outer_sqlの、もう少し簡単な使用例を紹介します。こちらの記事「ファセット検索の検索結果をAPEX_REGION.OPEN_QUERY_CONTEXTを呼び出してCSV形式でダウンロードする」にて、ファセット検索の結果をCSVでダウンロードする実装を紹介しています。このダウンロード処理に、引数p_outer_sqlを使って以下の機能を追加します。
- CSVへ出力する列を選択する。
- 列MGRとDEPTNOの出力を名前ではなく、生データの数値にする。
出力列を選択するページ・アイテムをP3_PRINT_COLUMNSとして作成します。
タイプはチェックボックス・グループです。ラベルはPrint Columnsとしていますが、外観のテンプレートにHiddenを選択しているため表示はされません。レイアウトのラベル列スパンを0にして、テンプレート・オプションのStretch From Itemをチェックします。列の数を10としているため(列の数は8)、選択する列は横一列で、画面の左右いっぱいに表示されます。
セッション・ステートのストレージはセッションごと(永続)を選びます。ダウンロード処理を実行するAjaxコールバックのプロセスに引数を渡すことができないため、選択した列を保存しているページ・アイテムP3_PRINT_COLUMNSの値は、変更が発生したときにセッション・ステートに保存します。Ajaxコールバックはセッション・ステートに保存されたページ・アイテムP3_PRINT_COLUMNSの値を参照します。
ページ・アイテムP3_PRINT_COLUMNSに動的アクションを作成します。タイミングのイベントとして変更を選択します。
LOVのタイプは静的値として、表示値と戻り値を設定します。
戻り値は必ずレポート列の列名にします。
CSVのダウンロードを実行するPL/SQLコードに、引数p_outer_sqlの指定を追加します。
p_outer_sqlに以下を渡し、出力する列としてEMPNO、Employee Name、Job、Manager、Departmentを選択してCSVダウンロードを実行します。チェックボックス・グループで複数選択された値は':'(コロン)で区切られています。SELECT文の列として認識されるために','(カンマ)に置き換えています。
l_outer_sql := 'select ' || replace(:P3_PRINT_COLUMS,':',',') || ' from #APEX$SOURCE_DATA#';
置換文字列#APEX$SOURCE_DATA#は、指定したリージョン自体の問い合わせに置き換えられます。この結果セットは、レポート・リージョンに定義された列を持ちます。