我与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
是无效的,但有没有写它的另一种方式,可以使工作?
我认为你需要水木清华这样的:
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;
你需要从获取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