set serveroutput on;
declare
type user_record is record
( v_id     emp.empno%type,
  v_name   emp.ename%type
);
v_user_record   user_record;
 
cursor zzucursor(v_type number)is
select empno,ename from emp 
where deptno =v_type;begin 
for  v_user_record in zzucursor(30) loop
dbms_output.put_line('userid  :'||v_user_record.v_id||'username  :'||v_user_record.v_name);
end loop ;
end;错误信息如下:第 14 行出现错误:
ORA-06550: 第 14 行, 第 49 列:
PLS-00302: 必须声明 'V_ID' 组件
ORA-06550: 第 14 行, 第 1 列:
PL/SQL: Statement ignored

解决方案 »

  1.   

    declare
    type user_record is record
    ( v_id emp.empno%type,
      v_name emp.ename%type
    );
    v_user_record user_record;
    cursor zzucursor is
    select empno,ename from emp;
    begin 
    for i in zzucursor loop
     v_user_record.v_id := i.empno;
     v_user_record.v_name := i.ename;
    dbms_output.put_line('userid :'||v_user_record.v_id||'username :'||v_user_record.v_name);
    end loop ;
    end;
    /你没有对v_id赋值,所以产生问题
      

  2.   

    对于for 循环而言 for后面的那个变量的作用域只仅限于for这个循环体内, 你之前声明的record的类型在for循环体内并没有被读到,而且是被你再for后面声明的变量给覆盖掉了,不管名字是否一样。
    declare
    type user_record is record
    ( v_id emp.empno%type,
      v_name emp.ename%type
    );
    v_user_record user_record;
     
    cursor zzucursor is
    select empno,ename from emp  
    where deptno =30;
    begin 
    select empno,ename into v_user_record from emp  
    where deptno =30 and empno=7698;
    dbms_output.put_line('aaaaauserid :'||v_user_record.v_id||'username :'||v_user_record.v_name);
    for v_user_record in zzucursor loop
    select empno,ename into v_user_record from emp  
    where deptno =30;
    dbms_output.put_line('userid :'||v_user_record.empno||'username :'||v_user_record.ename);
    end loop ;
    dbms_output.put_line('bbbbbbbuserid :'||v_user_record.v_id||'username :'||v_user_record.v_name);
    end;
    这段代码你跑下就该明白了,循环体内和循环体外的差别。
    declare
    type user_record is record
    ( v_id emp.empno%type,
      v_name emp.ename%type
    );
    v_user_record user_record;
     
    cursor zzucursor is
    select empno,ename from emp  
    where deptno =30;
    begin  
    open zzucursor;
    loop
    fetch zzucursor into v_user_record;
    exit when zzucursor%notfound;
    dbms_output.put_line('userid :'||v_user_record.v_id||'username :'||v_user_record.v_name);
    dbms_output.put_line('aa');
    end loop ;
    close zzucursor;
    end;
    用fetch 循环就不会出现这个情况。 给分!
      

  3.   

    感觉 LZ 是单纯做测试的, 如果真要写代码,根本不用去声明record。补充一下,前一段代码是我测试的, 有点乱,改的比较多,报错了,主要是让你比较循环体内外的差别,我整理下。
      

  4.   


    declare
    type user_record is record
    ( v_id emp.empno%type,
      v_name emp.ename%type
    );
    v_user_record user_record;
     
    cursor zzucursor is
    select empno,ename from emp  
    where deptno =30;
    begin 
    select empno,ename into v_user_record from emp  
    where deptno =30 and empno=7698;
    dbms_output.put_line('aaaaauserid :'||v_user_record.v_id||'username :'||v_user_record.v_name);
    for v_user_record in zzucursor loop
    dbms_output.put_line('userid :'||v_user_record.empno||'username :'||v_user_record.ename);
    end loop ;
    end;这个 是整理后的。你自己可以从不同角度测测。
      

  5.   

    v_id的賦值問題,你知道一個變量,系統怎麼會知道是什麼,所以一定要賦值。希望能夠幫到你吧!