本文介紹了集合類型的概述及使用限制等內容。
PL/SQL擁有三種集合類型:變長數組(varray,variable-size array),巢狀表格(nested table)和關聯陣列(associative array)。它們可以被聲明在全域、包或者PL/SQL塊裡,並擁有一系列獨特的用法。例如,您可以使用集合類型建構函式初始化變長數組和巢狀表格,使用集合方法對集合進行擴容、縮容或查詢,對集合進行取值和賦值,以及使用集合與表進行互動。
以上三種集合類型的區別如下:
集合類型 | 元素個數 | 索引(下標)類型 | 未初始化的狀態 | 定義位置 |
變長數組 | 需要指定 | 正整數 | NULL | PL/SQL、全域或包 |
巢狀表格 | 不需要指定 | 正整數 | NULL | PL/SQL、全域或包 |
關聯陣列 | 不需要指定 | 正整數或字串 | 空 | PL/SQL或包 |
元素個數
如果指定了元素數量,則該數字為集合中元素的最大數量。如果不指定元素數量,則集合中的最大元素數量為索引類型的上限。
索引(下標)類型
通過索引來具體擷取集合類型特定位置上的元素。
未初始化的狀態
集合類型有三種狀態:NULL、空以及存在元素的狀態。對於變長數組和巢狀表格來說,它們可能存在這三種狀態的其中之一。當變長陣列變數或是巢狀表格變數被聲明但沒有初始化時,該變數的狀態為NULL,表示該集合不存在。如果此時想要通過某個索引擷取其中的值,會顯示這是一個不存在的集合。您可以通過建構函式的方式對其初始化,此時轉變為空白狀態,代表該集合存在但不包含任何元素。如果此時想要通過某個索引擷取其中的值,會顯示不存在該元素。對於關聯陣列來說,聲明關聯陣列變數時會預設將其初始化為空白,因此不存在NULL的狀態。
定義位置
在PL/SQL塊中定義的集合類型是局部類型。它僅在塊中可用,並且僅當塊在子程式中才會儲存在資料庫裡。在全域或是包中定義的集合類型會直接儲存在資料庫的系統資料表中,直至您通過DROP TYPE或DROP PACKAGE才能刪除。
使用限制
不支援關聯陣列初始化構造器。
不支援限定運算式和迭代器的構造形式。
不支援多維集合類型或是集合類型與記錄類型的多層嵌套使用。
不支援
MULTISET相關的操作。當您使用
delete刪除集合變數的元素但保留預留位置時,請不要使用該集合變數與表進行操作,以免出現非預期的結果。集合變數可以使用
IS [NOT] NULL來判斷是否為NULL。但在集合變數之間使用=、<、>來進行相等性或不等性比較時,返回的結果是無意義的。