2016-05-21 8 views
3

私は160列以上のテーブルを持っており、PL/SQLプロシージャで各列を操作する必要があります。私はこのようなテーブルから行全体の記録を行います。名前ではなくインデックスでレコードの列を呼び出す

DECLARE 
    l_employee rec_employees%ROWTYPE; 
    COLUMN_AND_VALUE VARCHAR2(200); 

BEGIN 
    SELECT * 
    INTO l_employee 
    FROM employees 
    WHERE employee_id = 100; 

と私はを参照しなければならないので、今私はFOR LOOPで、このレコードのすべての列で仕事をしたいが、私は方法がわかりませんl_employee.id、l_employee.salary ...のような列名でレコードの各列を呼び出すことができます。l_employee [INDEX_OF_COLUMN]のように順番に参照することができます。また、作業している列の名前も取得できますか?ここでは、私はレコードとしたい例です:

FOR INDEX_OF_COLUMN IN 1 .. 167 LOOP 
    COLUMN_AND_VALUE := l_employee[INDEX_OF_COLUMN].COLUMN_NAME || ': ' || l_employee[INDEX_OF_COLUMN].VALUE_OF_COLUMN 

-- I know those commands don't work, but I need something like that 

END LOOP; 

またはレコードを使用せずにそれを行うより良い方法はここですか?

大変ありがとうございました。私は悪い英語を本当に残念に思っています。私はあなたが私の質問を理解してくれることを願っています:)

+0

これを理解するのに役立つことができますか?あなたは本当にすべての167の列を処理するつもりですか? "はい"の場合、処理中に明示的に 'カラム名'を与えなければなりません。私は各列のデータの処理が他の処理とは異なると考えています。 –

+0

しかし、 'CURSOR C2はTABLE_NAME = 'EMPLOYEES'のところでは' ALL_TAB_COLUMNS'の中から選択したCOLUMN_NAMEを使用してテーブルのすべてのカラム名を得ることができます。 –

答えて

0

最後に私はいくつかの助けを借りてこの解決策を見つけました。それはまさに私がこの記事で必要としていたものですが、私はそれが私が持っていた別の条件のために私にとって最良の方法ではないことに気付きました。

`DECLARE 
    l_query  VARCHAR2(32767) := 'SELECT * FROM employees where id=1'; 
    l_theCursor INTEGER DEFAULT dbms_sql.open_cursor; 
    l_columnValue VARCHAR2(4000); 
    l_status  INTEGER; 
    l_descTbl dbms_sql.desc_tab; 
    l_colCnt NUMBER; 
BEGIN 
    dbms_sql.parse(l_theCursor,l_query,dbms_sql.native); 
    dbms_sql.describe_columns(l_theCursor, l_colCnt, l_descTbl); 
    FOR i IN 1 .. l_colCnt 
    LOOP 
    dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000); 
    END LOOP; 
    l_status := dbms_sql.execute(l_theCursor); 
    WHILE (dbms_sql.fetch_rows(l_theCursor) > 0) 
    LOOP 
    FOR i IN 1 .. l_colCnt 
    LOOP 
     dbms_sql.column_value(l_theCursor, i, l_columnValue); 
     dbms_output.put_line(l_descTbl(i).col_name|| ': ' ||l_columnValue); 
    END LOOP; 
    END LOOP; 
EXCEPTION 
WHEN OTHERS THEN 
    dbms_sql.close_cursor(l_theCursor); 
    RAISE; 
END; ` 
関連する問題