是否必须在PLSQL块中关闭游标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否必须在PLSQL块中关闭游标相关的知识,希望对你有一定的参考价值。

请参阅以下程序。我没有关闭光标,它工作正常。我在这里错过了一些东西。是否必须关闭游标或Oracle自动关闭它?

CREATE OR REPLACE PROCEDURE pr_cursor_test IS
    CURSOR emp_cur IS SELECT empno, ename FROM emp;
    emprec emp_cur%rowtype;
BEGIN
    OPEN emp_cur;
    LOOP
        FETCH emp_cur INTO emprec;
        EXIT WHEN
            emp_cur%notfound;
        --Do Something
        dbms_output.put_line(emprec.ename);
    END LOOP;
END;
答案

This article on Oracle website非常清楚。

当您在包中声明游标(即,不在包的子程序内)并且游标被打开时,它将保持打开状态,直到您明确关闭它或您的会话终止。

当光标在声明部分(而不是在包中)声明时,Oracle数据库也会在声明它的块终止时自动关闭它。但是,自己明确关闭光标仍然是个好主意。如果将光标移动到包中,则现在已经具有必要的CLOSE。如果它是本地的,那么包括CLOSE声明也会向其他开发者和您的经理表明您正在关注。

在您的代码示例中,CURSOR被声明为过程的一部分(而不是包的一部分),这意味着,当过程执行完成时,游标会自动关闭。但是,如果你在代码中有CLOSE cursor语句,那么对OPEN cursor语句进行编码是最好的。它使代码在将来易于理解和支持。

以上是关于是否必须在PLSQL块中关闭游标的主要内容,如果未能解决你的问题,请参考以下文章

在 SQLite 中关闭游标或连接有啥区别吗?

从 pl/sql 异常块中“一次”关闭所有游标

应用程序在主要活动中关闭onBackPressed

如何在导航控件片段中关闭导航 DrawerLayout onBackPressed

PLSQL 块需要很长时间来声明游标

错误 ORA-01000: 超出最大打开游标