请参阅以下程序。我没有关闭光标,它工作正常。我在这里错过了一些东西。 是否必须关闭游标或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;
答案 0 :(得分:1)
This article on Oracle website非常明确。
在包中声明游标时(即不在 包的子程序)并且光标打开,它将保持打开状态 直到你明确关闭它或你的会话终止。
当光标在声明部分声明时(而不是声明部分) 包),Oracle数据库也会自动关闭它的时候 声明终止的块。然而,它仍然是一个好消息 想法自己明确地关闭光标。如果移动光标 到一个包裹,你将有现在必要的CLOSE到位。 如果它是本地的,那么包括CLOSE语句也将显示 其他开发人员和你的经理,你正在关注。
在您的代码示例中,CURSOR被声明为过程的一部分(而不是包的一部分),这意味着,当过程执行完成时,游标会自动关闭。但是,如果代码中包含CLOSE cursor
语句,那么对OPEN cursor
语句进行最佳编码操作。它使代码在将来易于理解和支持。