本文內容
- 定義 Collection 類型
- 聲明 Collection 變數
- 初始化和引用 Collection
- 引用 Collection 元素
- 給 Collection 賦值
- 多維 Collection
- 比較 Collection
- Collection 方法
- Collection 異常
瞭解 Oracle 集合意義在於:當我們採用程式設計語言開發應用程式時,對其內建的集合類型,如數組、鏈表等,使用得很多,也很方便,但是當商務邏輯變得複雜時,如需要同時向多個表插入資料,和一個表插入多條資料,也許還需要事物控制,此時使用匿名子程式似乎很合適。那麼,在匿名子程式中使用集合類型就不可避免。
另外,若有一個用程式設計語言寫的函數,其涉及集合操作,出於某種必要的原因,想改寫成 Oracle 函數,那麼,對瞭解 Oracle 集合操作很有必要。
定義 Collection 類型
先定義 collection 類型,之後再聲明該類型的變數。
你可以在模式層級、包或 PL/SQL 塊內定義一個 collection 類型。
在模式層級建立的 collection 類型是 standalone stored type。用 CREATE TYPE 語句建立。它儲存在資料庫,直到用 DROP TYPE 語句刪除該類型。
在包內建立的 collection 類型是 packaged type。它儲存在資料庫,直到用 DROP PACKAGE 語句刪除包。
在 PL/SQL 塊建立的 collection 類型只在塊內可用,只有塊嵌入在 standalone 或 packaged subprogram 中它才儲存在資料庫。
collection 類型遵循與其他類型、變數一樣的範圍和執行個體化規則。當你輸入一個塊或子程式時,collection 被執行個體化,當退出時,銷毀。在一個包中,當初從引用包時,collection 被執行個體化,並在結束資料庫會話時,銷毀。
你可以在任何 PL/SQL 塊、子程式,或包的聲明部分,使用 TYPE 來定義 TABLE 和 VARRAY 類型。
對於在 PL/SQL 內聲明的 nested table 和 varray,table 或 varray 的元素類型可以是,除了 REF CURSOR 以外的任意 PL/SQL 資料類型。
當定義一個 VARRAY 類型時,必須用一個正整數指定最大大小。如下所示,定義一個能最多儲存 366 個日期的 VARRAY:
DECLARE
TYPE Calendar IS VARRAY(366) OF DATE;
associative arrays 可以用任意索引值插入元素。鍵不需要是連續的。鍵的資料類型可以是 PLS_INTEGER、VARCHAR2,或 VARCHAR2 子類型的一個:VARCHAR、STRING、或 LONG.
必須指定基於 VARCHAR2 鍵的長度,除了 LONG,因為,它等價於聲明一個 VARCHAR2(32760) 類型的鍵。類型 RAW、LONG RAW、ROWID、CHAR 和 CHARACTER 不允許做為一個 associative array 的鍵。LONG 和 LONG RAW 僅僅是為了向後相容。
不允許初始化子句。associative arrays 沒有構造標記。當使用基於 VARCHAR2 鍵來引用 associative arrays 中的一個元素時,你可以使用如 DATE 或 TIMESTAMP 等類型,只要該類型可以用 TO_CHAR 函數轉換成 VARCHAR2。
聲明 Collection 變數
定義一個 collection 類型後,用該型別宣告變數。在聲明中使用新類型名,同預定義類型一樣,如 NUMBER。
樣本 1:示範聲明 nested table、varray 和 associative array
DECLARE
TYPE nested_type IS TABLE OF VARCHAR2(30);
TYPE varray_type IS VARRAY(5) OF INTEGER;
TYPE assoc_array_num_type IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
TYPE assoc_array_str_type IS TABLE OF VARCHAR2(32) INDEX BY PLS_INTEGER;
TYPE assoc_array_str_type2 IS TABLE OF VARCHAR2(32) INDEX BY VARCHAR2(64);
v1 nested_type;
v2 varray_type;
v3 assoc_array_num_type;
v4 assoc_array_str_type;
v5 assoc_array_str_type2;
BEGIN
-- an arbitrary number of strings can be inserted v1
v1 := nested_type('Shipping', 'Sales', 'Finance', 'Payroll');
v2 := varray_type(1, 2, 3, 4, 5); -- Up to 5 integers
v3(99) := 10; -- Just start assigning to elements
v3(7) := 100; -- Subscripts can be any integer values
v4(42) := 'Smith'; -- Just start assigning to elements
v4(54) := 'Jones'; -- Subscripts can be any integer values
v5('Canada') := 'North America';
-- Just start assigning to elements
v5('Greece') := 'Europe';
-- Subscripts can be string values
END;
/