2017-08-04 64 views
0

我正在使用Oracle PL/SQL。有两个游标,即c1和c2。带光标的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给出了一个列名,并与列名我希望该列的值赋给从s1v_temp。 例如: 在第一次迭代中,s2.xxx'column1', 我想将s1.column1指定为v_temp。在第二次迭代中,s2.xxx'column2',然后我想将s1.column2指定为v_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获取和COLUMN_NAME动态追加到SELECT语句,同时打开光标。在这里,我从USER_TAB_COLUMNS获取表EMPLOYEES的所有列名,并将其相应的值分配给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 <,它是工作罚款。转​​换为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