結果セット内の不明な数の列への動的ピボットのため、構造が事前にわからないため、ref カーソルを使用して動的クエリの結果を取得できます。
これは、SQL*Plus/SQL Developer/SQLcl バインド変数を使用します。
変数 rc refcursor;declare sql_stmt clob; pivot_clause clob; begin select listagg('''' || TO_CHAR(PERIOD_NAME,'MON-YY') || ''' as "' || TO_CHAR(PERIOD_NAME,'MON-YY') || '"', ',')グループ内 (PERIOD_NAME 順) into pivot_clause from (select TO_DATE(PERIOD_NAME,'MON-YYYY') PERIOD_NAME from table1 where request_id=
プレ>GROUP BY TO_DATE(PERIOD_NAME,'MON-YYYY') TO_DATE(PERIOD_NAME,' 順)月-YYYY') ASC); sql_stmt :='select * from (select PERIOD_NAME, depreciation from table1) pivot (sum(depreciation) for PERIOD_NAME in (' || pivot_clause || '))'; open :rc for sql_stmt; end;/print rc 変数 rc refcursor;
プレ>クライアントバインド変数の変数とデータ型を参照カーソルとして宣言します。次に、
execute immediately
を使用するのではなく open for あなたのダイナミックなステートメントで:open :rc for sql_stmt;
プレ>そのクエリの結果で参照カーソルを開きます。 (
:
に注意してください:rc
の先頭 、ローカルPL/SQL変数ではなくバインド変数参照であることを示します)。次に、ブロックの外で 印刷 できます 結果セット:
print rc
プレ>クライアント/IDE が異なれば、必要な構文も異なります。 JDBC でも同様のことができます。
sys_refcursor
を返す関数を使用することもできます 。ただし、これの最終目標が何であるかによって異なります。ちなみに、現時点では、ピボットされたすべての合計に対して null が返されます。最終クエリは
PERIOD_NAME
を取得する必要があります ピボット句が探しているのと同じ形式で、たとえばsql_stmt :='select * from (select to_char(to_date(PERIOD_NAME, ''MON-YYYY''), ''MON-YY'') as PERIOD_NAME, depreciation from table1) ピボット (sum(depreciation (' || pivot_clause || '))' の PERIOD_NAME の);
プレ>代わりに元の形式をピボット句に残す方が少し簡単ですが:
declare sql_stmt clob; pivot_clause clob; begin select listagg('''' || PERIOD_NAME || ''' as "' || TO_CHAR(PERIOD_DATE,'MON-YY') || '"', ',') within group (PERIOD_DATE 順) into pivot_clause from (個別の PERIOD_NAME, TO_DATE(PERIOD_NAME,'MON-YYYY') PERIOD_DATE を table1 where request_id=
プレ>から選択); sql_stmt :='select * from (select PERIOD_NAME, depreciation from table1) pivot (sum(depreciation) for PERIOD_NAME in (' || pivot_clause || '))'; open :rc for sql_stmt;終了;/ ダミーのテーブルとデータを使用:
create table table1 (request_id, period_name, depreciation) asselect 1, 'JAN-2018', 42 from dualunion all select 1, 'FEB-2018', 11 from dualunion all select 1, 'MAR-2018' 、dualunion からの 22 all select 1、'MAR-2018'、dualunion からの 33 all select 2、'MAR-2018'、dual からの 44;
プレ>いずれかのバージョンを実行し、
<前>print rc
を実行する ショー:JAN-18 FEB-18 MAR-18---------- ---------- ---------- 42 11 99コード> プレ>