2016-05-21 6 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», выберите COLUMN_NAME из «ALL_TAB_COLUMNS», где TABLE_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; ` 
Смежные вопросы