sql >> データベース >  >> RDS >> Oracle

Dynamic Select ステートメントのレコードを表示しないですぐに実行する

    結果セット内の不明な数の列への動的ピボットのため、構造が事前にわからないため、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

    1. phpを使用したMysqlイベントエラー

    2. 別のconnection.phpファイルを使用してmysqliクエリを使用するにはどうすればよいですか?

    3. 列が更新されたときに新しいテーブルに値を挿入するトリガーを作成する

    4. SQL ServerManagementStudioで記憶されているログインとパスワードのリストを削除する