PL/SQL集合
集合與其他語言中的數組相似,在ORACLE7.3及以前的版本中只有一種集合稱為PL/SQL表,這種類型的集合依然保留,就是索引(INDEX_BY)表,與記錄相似,集合在定義的時候必須使用TYPE語句,然後才是創建和使用這種類型的變量。
集合的類型
PL/SQL有三種類型的集合
. Index_by表
. 嵌套表
. VARRAY
這三種類型的集合之間由許多差異,包括數據綁定、稀疏性(sparsity)、數據庫中的存儲能力都不相同。綁定涉及到集合中元素數量的限制,VARRAY集合中的元素的數量是有限,Index_by和嵌套表則是沒有限制的。稀疏性描述了集合的下標是否有間隔,Index_by表總是稀疏的,如果元素被刪除了嵌套表可以是稀疏的,但VARRAY類型的集合則是緊密的,它的下標之間沒有間隔。
Index_by表不能存儲在數據庫中,但嵌套表和VARRAY可以被存儲在數據庫中。
雖然這三種類型的集合有很多不同之處,但他們也由很多相似的地方:
. 都是一維的類似數組的結構
. 都有內建的方法
. 訪問由點分隔
Index_by表
Index_by表集合的定義語法如下:
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX
BY BINARY_INTERGET;
這裡面重要的關鍵字是INDEX BY BINARY_INTERGET,沒有這個關鍵字,那麼集合將是一個嵌套表,element_type可以是任何合法的PL/SQL數據類型,包括:PLS/INTEGER、SIGNTYPE、和BOOLEAN。其他的集合類型對數據庫的數據類型都有限制,但Index_by表不能存儲在數據庫中,所以沒有這些限制。
一旦定義了index_by表,就可以向創建其他變量那樣創建index_by表的變量:
DECLARE
TYPE symbol_tab_typ IS TABLE OF VARCHAR2(5) INDEX BY BINARY_INTEGER;
symbol_tab symbol_tab_typ;
BEGIN
嵌套表
嵌套表非常類似於Index_by表,創建的語法也非常相似。使用TYPE語句,只是沒有INDEX BY BINARY_INTEGER子串。
TYPE type_name IS TABLE OF element_type [NOT NULL]
NOT NULL選項要求集合所有的元素都要有值,element_type可以是一個記錄,但是這個記錄只能使用標量數據類型字段以及只用於數據庫的數據類型(不能是PLS_INTEGER,BOOLEAN或SIGNTYPE)。
嵌套表和VARRAY都能作為列存儲在數據庫表中,所以集合自身而不是單個的元素可以為NULL,ORACLE稱這種整個集合為NULL的為"自動設置為NULL(atomically NULL)"以區別元素為NULL的情況。當集合為NULL時,即使不會產生異常,用戶也不能引用集合中的元素。用戶可以使用IS NULL操作符檢測集合是否為NULL。
存儲在一個數據庫中的嵌套表並不與表中的其它數據存放在同一個數據塊中,它們實際上被存放在第二個表中。正如沒有order by子句select語句不能保證返回任何有順序的數據,從數據庫中取回的嵌套表也不保證元素的順序。由於集合數據是離線存儲的,對於大型集合嵌套表是一個不錯的選擇。
VARRAY
VARRAY或數據變量都有元素的限制。想起他集合一樣VARRAY定義仍然使用TYPE語句,但關鍵字VARRAY或VARRYING ARRAY告訴ORACLE這是一個VARRAY集合。
TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF
element_type [NOT NULL]
max_size是一個整數,用於標示VARRAY集合擁有的最多元素數目。VARRAY集合的元素數量可以低於max_size,但不能超過max_size。element_type是一維元素的數據類型,如果element_type是記錄,那麼這個記錄只能使用標量數據字段(與嵌套標相似)。NOT NULL子串表示集合中的每一個元素都必須有值。
與嵌套表相似,VARRAY能夠自動為NULL,可以使用IS NULL操作符進行檢測。與嵌套表不同的是,當VARRAY存儲在數據庫中時與表中的其他數據存放在同一個數據塊中。正象列的排序保存在表的SELECT*中一樣元素的順序保存在VARRAY中。同樣由於集合是在線存儲的,VARRAY很適合於小型集合。