PL / SQL嵌套循环与游标

时间:2017-08-04 10:47:27

标签: oracle plsql nested cursor

我正在使用Oracle PL / SQL。有两个游标,即c1和c2。

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.column1分配给v_temp。在第二次迭代中,s2.xxx'column2',然后我想将s1.column2分配给v_temp

我收到了错误: Error(191,48): PLS-00302: component 's2' must be declared 在尝试编译时。我知道s1.s2.xxx无效,但有没有其他方法可以使它有效?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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