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

クエリ全体を実行せずに動的クエリで使用される列を見つける方法

    列名を取得するためにクエリを実行する必要はありません。解析するだけで済みます。例えば簡単な例として:

    set serveroutput on
    
    declare
      l_statement varchar2(4000) := 'select * from employees';
      l_c pls_integer;
      l_col_cnt pls_integer;
      l_desc_t dbms_sql.desc_tab;
    begin
      l_c := dbms_sql.open_cursor;
      dbms_sql.parse(c=>l_c, statement=>l_statement, language_flag=>dbms_sql.native);
      dbms_sql.describe_columns(c=>l_c, col_cnt=>l_col_cnt, desc_t=>l_desc_t);
    
      for i in 1..l_col_cnt loop
        dbms_output.put_line(l_desc_t(i).col_name);
      end loop;
    
      dbms_sql.close_cursor(l_c);
    exception
      when others then
        if (dbms_sql.is_open(l_c)) then
          dbms_sql.close_cursor(l_c);
        end if;
        raise;
    end;
    /
    

    出力:

    EMPLOYEE_ID
    FIRST_NAME
    LAST_NAME
    EMAIL
    PHONE_NUMBER
    HIRE_DATE
    JOB_ID
    SALARY
    COMMISSION_PCT
    MANAGER_ID
    DEPARTMENT_ID
    
    PL/SQL procedure successfully completed.
    

    ループ内の列名に対して必要な検証を行うことができます。

    列式の列名またはエイリアスのみが表示(および検証)されることに注意してください。これらは、実際に取得されているデータを必ずしも反映しているわけではありません。誰かが、アクセス許可のある場所から任意のデータをプルするクエリを作成し、有効と見なされる列/式のエイリアスを提供する可能性があります。

    特定のデータへのアクセスを制限しようとしている場合は、ビュー、仮想プライベートデータベースなどの他のメカニズムを調べてください。



    1. MySQL:アッパーキャメルケース(パスカルケース)でテーブルに名前を付けることはできません

    2. MacにSQLServerをインストールする方法

    3. SQL Serverでリンクされたデータベースサーバーを作成してクエリするにはどうすればよいですか?

    4. SQL Server NVARCHARと同等のPostgreSQLとは何ですか?