2013-04-16 1 views
0

Я выбрал одну строку в переменной rowType. эта строка содержит 80 столбцов. Так что я не хочу, чтобы имена кодов жесткого кода в моей программе и выборки имен столбцов из словаря данных.Получение всех столбцов строки в коллекции в StoredProcedure

Пожалуйста, скажите мне, как я могу получить доступ к отдельным значениям столбцов ????? следующий - мой код.

DECLARE 
fetchedRow EMP%ROWTYPE; 
TYPE columnNameList IS TABLE OF USER_TAB_COLUMNS.column_name%TYPE; 
CURSOR empCursor IS select column_name from USER_TAB_COLUMNS where table_name = 'EMP'; 
empColumnNames columnNameList; 
colName varchar2(100); 
BEGIN 
    -- Fetching column names of EMP from data dictionary 
    OPEN empCursor; 
    FETCH empCursor BULK COLLECT INTO empColumnNames; 
    CLOSE empCursor; 
    DBMS_OUTPUT.PUT_LINE('Columns fetched'); 

BEGIN 
    SELECT * into fetchedRow from EMP where EMP_ID = 1234; 
END; 

colName := 'fetchedRow.'||empColumnNames(1); --- colName will have fetchedRow.EMP_ID 
DBMS_OUTPUT.PUT_LINE('Going to Compare'||colName); 

--stuck here 
    if colName = 1234 then -- Want to compare value of fetchedRow.EMP_ID with 1234 
     DBMS_OUTPUT.PUT_LINE('Matching'); 
    else 
    DBMS_OUTPUT.PUT_LINE('Not-Matching'); 
    END IF; 
EXCEPTION 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('Error'||SQLERRM); 

END; 

ответ

0

Вам необходимо использовать динамический SQL для доступа к полю, что путь, но один маленький фокус в том, чтобы поместить текущую строку в каком-то месте, доступном из SQL заявления, для заголовка примера пакета.

Tom Kyte хорошо как всегда, посмотрите here.

SQL fidlle с живым примером можно найти here.

Некоторый код для иллюстрации:

заголовка Declare пакета

create or replace package TmpRowAccess as 

    CurRow emp%rowtype; 

end; 

При получении строки - поднести его в переменный пакете

SELECT * into TmpRowAccess.CurRow from EMP where rownum = 1; 

Строительство для области доступа к значениям

declare 
    vRes char(1); 
    vParam number := 1234; 
    begin 

    execute immediate 
     ' 
     begin 
      if(:1 = TmpRowAccess.CurRow.'|| colName ||') then 
      :2 := ''Y''; 
      else 
      :2 := ''N''; 
      end if; 
     end; 
     ' 
     using in vParam, out vRes; 

    if(vRes = 'Y') then 
     DBMS_OUTPUT.PUT_LINE('Matching'); 
    else 
     DBMS_OUTPUT.PUT_LINE('Not-Matching'); 
    end if; 

    end;