是否强制关闭PLSQL块中的游标

Kap*_*pil 2 oracle cursor fetch

请参阅以下过程。我没有关闭光标,它工作正常。我在这里错过了什么吗?是强制关闭游标还是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;
Run Code Online (Sandbox Code Playgroud)

Vij*_*upa 5

Oracle网站上的这篇文章说的很清楚。

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

当游标在声明部分(而不是在包中)声明时,Oracle 数据库也会在声明它的块终止时自动关闭它。然而,自己显式关闭游标仍然是一个好主意。如果光标移至某个包,则现在所需的 CLOSE 已就位。如果是本地的,那么包含 CLOSE 语句也会向其他开发人员和您的经理表明您正在关注。

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