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

さまざまな表のデータを最初のデータ行の列名とともに動的に表示するPL/SQLプロシージャ/関数

    データディクショナリを使用して、正しい列を選択するSQLステートメントを作成します。動的SQLを使用して、そのステートメントへのリフレクターを開き、関数からカーソルを返します。

    サンプルスキーマ

    create table tab_1 as
    select '00001' id, 'Q0' quarter, 2 risk from dual union all
    select '00001' id, 'Q1' quarter, 3 risk from dual union all
    select '00001' id, 'Q2' quarter, 1 risk from dual union all
    select '00001' id, 'Q3' quarter, 1 risk from dual union all
    select '00001' id, 'Q4' quarter, 2 risk from dual;
    
    create table tab_2 as
    select '00001' id, 'ACTIVE' status from dual union all
    select '00002' id, 'PURGED' status from dual union all
    select '00003' id, 'ACTIVE' status from dual union all
    select '00004' id, 'ACTIVE' status from dual;
    

    機能

    create or replace function get_results(p_id number) return sys_refcursor is
        v_sql varchar2(32767);
        v_refcursor sys_refcursor;
    begin
        --Get SQL statement.
        select
            'select ' || 
            listagg(column_name, ',') within group (order by column_id) ||
            ' from ' || table_name
        into v_sql
        from user_tab_columns
        where table_name = 'TAB_' || p_id
            and column_id <= 2
        group by table_name;
    
        open v_refcursor for v_sql;
    
        return v_refcursor;
    end;
    /
    

    関数の呼び出し

    この関数は、アプリケーションがリフレクターを理解している限り機能するはずです。以下は、SQL*Plusの最近のバージョンの例です。

    SQL> select get_results(1) from dual;
    
    GET_RESULTS(1)
    --------------------
    CURSOR STATEMENT : 1
    
    CURSOR STATEMENT : 1
    
    ID    QU
    ----- --
    00001 Q0
    00001 Q1
    00001 Q2
    00001 Q3
    00001 Q4
    



    1. MySQL SIN()関数–MySQLの数値の正弦を返します

    2. MySQLで2つのテーブルを結合する

    3. JSONオブジェクトの配列であるrailsフィールド?

    4. 圧縮されたPostgreSQL行を個別の列に展開するにはどうすればよいですか?