Oracle PL/SQL 的關聯陣列在 9i Release 2 之前,索引僅支援 BINARY_INTEGER(整數),這限制了其作為「雜湊表/字典」結構的直觀性。9i R2 引入 INDEX BY VARCHAR2,讓開發者能直接使用有意義的字串鍵值,程式碼可讀性大幅提升。
-- 舊版:整數索引
TYPE num_arr_t IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
-- 新版:字串索引(最高 20 字元,可依需求調整)
TYPE str_arr_t IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
DECLARE
TYPE region_sales_t IS TABLE OF NUMBER INDEX BY VARCHAR2(30);
v_sales region_sales_t;
v_region VARCHAR2(30);
v_total NUMBER := 0;
BEGIN
-- 直接用字串鍵累加
v_sales('North') := v_sales('North') + 1000;
v_sales('South') := v_sales('South') + 2500;
v_sales('East') := v_sales('East') + 1800;
v_sales('West') := v_sales('West') + 3200;
v_sales('Central') := v_sales('Central') + 900;
-- 遍歷所有鍵值
v_region := v_sales.FIRST;
WHILE v_region IS NOT NULL LOOP
v_total := v_total + v_sales(v_region);
DBMS_OUTPUT.PUT_LINE(v_region || ' : ' || v_sales(v_region));
v_region := v_sales.NEXT(v_region);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Grand Total: ' || v_total);
END;
/
| 方法 | 說明 |
|---|---|
.FIRST | 回傳最小索引值 |
.LAST | 回傳最大索引值 |
.NEXT(idx) | 回傳指定索引之後的下一個索引 |
.PRIOR(idx) | 回傳指定索引之前的前一個索引 |
.EXISTS(idx) | 檢查索引是否存在(避免 NO_DATA_FOUND) |
.COUNT | 回傳元素總數 |
.DELETE(idx) | 刪除指定索引元素 |
VARCHAR2(n) 的 n 需足夠容納最長鍵值,超長會拋出 VALUE_ERROR。善用 INDEX BY VARCHAR2 能讓 PL/SQL 程式碼更貼近業務語言,減少「魔術數字」與對應表維護成本,是現代化 PL/SQL 開發的基本功之一。