2016-05-21 11 views
3

Ich habe Tabelle mit mehr als 160 Spalten und ich muss mit jeder Spalte im PL/SQL-Verfahren arbeiten. Ich mache eine Aufzeichnung der gesamten Zeile aus der Tabelle wie folgt aus:Aufruf von Spalten des Datensatzes von seinem Index, nicht Name

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

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

und jetzt will ich mit allen Spalten dieser Datensatz mit FOR-Schleife arbeiten, aber ich weiß nicht wie, weil ich beziehen, jede Spalte des Datensatzes nach ihrem Spaltennamen wie l_employee.id, l_employee.salary, .... ist es möglich, auf sie in der Reihenfolge wie l_employee [INDEX_OF_COLUMN] zu verweisen und auch den Namen der Spalte zu erhalten, mit der ich arbeite? Hier ist das Beispiel, das ich mit Datensatz machen möchte:

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; 

Oder ist hier besser Weg, es ohne Verwendung von Rekord zu tun?

Vielen Dank und es tut mir wirklich leid für mein schlechtes Englisch. Ich hoffe du hast meine Frage verstanden :)

+0

Können Sie uns bitte helfen, die Verwendung dieses zu verstehen? Werden Sie wirklich alle 167 Spalten verarbeiten? Wenn ja, dann müssen Sie während der Bearbeitung unbedingt den 'Spaltennamen' explizit angeben. Ich denke, dass die Verarbeitung der Daten jeder Spalte anders sein wird als die der anderen. –

+0

Sie können jedoch alle Spaltennamen für die Tabelle mit 'CURSOR C2 erhalten. Wählen Sie COLUMN_NAME aus' ALL_TAB_COLUMNS' aus. TABLE_NAME = 'EMPLOYEES'; –

Antwort

0

Endlich fand ich mit ein wenig Hilfe diese Lösung. Es ist genau das, was ich in diesem Post gebraucht habe, aber dann habe ich gemerkt, dass es nicht der beste Weg für mich ist, weil ich andere Bedingungen habe.

`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; `