2009-10-16 97 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