2011-04-01 48 views
2

我想在Oracle/PLSQL中執行某些操作,我希望通過遊標從數據庫中選擇一些內容並將其存儲到行數組中,以便後續處理。搜索谷歌,但無濟於事。將感謝這裏的任何幫助。用於存儲行的Oracle PL/SQL中的數組

我心裏有什麼

  1. 使用光標通過DB讀
  2. 其符合特定判定基準進行的一組行的陣列
  3. 打印的
  4. 排序店行使用dbms_output.put_line的行數組中的項目
+5

在PL/SQL數組中過濾和排序數據的原因是什麼?爲什麼不在初始SQL語句中使用WHERE和ORDER BY子句?這是你嘗試實施的一種反模式。 – Codo 2011-04-01 13:58:17

+0

在客戶端進行排序的大型系統中,現實生活中有解決方案。原因是從數據庫中獲取負載。但在這種情況下,它是在數據庫方面完成的,所以我猜這種方式對執行計劃影響很大。 – 2011-04-02 06:41:59

回答

7

請看PL/SQL Collections。您可以創建一個PL/SQL記錄的集合,其中記錄被定義爲表的%ROWTYPE。然後你加載該表&對其執行操作。

例如:

DECLARE 
CURSOR emp_cursor IS 
SELECT employee_id, employee_name from employees; 

TYPE employeeArrayType IS TABLE OF a_cur%ROWTYPE; 
employeeArray employeeArrayType; 

BEGIN 
    OPEN emp_cursor; 
    LOOP 
    FETCH emp_cursor BULK COLLECT INTO employeeArray LIMIT 100; 
    EXIT WHEN emp_cursor%NOTFOUND; 
    END LOOP; 
    CLOSE emp_cursor; 

    -- Now you can do work with employeeArray 
END; 

代碼聲明我的光標和收集,然後加載使用FETCH..BULK在一個循環中(這是可取的大量數據)收集過程的集合。

但是,Codo的評論適用於此 - 如果您將數據篩選和排序爲SQL查詢的WHERE子句& ORDER BY子句,則會更容易。當你擁有一個數據庫引擎時,並不是很多情況下用程序語言來做集合操作會更好。一些ETL過程可能需要它,但對於您的問題,我真的會建議您在SQL中完成工作,然後使用最終結果集。

這就是說,排序PL/SQL記錄集合並不像想象的那麼容易。有關集合分類方法的概述,請參閱AMIS technology blog(和第2部分的here)。