select *  from emp                   ==> emp%rowtypeselect object_name from dba_objects  ==> varchar2

解决方案 »

  1.   

    emp%rowtype 表示数据表emp的行类型;
    而你的游标cursor c1 is select object_name from dba_objects where object_id=20只是表示是一个字符串类型,两个类型不一致,自然报错。
      

  2.   

    可以这么理解
    emp%rowtype可以存储emp表的一整行数据;
    因为
    cursor c1 is select object_name from dba_objects where object_id=20;--游标c1只是得到dba_objects的一个字段列
    employee_rec dba_objects%rowtype;--dba_objects;   employee_rec得到dba_objects一行字段列
    所以
    fetch c1 into employee_rec不满足编译条件
      

  3.   

    emp%rowtype是记录类的符合变量类型
    你可以想象成emp表的一行数据你改成 dba_objects%rowtype 是 没问题的,值是报了个警告嘛,没有报错啊。
    只是因为你可能是hr用户,虽然有dba角色,但对dba_objects的权限上还有些不满足,把查询系统视图的权限给hr
      

  4.   

    嗯,这个肯定是游标声明和变量声明不一致导致的。
    除了将变量声明为和游标中的object_name一直的字符变量外,你也可以试着将fetch c1 into employee_rec;中的employee_rec改为employee_rec.object_name试试。
      

  5.   

    我的理解emp%rowtype是存储整行数据。也就是行类型!
    而cursor c1 is select object_name from dba_objects where object_id=20
    这是一个字段类型,不符合。所以报错。
    后面的employee_rec.object_name也会报错!