2009-10-16 72 views
0

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

感谢

回答

4

如果游标是全局的(我猜你使用本地光标在那里,这不是一个问题,因为当他们离开的范围,他们被关闭),你必须明确地关闭它们。

大约有不释放

  • 有你可以有打开的游标的最大数量不关闭全球光标

    • 的内存用于光标几个问题。最终你将无法创建另一个,因为你将打开最大数量的游标。

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

  • 0

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

    6

    你只需打开和关闭显式游标。 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; 
    /
    

    隐式游标在代码中更加简洁,您不必担心关闭它们。我也发现将光标的代码放在实际使用的地方更清晰。我很少使用显式游标,只有当它们可以在包中的许多地方重用时(为什么不把它放在一个单独的过程中?)。

    +0

    SELECT * INTO l_dept FROM dept WHERE deptno =:deptno; – 2009-10-16 13:18:42

    +0

    @Robert:thanks =) – 2009-10-16 13:34:16

    +0

    +1,你对隐式光标的评论是专注的。懒惰,我讨厌使用显式游标所需的额外编码。另一个好处是:您不必检查数据不足的情况。当处理完所有数据后,循环退出。 – DCookie 2009-10-16 23:00:46