2017-08-04 10 views
0

Oracle PL/SQLで作業しています。 c1とc2の2つのカーソルがあります。カーソル付きのPL/SQLネストループ

v_temp VARCHAR(50); 
For s1 IN c1 
LOOP 
    --do something 
    FOR s2 IN c2 
    LOOP 
     --do something 
     v_temp := s1.s2.xxx; --PLS-00302: component 's2' must be declared 
    END LOOP; 
END LOOP; 

s2.xxxは、列名を与え、その列の名前で私はs1からv_tempに、その列の値を代入したいと考えています。 例: 最初の繰り返しでは、s2.xxx'column1', s1.column1v_tempに割り当てたいとします。 2回目の反復では、s2.xxx'column2'で、s1.column2v_tempに割り当てたいとします。

コンパイルしようとしたときにエラーが発生しました: Error(191,48): PLS-00302: component 's2' must be declared 私はs1.s2.xxxが有効ではないことを知っていますが、それを動作させる別の方法がありますか?

+0

v_tempに割り当てるすべての列データがVARCHAR2(50)に収まるようにしますか。 。 –

+0

すべての列のデータ型がVARCHAR2(<50) – Gab1991

答えて

0

私はあなたがそのようになめらか必要があると思う:

declare 
    v_temp VARCHAR(50); 
    v_temp_1 VARCHAR(50); 
    cursor c2(p VARCHAR) is 
     SELECT * 
     FROM tbl 
     WHERE tbl.column = p; 
begin 
    For s1 IN c1 
    LOOP 
      --do something 
      v_temp_1 := s1.xxx; 
      FOR s2 IN c2(v_temp_1) 
      LOOP 
        --do something 
        v_temp := s1.xxx; 
      END LOOP; 
    END LOOP; 
end; 
0

あなたはREF CURSORからフェッチし、動的カーソルを開いている間にselect文にCOLUMN_NAMEを追加する必要があります。ここでは、表EMPLOYEESのすべての列名をUSER_TAB_COLUMNSからフェッチし、対応する値をv_tempに割り当てています。

SET SERVEROUTPUT ON; 
DECLARE 
    v_temp VARCHAR(50); 
    query1 VARCHAR2(1000); 
    c1 SYS_REFCURSOR; 
    CURSOR c2 
    IS 
    SELECT COLUMN_NAME xxx FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'EMPLOYEES'; 
BEGIN 
    FOR s2 IN c2 
    LOOP 
    --do something 
    query1 := 'SELECT ' ||s2.xxx||' FROM EMPLOYEES'; 
    OPEN c1 FOR query1 ; 
    LOOP 
     FETCH c1 INTO v_temp; 
     DBMS_OUTPUT.PUT_LINE('COLUMN:'||s2.xxx||', VALUE:'|| v_temp); 
     EXIT 
    WHEN c1%NOTFOUND; 
    END LOOP; 
    CLOSE c1; 
    END LOOP; 
END; 
/

Employeesのすべての列の長さは< 50であるので、Fine.The変換がNUMBERDATEデータタイプに暗黙的に発生し働いています。

ここに出力例を示します。

COLUMN:EMPLOYEE_ID, VALUE:100 
COLUMN:EMPLOYEE_ID, VALUE:101 
COLUMN:EMPLOYEE_ID, VALUE:102 
COLUMN:FIRST_NAME, VALUE:Eleni 
COLUMN:FIRST_NAME, VALUE:Eleni 
COLUMN:LAST_NAME, VALUE:Whalen 
COLUMN:LAST_NAME, VALUE:Fay 
COLUMN:HIRE_DATE, VALUE:17-06-03 
COLUMN:HIRE_DATE, VALUE:21-09-05 
関連する問題