我一直在阅读数据库游标,并且我看到的每一位示例代码都明确地打开和关闭了游标。我只用过几次,我从来没有这样做过。谁能告诉我为什么有必要这样做?我知道如果你不关闭游标,你可能会造成内存泄漏,但我从来没有打开过一个。
谢谢
您只需要打开和关闭显式游标。隐式游标具有由 Oracle 自动管理的优点。隐式游标示例:
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;
/
隐式游标在代码中更加简洁,您不必担心关闭它们。我还发现将光标的代码放在实际使用的地方更清楚。我很少使用显式游标,只有当它们可以在包中的许多地方重用时(那为什么不把它放在一个 proc 中呢?)。
如果您的游标是全局的(我猜您在这不是问题的地方使用了本地游标,因为它们在超出范围时被关闭)您必须明确关闭它们。
不关闭全局游标存在几个问题
如果您问为什么我必须使用游标?- 有时您需要遍历行(例如使用常规 for 循环)。你不能在面向集合的方法中做到这一点——你必须使用游标。
这是一个很好的做法,因为您可以轻松获取任何特定查询(ROWCOUNT、NOTFOUND 等)的 SQL 状态,无论您是否同时运行了其他查询。此外,您可以在包中重用您的游标,创建其 ROWTYPE 的数据类型,对它们进行循环,以及各种好东西!