pl / sql:组件' X'必须申报

时间:2014-03-29 18:07:51

标签: oracle plsql

以下代码似乎没问题。但现在确定为什么会抛出这个错误。

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

3 个答案:

答案 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.namerec.salaryrec.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;

分享并享受。