PL/SQL 提供三種集合:Associative Array (索引表)、Nested Table (巢狀表)、VARRAY (可變長度陣列)。本文聚焦 VARRAY——唯一具備**最大長度限制**且**保持插入順序**的集合,適合「固定上限、順序敏感」場景(如電話號碼清單、標籤陣列)。
DECLARE
-- 1. 定義型別:最多 10 個元素,每元素 VARCHAR2(20)
TYPE v_array IS VARRAY(10) OF VARCHAR2(20);
-- 2. 宣告變數
my_array v_array;
BEGIN
-- 3. 建構函數初始化 (3 個元素)
my_array := v_array('你', '我', '他');
-- 4. 修改指定索引 (1-based)
my_array(2) := '呵呵呵';
-- 5. 輸出驗證
DBMS_OUTPUT.PUT_LINE(my_array(2)); -- 輸出: 呵呵呵
-- 6. 追加元素 (EXTEND)
my_array.EXTEND;
my_array(4) := '新增';
-- 7. 遍歷
FOR i IN 1..my_array.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(i || ':' || my_array(i));
END LOOP;
END;
/
-- 輸出:
-- 呵呵呵
-- 1:你
-- 2:呵呵呵
-- 3:他
-- 4:新增
| 方法/屬性 | 說明 | 範例 |
|---|---|---|
COUNT | 目前元素個數 | my_array.COUNT |
LIMIT | 最大容量 (定義時指定) | my_array.LIMIT → 10 |
EXTEND(n) | 增加 n 個 Null 元素 (預設 1) | my_array.EXTEND(2) |
TRIM(n) | 移除尾端 n 個元素 (預設 1) | my_array.TRIM |
DELETE(i) | **VARRAY 不支援** (僅 Nested Table) | — |
EXISTS(i) | 索引 i 是否存在 | my_array.EXISTS(3) |
FIRST/LAST | 第一/最後索引 (皆為 1/COUNT) | my_array.FIRST |
PRIOR/NEXT(i) | 前一/後一索引 | my_array.NEXT(2) |
| 特性 | Associative Array | Nested Table | VARRAY |
|---|---|---|---|
| 索引型別 | PLS_INTEGER / VARCHAR2 | 正整數 (1-based) | 正整數 (1-based) |
| 最大長度 | 無上限 | 無上限 | 有上限 (LIMIT) |
| 儲存於資料庫 | 否 (僅 PL/SQL 記憶體) | 是 (可建立欄位) | 是 (可建立欄位) |
| 順序保證 | 無 (雜湊) | 無 (集合) | 有 (插入順序) |
| 稀疏性 | 支援 | 支援 (DELETE 後) | 不支援 (緊湊) |
| 適用場景 | 快取、查找表 | 資料庫欄位、大量資料 | 固定上限清單、有序標籤 |
CREATE TYPE phone_varray AS VARRAY(5) OF VARCHAR2(20);
/
CREATE TABLE customer (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
phones phone_varray
);
INSERT INTO customer VALUES (1, '張三', phone_varray('0912-345678', '02-23456789'));
SELECT c.phones(1) FROM customer c WHERE id = 1; -- 取第一支電話
VARRAY = **有序、定長、不可稀疏** 的集合。記住:EXTEND 才能增長、TRIM 才能縮減、**無 DELETE**、索引從 1 起算。若需無上限或稀疏操作,改用 Nested Table;若需負索引/字串索引,用 Associative Array。