我正在使用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
无效,但有没有其他方法可以使它有效?
答案 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,它工作正常。转换隐式发生在NUMBER
和DATE
数据类型中。
以下是输出示例。
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