含FOR UPDATE游标两段PL/SQL代码差异及ORA-00942错误排查
问题分析与解决
错误原因
ORA-00942错误代表“表或视图不存在”,你的问题出在UPDATE语句中错误使用了游标查询里的局部别名k:
游标定义里的a.testA k仅在游标查询范围内有效,属于查询语句的临时别名,不能直接作为UPDATE的目标表名使用。数据库会把k当作真实存在的表名去查找,自然找不到对应的对象,因此抛出ORA-00942错误。
修正后的代码
你需要将UPDATE语句中的k替换为实际表名a.testA,结合WHERE CURRENT OF的特性即可正常运行:
declare cursor c1 is select * from a.testA for update; testA_record a.testA%rowtype; begin open c1; loop fetch c1 into testA_record; exit when c1%notfound; update a.testA set colA = 100 where current of c1; end loop; close c1; end;
如果想保留游标里的别名也可以,别名不影响WHERE CURRENT OF的功能,只需确保UPDATE目标是真实表名:
declare cursor c1 is select * from a.testA k for update; testA_record a.testA%rowtype; begin open c1; loop fetch c1 into testA_record; exit when c1%notfound; update a.testA set colA = 100 where current of c1; end loop; close c1; end;
额外说明
WHERE CURRENT OF c1会自动定位到游标c1当前获取的行,无需手动指定主键或过滤条件,是游标更新行的标准写法。- 你添加的
FOR UPDATE是正确的前提操作,只有带行锁的游标才能使用WHERE CURRENT OF进行定位更新,问题仅出在UPDATE语句的目标表名误用。
内容的提问来源于stack exchange,提问作者4est
相关产品推荐
相关产品推荐

