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

时间:2016-12-01 06:22:39

标签: 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;

1 个答案:

答案 0 :(得分:1)

This article on Oracle website非常明确。

  

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

     

当光标在声明部分声明时(而不是声明部分)   包),Oracle数据库也会自动关闭它的时候   声明终止的块。然而,它仍然是一个好消息   想法自己明确地关闭光标。如果移动光标   到一个包裹,你将有现在必要的CLOSE到位。   如果它是本地的,那么包括CLOSE语句也将显示   其他开发人员和你的经理,你正在关注。

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