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

SQL :(行内の)指定された値を持つ列のリストを検索します

    これは、データベース機能の通常の部分ではありません。しかし、あなたはこれを求めた最初の人ではありません。

    このソリューションには2つのことが必要です。 1つ目はデータディクショナリです。 OracleデータベースはReflectionをサポートしていませんが、データベースオブジェクトに関するメタデータを提供する一連のビューが付属しています。この場合、user_tab_columnsが必要です 、これにより、特定のテーブルの列が得られます。 2つ目は動的SQLです。これは、実行時にSQLクエリをアセンブルして実行する機能です。これを行うにはいくつかの方法がありますが、通常は参照カーソルで十分です。

    次のコードは概念実証です。 4つのパラメータを取ります:

    1. 検索するテーブルの名前
    2. そのテーブルのプライマリキー列の名前
    3. 制限する主キーの値
    4. 検索する値。

    大まかな「準備ができていない」ので、出力を整理したり、プログラムをより柔軟にするために編集する必要があるかもしれません。

    create or replace procedure search_cols
      (tname in user_tables.table_name%type
       , pk_col in user_tab_columns.column_name%type
       , pk in number
       , val in number )
    is
        firstcol boolean := true;
        stmt varchar2(32767);
        result varchar2(32767);
        rc sys_refcursor;
    begin
        stmt := 'select ';
        << projection >>
        for lrec in ( select column_name from user_tab_columns
                      where table_name = tname
                      and column_name != pk_col
                      and data_type = 'NUMBER'
                      order by column_id )
        loop
            if not firstcol then
                stmt := stmt || chr(10) || '||'',''||';
            else
                firstcol := false;
            end if;
            stmt := stmt || ' case when '|| lrec.column_name||' = '|| val ||
                               ' then '''|| lrec.column_name || ''' else null end';
        end loop projection;
        stmt := stmt || chr(10)|| ' from '||tname||' where '|| pk_col || ' = '|| pk;
        --  dbms_output.put_line(stmt);
        open rc for stmt;
        fetch rc into result;
        close rc;
        dbms_output.put_line(tname || '::' || val || ' found in '||result);
    end search_cols;
    /
    

    ご覧のとおり、動的SQLは読みにくいです。デバッグするのは難しいです:)したがって、最終的なステートメントを表示する手段を用意することをお勧めします。

    とにかく、ここに結果があります:

    SQL> set serveroutput on size unlimited
    SQL> exec search_cols('T23', 'ID', 111, 10)
    T23::10 found in ,COL_B,COL_C,
    
    PL/SQL procedure successfully completed.
    
    SQL> exec search_cols('T23', 'ID', 222, 10)
    T23::10 found in COL_A,,,
    
    PL/SQL procedure successfully completed.
    
    SQL>
    


    1. MySQL5.6でのROOTパスワードのリセット

    2. Androidのバックアップ後にSqliteデータベースを復元する方法

    3. フィールドリストエラーRmysqlの不明な列

    4. PHP-ログインシステムでメンバー専用ページを保護する