以下代码似乎没问题。但现在确定为什么会抛出这个错误。
DECLARE
CURSOR cur IS
SELECT name, salary, deptname
FROM emp_dept_view;
TYPE st IS RECORD( n VARCHAR2(30), s NUMBER(7), d VARCHAR2(30));
rec st;
BEGIN
FOR rec IN cur LOOP
dbms_output.put_line(rec.n);
END LOOP;
END;
ERROR at line 10:
ORA-06550: line 10, column 26:
PLS-00302: component 'N' must be declared
ORA-06550: line 10, column 1:
PL/SQL: Statement ignored
答案 0 :(得分:3)
看这里:
for rec in cur
loop
.....
根据文件:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/cursor_for_loop_statement.htm#CJAIGGIA
<强>记录强>
隐式指向游标FOR LOOP语句的循环索引的名称 声明为游标或类型的%ROWTYPE记录变量 select_statement返回。
记录是游标FOR LOOP语句的本地记录。里面的陈述 循环可以引用记录及其字段。他们可以参考 虚拟列仅由别名组成。循环外的语句不能 参考记录。光标FOR LOOP语句运行后,记录为 未定义。
强调我的。
这意味着rec
语句中的for ..loop
记录对于此语句是本地的,并且类型为cur%rowtype
,但不是st
记录类型。 rec
中的标识符for .. loop
隐藏了外部块中的变量rec
。在循环中,您可以使用:rec.name
,rec.salary
和rec.deptname
,但不能使用rec.n
。
答案 1 :(得分:1)
当你使用游标&#34; for loop&#34; Oracle自动声明循环变量。 REC in循环与声明部分中的REC不同。在下面的示例中,您可以清楚地看到Oracle重新声明了REC变量:
SQL> declare
2 rec number;
3 begin
4 for rec in (select * from user_tables where rownum <=3) loop
5 dbms_output.put_line(rec.table_name);
6 end loop;
7 end;
8 /
DEPT
EMP
BONUS
答案 2 :(得分:0)
另一个选择是修改光标以返回字段名称:
declare
cursor cur is
select name as n,
salary as s,
deptname as d
from emp_dept_view;
begin
for rec in cur loop
dbms_output.put_line(rec.n);
end loop;
end;
分享并享受。