2010-06-07 32 views

回答

2

我相信它會一直存在直到你的會話消失或關閉它。

您可以通過關閉它,當你用它做;-)

嚴重的是,依靠一些設置來關閉遊標你只是隱藏的問題並促進惰性編程配置光標的壽命。它也可能對合法需要保持光標更長時間打開的任何過程產生不利影響。

3

除了DCookie的回答是:

光標壽命的一般模式是

OPEN 
BIND 
EXECUTE 
FETCH...FETCH...FETCH 
BIND 
EXECUTE 
FETCH...FETCH...FETCH 
... 
CLOSE 

即光標可以重新使用新鮮的變量結合到它並再執行它。

在會話級別,PL/SQL還將維護cache of cursors,以避免重新打開最近關閉的遊標的開銷。所以一個你編程關閉的遊標可能仍然是打開的。 Oracle會在適當的時候在幕後關閉它們。

如果光標超出範圍,則可以關閉它。也就是說,如果一個電話或程序是這樣的:

DECLARE 
    CURSOR c_1 IS SELECT ....; 
BEGIN 
    OPEN c_1; 
    FETCH c_1 INTO...; 
END; 

那麼,一旦執行完畢,C_1超出範圍(而不能物理再次調用),並可以關閉。這對異常處理特別有用,因爲可能會引發異常,跳出該過程並繞過所有'CLOSE c_1';'碼。通過關閉超出範圍的遊標,您不必擔心添加異常處理代碼來執行此操作。

如果你的遊標有一個會話範圍(例如,在PL/SQL包規範或主體的全局級定義或通過引用遊標返回給客戶端),它永遠不會以這種方式超出範圍,所以永遠不會會自動關閉,直到會話斷開或通過DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES);

+0

+1好信息,謝謝加里。 – DCookie 2010-06-08 14:38:56