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

Oracle 關聯陣列完整指南:定義語法、數值/字串索引、BULK COLLECT/FORALL 批次處理、10g 新特性與跨字符集陷阱

     編輯:Oracle 資料庫相關知識

關聯陣列核心特性

  • 舊稱 PL/SQL 表,僅供程式設計結構體使用,不可用於 SQL 表
  • 無需初始化、無建構函數、無需預先分配空間、無需 EXTEND
  • 索引支援:任意整數(正/負/零)、10g+ 支援唯一變長字串(VARCHAR2/STRING/LONG)
  • 可顯式轉換 %ROWTYPE/記錄類型/物件類型
  • FORALL/BULK COLLECT 批次處理核心依賴關聯陣列
  • 全球化設定(NLS_COMP/NLS_SORT)下字串索引需特殊處理

1. 定義語法兩種形式

-- 形式一
CREATE OR REPLACE TYPE type_name
AS TABLE OF element_type [NOT NULL]
INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(size)];

-- 形式二
CREATE OR REPLACE TYPE type_name
AS TABLE OF element_type [NOT NULL]
INDEX BY key_type;  -- key_type 可為 VARCHAR2/STRING/LONG

PLS_INTEGER/BINARY_INTEGER 為無限制數值類型,對應 C/C++/C#/Java 呼叫規範。VARCHAR2 最大 4000 字元。

2. 初始化與索引陷阱

數值索引範例

將 VARRAY 內容轉移至關聯陣列,FOR i IN month.FIRST..month.LAST 迴圈賦值,calendar(i) := '' 分配空間再賦值。

字串索引陷阱與解法

字串索引時,第二層迴圈計數器 i 為 PLS_INTEGER,無法直接遍歷字串索引。解法:使用集合 API FIRST/NEXT 方法:

current := calendar.FIRST;
element := calendar(current);
-- 後續迴圈
current := calendar.NEXT(current);
element := calendar(current);

3. BULK COLLECT / FORALL 批次處理實戰

-- 批次插入百萬筆
FOR i IN 1..10000 LOOP
  number_list(i) := i;
END LOOP;
FORALL i IN 1..number_list.COUNT
  INSERT INTO bulk_numbers VALUES (number_list(i));
COMMIT;

-- 批次查回關聯陣列
SELECT number_id BULK COLLECT INTO number_list FROM bulk_numbers;
-- 列印首尾各兩筆驗證

BULK COLLECT 消除行級處理,減少 PL/SQL 與 SQL 引擎上下文切換;FORALL 批次發送 DML。ORDER BY 確保結果有序,否則隨機順序。

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