FOR游标循环后执行CLOSE c1报Invalid cursor错误的技术咨询
问题解答
没错,完全存在这种可能!这其实是Oracle PL/SQL里一个很容易踩的小坑,和游标FOR循环的隐式处理逻辑有关。
你写的是FOR i IN c1 LOOP这种游标FOR循环,这种写法的优势就是Oracle会帮你自动搞定游标的全生命周期:
- 循环开始前自动打开游标
- 每次循环自动取出下一条数据
- 当循环正常结束(不管是遍历完所有数据,还是通过
EXIT正常退出),系统会自动关闭游标
这时候你在循环结束后再手动执行CLOSE c1;,就相当于去关闭一个已经被数据库自动关掉的游标,自然会抛出Invalid c1 when CLOSE c1的错误。而UPDATE操作能正常运行,是因为循环执行过程中游标处于正常打开状态,每一次遍历的UPDATE逻辑都能正常执行,只是最后手动关游标的步骤出了问题。
举个代码对比:
错误的代码片段:
FOR i in c1 LOOP UPDATE.... COMMIT; END LOOP; CLOSE c1; -- 这行多余,会触发报错
修正后的代码:
FOR i in c1 LOOP UPDATE.... COMMIT; END LOOP; -- 无需手动关闭游标,系统已自动处理
只要删掉多余的CLOSE c1;语句,问题就解决啦。
内容的提问来源于stack exchange,提问作者user2102665
相关产品推荐
相关产品推荐

