emp%rowtype 表示数据表emp的行类型; 而你的游标cursor c1 is select object_name from dba_objects where object_id=20只是表示是一个字符串类型,两个类型不一致,自然报错。
可以这么理解 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不满足编译条件
嗯,这个肯定是游标声明和变量声明不一致导致的。 除了将变量声明为和游标中的object_name一直的字符变量外,你也可以试着将fetch c1 into employee_rec;中的employee_rec改为employee_rec.object_name试试。
我的理解emp%rowtype是存储整行数据。也就是行类型! 而cursor c1 is select object_name from dba_objects where object_id=20 这是一个字段类型,不符合。所以报错。 后面的employee_rec.object_name也会报错!
而你的游标cursor c1 is select object_name from dba_objects where object_id=20只是表示是一个字符串类型,两个类型不一致,自然报错。
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不满足编译条件
你可以想象成emp表的一行数据你改成 dba_objects%rowtype 是 没问题的,值是报了个警告嘛,没有报错啊。
只是因为你可能是hr用户,虽然有dba角色,但对dba_objects的权限上还有些不满足,把查询系统视图的权限给hr
除了将变量声明为和游标中的object_name一直的字符变量外,你也可以试着将fetch c1 into employee_rec;中的employee_rec改为employee_rec.object_name试试。
而cursor c1 is select object_name from dba_objects where object_id=20
这是一个字段类型,不符合。所以报错。
后面的employee_rec.object_name也会报错!