首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PL/SQL 模擬陣列實戰:單維與多維集合 TYPE 定義與遍歷範例

     編輯:Oracle 資料庫相關知識

核心概念

PL/SQL 無原生陣列,但提供 關聯式陣列 (Associative Array,舊稱 Index-by Table) 以 INDEX BY BINARY_INTEGER 實現鍵值映射,配合 RECORD 類型可構建多維結構。

單維陣列範例

DECLARE
  TYPE emp_ssn_array IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  best_employees  emp_ssn_array;
  worst_employees emp_ssn_array;
BEGIN
  best_employees(1)  := 123456;
  best_employees(2)  := 888888;
  worst_employees(1) := 222222;
  worst_employees(2) := 666666;

  FOR i IN 1..best_employees.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE('i=' || i ||
      ', best_employees=' || best_employees(i) ||
      ', worst_employees=' || worst_employees(i));
  END LOOP;
END;
/*
輸出:
i=1, best_employees=123456, worst_employees=222222
i=2, best_employees=888888, worst_employees=666666
*/

多維陣列範例(RECORD + TABLE OF)

DECLARE
  TYPE emp_type IS RECORD (
    emp_id   employee_table.emp_id%TYPE,
    emp_name employee_table.emp_name%TYPE,
    emp_gender employee_table.emp_gender%TYPE
  );
  TYPE emp_type_array IS TABLE OF emp_type INDEX BY BINARY_INTEGER;
  emp_rec_array emp_type_array;
  emp_rec       emp_type;
BEGIN
  emp_rec.emp_id   := 300000000;
  emp_rec.emp_name := 'Barbara';
  emp_rec.emp_gender := 'Female';
  emp_rec_array(1) := emp_rec;

  emp_rec.emp_id   := 300000008;
  emp_rec.emp_name := 'Rick';
  emp_rec.emp_gender := 'Male';
  emp_rec_array(2) := emp_rec;

  FOR i IN 1..emp_rec_array.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE('i=' || i ||
      ', emp_id=' || emp_rec_array(i).emp_id ||
      ', emp_name=' || emp_rec_array(i).emp_name ||
      ', emp_gender=' || emp_rec_array(i).emp_gender);
  END LOOP;
END;
/*
輸出:
i=1, emp_id=300000000, emp_name=Barbara, emp_gender=Female
i=2, emp_id=300000008, emp_name=Rick, emp_gender=Male
*/

關鍵屬性與方法

屬性/方法說明
.COUNT當前元素個數
.FIRST / .LAST最小/最大索引值
.PRIOR(n) / .NEXT(n)索引 n 的前一個/後一個索引
.EXISTS(n)索引 n 是否存在(避免 NO_DATA_FOUND)
.DELETE / .DELETE(n) / .DELETE(m,n)刪除全部/單個/範圍元素

遷移建議

  • Oracle 10g+ 推薦使用 VARRAY(定長)或 NESTED TABLE(變長)作為 Schema 級集合類型,可直接存入表列、跨會話傳遞。
  • PL/SQL 邏輯內部臨時集合,繼續使用關聯式陣列性能最優(無上下文切換)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved