PL/SQL 提供兩種複合資料結構:記錄 與 集合。記錄由不同欄位組成,類似 C 語言結構或資料表列;集合由同質元素組成,類似陣列。兩者使用前必須先定義類型,再宣告變數。
顯式定義: 在宣告區使用 TYPE ... IS RECORD 定義結構,再宣告變數。
TYPE record_type IS RECORD (
field_name data_type [NOT NULL] [:= | DEFAULT default_value]
);
範例:定義股票報價記錄,使用 %TYPE 參考資料庫欄位型別。
隱式定義: 使用 %ROWTYPE 直接依據資料表、視圖或游標結構定義記錄,無需逐一列出欄位。適用於游標 FOR 迴圈、觸發器 :OLD/:NEW 等場景。
欄位存取: 使用點號 record.field,支援巢狀記錄 record.nested_field.sub_field。
整體賦值方式:
SELECT INTO / FETCH INTO:將查詢結果直接載入記錄變數。rec2 := rec1,要求兩者類型完全相同(同一 TYPE 定義)。INSERT 陳述式:INSERT INTO table VALUES (record) 會報錯。IF rec1 > rec2 不合法。ORDER 或 MAP 方法。| 特性 | 索引表 | 巢狀表 | VARRAY |
|---|---|---|---|
| 下標型別 | BINARY_INTEGER / VARCHAR2 | 正整數 (從 1 開始) | 正整數 (從 1 開始) |
| 稀疏性 | 永遠稀疏 | 刪除元素後可稀疏 | 永遠緊密 |
| 元素數量限制 | 無上限 | 無上限 | 有上限 (max_size) |
| 資料庫儲存 | 不可 | 可 | 可 |
| 儲存方式 | 記憶體 | 獨立儲存表 | 與主表同一資料區塊 |
| 適用場景 | 中小型查找表、暫存資料 | 大型資料集、資料庫持久化 | 小型固定大小集合、順序重要 |
-- 索引表
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER | VARCHAR2(size);
-- 巢狀表
TYPE type_name IS TABLE OF element_type [NOT NULL];
-- VARRAY
TYPE type_name IS VARRAY(max_size) OF element_type [NOT NULL];
索引表: 首次指派元素即自動初始化。
巢狀表與 VARRAY: 必須使用建構函數 type_name(val1, val2, ...) 初始化,未初始化狀態為 NULL(原子性 NULL)。
元素存取: collection(subscript),巢狀表/VARRAY 下標從 1 開始且必須連續。
| 方法 | 說明 | 適用類型 |
|---|---|---|
| COUNT | 返回元素個數 | 全部 |
| DELETE / DELETE(n) / DELETE(m,n) | 刪除元素 | 巢狀表、索引表 |
| EXISTS(n) | 檢查元素是否存在 | 全部 |
| EXTEND / EXTEND(n) / EXTEND(n,v) | 擴展集合大小 | 巢狀表、VARRAY |
| FIRST / LAST | 首/尾元素下標 | 全部 |
| LIMIT | VARRAY 最大容量 | VARRAY |
| NEXT(n) / PRIOR(n) | 下一個/上一個元素下標 | 全部 |
| TRIM / TRIM(n) | 從尾端移除元素 | 巢狀表、VARRAY |
同樣不可直接比較,需透過自訂函數回傳標量值進行比較,但可比較集合內的單個元素。