2010-07-01 11 views
1

使用批量收集,而不是一個循環我有一個簡單的查詢像下面在我的程序:如何在Oracle

result_rec    mypkg.mytype; 

OPEN CUR1 FOR 
    select col1, col2, col3 from table1 where something = 'a'; --rows will always be 50 

     LOOP 
     FETCH CUR1 
      INTO myrectype; 
     EXIT WHEN CUR1%NOTFOUND; 
     result_rec.col1 := myrectype.col1; 
     result_rec.col2 := myrectype.col2; 
     result_rec.col3 := myrectype.col3; 
     PIPE ROW (result_rec); 
     END LOOP; 

正如你所看到的,每次我在循環50次。有一個更好的方法嗎?就像BULK COLLECT INTO?我將如何實現?

回答

6

在Oracle 10g(可能9I),Oracle會自動批量收集隱式遊標。因此代碼如下:

DECLARE 
    result_rec    mypkg.mytype; 
BEGIN 
    for i in (select col1, co2, col3 from table1 where something = 'a') 
    loop 
    result_rec.col1 := i.col1; 
    result_rec.col2 := i.col2; 
    result_rec.col3 := i.col3; 
    pipe_row (result_rec); 
    end loop; 
END; 

只會將上下文從PL/SQL引擎切換到SQL引擎,以每100行一次獲取記錄。在SQL跟蹤(dbms_monitor.session_trace_enable())下運行它並查看!

+1

此行爲介紹10g。 – 2010-07-01 05:16:28

3

您可以嘗試以下操作。

DECLARE 
    type tab_result_rec IS TABLE OF mypkg.mytype INDEX BY PLS_INTEGER; 
    t_result_rec tab_result_rec; 
BEGIN 
    select col1, col2, col3 bulk collect into t_result_rec 
    from table1 where something = 'a'; --rows will always be 50 
    -- 
    for i in 1..t_result_rec.count LOOP 
    PIPE ROW (t_result_rec(i)); 
    end loop; 
END;