我一直在阅读数据库游标,并且我已经看到的示例代码的每一位都明确地打开并关闭了游标。我只用了几次,我从来没有这样做过。谁能告诉我为什么有必要这样做?我知道如果你不关闭游标,你可以创建内存泄漏,但我从来没有打开过。显式打开和关闭游标
感谢
我一直在阅读数据库游标,并且我已经看到的示例代码的每一位都明确地打开并关闭了游标。我只用了几次,我从来没有这样做过。谁能告诉我为什么有必要这样做?我知道如果你不关闭游标,你可以创建内存泄漏,但我从来没有打开过。显式打开和关闭游标
感谢
如果游标是全局的(我猜你使用本地光标在那里,这不是一个问题,因为当他们离开的范围,他们被关闭),你必须明确地关闭它们。
大约有不释放
如果你问为什么我必须使用游标? - 有时您需要循环遍历行(如使用常规for循环)。你不能在面向集合的方法中做到这一点 - 你必须使用游标。
这是一个很好的做法,因为您可以轻松获取任何特定查询(ROWCOUNT,NOTFOUND等)的SQL状态,而不管您是否在此期间运行过其他查询。此外,您可以在包中重新使用游标,创建ROWTYPE的数据类型,在它们上面创建循环,以及各种各样的好东西!
你只需打开和关闭显式游标。 Oracle有自动管理Implicit cursors的优势。隐式游标示例:
DECLARE
l_dept dept%rowtype;
BEGIN
-- implicit SELECT INTO
SELECT * INTO l_dept FROM dept WHERE deptno = :deptno;
-- implicit LOOP
FOR cc IN (SELECT emp.* FROM emp WHERE deptno = l_dept.deptno) LOOP
dbms_output.put_line('emp='||cc.empno);
END LOOP;
END;
/
隐式游标在代码中更加简洁,您不必担心关闭它们。我也发现将光标的代码放在实际使用的地方更清晰。我很少使用显式游标,只有当它们可以在包中的许多地方重用时(为什么不把它放在一个单独的过程中?)。
SELECT * INTO l_dept FROM dept WHERE deptno =:deptno; – 2009-10-16 13:18:42
@Robert:thanks =) – 2009-10-16 13:34:16
+1,你对隐式光标的评论是专注的。懒惰,我讨厌使用显式游标所需的额外编码。另一个好处是:您不必检查数据不足的情况。当处理完所有数据后,循环退出。 – DCookie 2009-10-16 23:00:46