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

plsqlのrowtype変数から動的列値を選択します

    別の変数を介して列/フィールド名を動的に参照することはできません。

    data_table全体を処理する必要があります 動的にクエリします。これは、 dbms_sql> パッケージ

    declare
      l_col_name varchar2(100);
      l_col_val varchar2(100);
      type t_col_tab is table of column_table%rowtype;
      l_col_tab t_col_tab;
    
      -- for dbms_sql
      l_c pls_integer;
      l_col_cnt pls_integer;
      l_desc_t dbms_sql.desc_tab;
      l_rc pls_integer;
      l_varchar varchar2(4000);
    begin
      select * bulk collect into l_col_tab from column_table;
    
      -- create cursor and prepare from original query
      l_c := dbms_sql.open_cursor;
      dbms_sql.parse(c=>l_c, statement=>'select * from data_table',
        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_sql.define_column(c=>l_c, position=>i,
          column=>l_varchar, column_size=>4000);
      end loop;
    
      l_rc := dbms_sql.execute(c=>l_c);
    
      while dbms_sql.fetch_rows(c=>l_c) > 0 loop
        for i in 1..l_col_cnt loop
          for j in 1..l_col_tab.count loop
            if l_desc_t(i).col_name = l_col_tab(j).column_name then
              -- same column
              dbms_sql.column_value(l_c, i, l_varchar);
              dbms_output.put_line('Row ' || dbms_sql.last_row_count
               || ': ' || l_desc_t(i).col_name
               || ' = ' || l_varchar);
            end if;
          end loop;
        end loop;
      end loop;
    
      dbms_sql.close_cursor(l_c);
    end;
    /
    

    カーソルクエリが解析および実行され、テーブルの説明によって列名を比較できます。これは情報を印刷するだけですが、もちろん、必要なことは何でもできます。

    次のように作成されたダミーテーブルを使用:

    create table data_table(id number, column_1 date, column_2 varchar2(10), column_3 varchar2(10));
    insert into data_table (id, column_1, column_2, column_3) values (1, date '2017-01-01', 'dummy', 'first');
    insert into data_table (id, column_1, column_2, column_3) values (2, date '2017-02-01', 'dummy', 'second');
    
    create table column_table (column_name varchar2(30));
    insert into column_table (column_name) values ('ID');
    insert into column_table (column_name) values ('COLUMN_3');
    

    ...これは出力を取得します:

    Row 1: ID = 1
    Row 1: COLUMN_3 = first
    Row 2: ID = 2
    Row 2: COLUMN_3 = second
    
    PL/SQL procedure successfully completed.
    


    1. php_oci8.dllを読み込もうとしているときの起動時のPHP警告

    2. MySQLとJavaでファイルなし(つまりメモリ内)でDATAをロードすることは可能ですか?

    3. 複数の電子メールまたはユーザー名を停止するにはどうすればよいですか?

    4. メタテーブルのカスタム選択クエリ