2011-09-07 107 views
0

正如標題所述,如何使用LIMIT子句批量收集到嵌套表中? 在以下示例中,cur_data是一個嵌套表,它在隨後的BULK COLLECT上被覆蓋。我看到EXTEND用於將數據添加到嵌套表中。有沒有什麼方法可以和BULIK COLLECT做類似的事情?使用LIMIT子句批量收集PL/SQL中的嵌套表

OPEN cur; 
    LOOP 
     FETCH cur bulk collect INTO cur_data LIMIT 500; 
     EXIT WHEN cur_data%COUNT=0; 
    END LOOP; 
    CLOSE cur; 
    /*Data gets overwritten with empty cursor--> No data in cur_data here*/ 


    OPEN cur; 
    FETCH cur bulk collect INTO cur_data; 
    CLOSE cur; 
    /*No Problems--> All data fetched into cur_data */ 

在此先感謝。

+0

@OMG小馬:LIMIT在oracle中受BULK COLLECT支持。 http://download.oracle.com/docs/cd/B12037_01/appdev.101/b10807/13_elems020.htm – digdug

回答

6

我不確定我是否理解您嘗試解決的問題。

如果你想加載每一行從光標中提取到你的集合中,沒有必要使用LIMIT子句。只要

OPEN cur; 
FETCH cur 
BULK COLLECT INTO cur_data; 
<<do something with the data>> 
CLOSE cur; 

如果你想使用LIMIT條款,即意味着你要處理的數據的一個子集,從光標以限制分配給服務器的PGA量返回在時間你的收藏。假設你正在做的

OPEN cur; 
LOOP 
    FETCH cur 
    BULK COLLECT INTO cur_data LIMIT 500; 
    EXIT WHEN cur_data%count = 0; 
    <<do something with the 500 elements in cur_data>> 
END LOOP; 
CLOSE cur; 

它沒有任何意義,500行,在你的循環內的時間內獲取數據,然後做了一些收集的循環之外。

+0

我記得一次讀取BULK COLLECTING的所有內容,會比使用LIMIT子句限制記錄的數量消耗更多的內存,特別是如果有幾百萬條記錄。這就是爲什麼我想使用LIMIT子句。對不起,我沒有在問題中提到這一點。 – digdug

+0

@digdug - 是的,由於集合中的數據存儲在服務器的PGA內存中,因此處理數據塊相對昂貴並且是一個好主意。但是,如果你要處理大塊數據,那麼你將在循環內處理它,就像我在第二個示例中所展示的那樣。內存消耗與集合中元素的數量有關,因此如果要節省內存,則不會一次收集集合中的所有數據。 –