首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

PL/SQL 關聯陣列支援字串索引:簡化鍵值對操作技巧

     編輯:關於SqlServer

背景:從整數索引到字串索引

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)刪除指定索引元素

優缺點與限制

  • ✅ 優點:程式碼語意清晰、免去鍵值對應邏輯、稀疏儲存節省記憶體。
  • ⚠️ 限制:關聯陣列無法直接儲存於資料表欄位(需轉換為巢狀表或 VARRAY),僅適用於 PL/SQL 區塊內的暫時運算。
  • ⚠️ 索引長度:VARCHAR2(n) 的 n 需足夠容納最長鍵值,超長會拋出 VALUE_ERROR。

適用場景

  • 快取查詢結果(如:以員工工號為鍵暫存薪資計算中間值)
  • 動態統計分群(如:以產品分類代碼累加銷售額)
  • 參數化查詢條件組建(以欄位名為鍵存放條件值)

結語

善用 INDEX BY VARCHAR2 能讓 PL/SQL 程式碼更貼近業務語言,減少「魔術數字」與對應表維護成本,是現代化 PL/SQL 開發的基本功之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved