2016-10-17 4 views
0

テーブルsome_tableの行を行タイプ変数l_currentに選択しました。今、私はその変数のトラフフィールドを最初から最後まで、そしてゲートフィールド名と値を繰り返す必要があります。 以下に抜粋したコードで、私はplsqlで何をしたいのかをコメントアウトして書きましたが、どうやってそれを行うのかわかりません。事前にrowtype変数のトラフフィールドの反復

declare 
    l_current some_table%rowtype; 
begin 
    for i in l_records.first .. l_records.last 
    loop 
     select * 
     into l_current 
     from some_table 
     where id = l_records(i).id; 
--******************* 
     for each field in l_current 
     loop 
     a := field.name; 
     b := field.value; 
     end loop; 
--******************* 
    end loop; 
end; 

ありがとう!

+2

PL/SQL言語には、このタイプのイントロスペクション機能がありません。 –

+2

[dbms_sql](https://docs.oracle.com/database/121/ARPLS/d_sql.htm)でカーソルを列に解析することができます。[anydata](http: //docs.oracle.com/database/121/ARPLS/t_anydat.htm)タイプですが、PL/SQLでは、コンパイル時にそのレコード・タイプを認識する必要があります。 –

+0

私は自分でこれをやったことはありませんが、レコード操作PL/SQLコードがJava(またはOracleに接続できる他の言語)を使用してプログラムによって生成されているシナリオを見てきました。 – user272735

答えて

0

少しの研究の後、私は自分が望むものを達成することができましたが、DBMS_SQLパッケージを使用して全く異なる方法で実現しました。

 l_sql := ''; 
     l_sql := l_sql || 'select * '; 
     l_sql := l_sql || ' from some_table where id = ' || l_records(i).ekd_id; 

     l_cursorID := DBMS_SQL.OPEN_CURSOR; 
     dbms_sql.parse(l_cursorID, l_sql, dbms_sql.native); 
     dbms_sql.describe_columns(l_cursorID, l_column_count, l_descTbl); 

     for j in 1..l_column_count 
     loop 
     dbms_sql.define_column(l_cursorID, j, l_columnValue, 2000); 
     l_key := l_descTbl(j).col_name; 
     l_table(j + (l_counter * l_column_count)).kre_id := l_records(i).kre_id; --i + (l_counter * l_column_count) 
     l_table(j + (l_counter * l_column_count)).field_id := j; 
     l_table(j + (l_counter * l_column_count)).field_name := l_key; 
     end loop; 

     l_status := dbms_sql.execute(l_cursorID); 
     l_status := DBMS_SQL.FETCH_ROWS(l_cursorID); 

     for k in 1..l_column_count 
     loop 
     dbms_sql.column_value(l_cursorID, k, l_columnValue); 
     l_value := l_columnValue; 
     l_table(k + (l_counter * l_column_count)).field_value1 := l_value; 
     end loop; 

     DBMS_SQL.CLOSE_CURSOR(l_cursorID); 

うまくいけば、誰かがこの便利を見つける:ここでは実施例からの抜粋です。