显式打开和关闭游标

时间:2009-10-16 12:22:59

标签: database oracle plsql cursors

我一直在阅读数据库游标,我见过的每一段示例代码都明确打开并关闭游标。我只使用过几次而且我从来没有这样做过。谁能告诉我为什么有必要这样做?我知道如果你不关闭光标你可以创建内存泄漏,但我从来没有打开过。

谢谢

3 个答案:

答案 0 :(得分:6)

您只需要打开和关闭显式游标。 Implicit cursors具有由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中?)。

答案 1 :(得分:4)

如果你的游标是全局的(我猜你使用了本地游标,这不是问题,因为当它们超出范围时它们会被关闭)你必须明确地关闭它们。

关闭全局游标有几个问题

  • 用于光标的内存未取消分配
  • 您可以打开最多游标数。最终你将无法创建另一个,因为你将打开最大数量的游标。

如果你问我为什么要使用游标? - 有时您需要遍历行(例如使用常规for循环)。你不能在面向集合的方法中做到这一点 - 你必须使用游标。

答案 2 :(得分:0)

这是一个很好的做法,因为您可以轻松获取任何特定查询(ROWCOUNT,NOTFOUND等)的SQL状态,无论您是否在此期间运行其他查询。此外,您可以在包中重用游标,创建ROWTYPE的数据类型,对它们进行循环以及各种好东西!