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

PL/SQL 複合資料類型深度解析:記錄與集合的定義、操作與最佳實踐

     編輯:Oracle 資料庫基礎

PL/SQL 複合資料結構概述

PL/SQL 提供兩種複合資料結構:記錄 與 集合。記錄由不同欄位組成,類似 C 語言結構或資料表列;集合由同質元素組成,類似陣列。兩者使用前必須先定義類型,再宣告變數。

一、PL/SQL 記錄

1. 記錄的建立方式

顯式定義: 在宣告區使用 TYPE ... IS RECORD 定義結構,再宣告變數。

TYPE record_type IS RECORD (
  field_name data_type [NOT NULL] [:= | DEFAULT default_value]
);

範例:定義股票報價記錄,使用 %TYPE 參考資料庫欄位型別。

隱式定義: 使用 %ROWTYPE 直接依據資料表、視圖或游標結構定義記錄,無需逐一列出欄位。適用於游標 FOR 迴圈、觸發器 :OLD/:NEW 等場景。

2. 記錄的引用與賦值

欄位存取: 使用點號 record.field,支援巢狀記錄 record.nested_field.sub_field。

整體賦值方式:

  • SELECT INTO / FETCH INTO:將查詢結果直接載入記錄變數。
  • 記錄間直接賦值:rec2 := rec1,要求兩者類型完全相同(同一 TYPE 定義)。
  • 逐欄位賦值:針對類型不同但結構相似的記錄。

3. 記錄的限制與比較技巧

  • 不可直接用於 INSERT 陳述式:INSERT INTO table VALUES (record) 會報錯。
  • 不可直接比較:IF rec1 > rec2 不合法。
  • 解決方案:
    1. 設計函數回傳標量型別進行比較。
    2. 使用物件型別的 ORDER 或 MAP 方法。

二、PL/SQL 集合

1. 三種集合類型對比

特性索引表巢狀表VARRAY
下標型別BINARY_INTEGER / VARCHAR2正整數 (從 1 開始)正整數 (從 1 開始)
稀疏性永遠稀疏刪除元素後可稀疏永遠緊密
元素數量限制無上限無上限有上限 (max_size)
資料庫儲存不可可可
儲存方式記憶體獨立儲存表與主表同一資料區塊
適用場景中小型查找表、暫存資料大型資料集、資料庫持久化小型固定大小集合、順序重要

2. 集合定義語法

-- 索引表
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER | VARCHAR2(size);

-- 巢狀表
TYPE type_name IS TABLE OF element_type [NOT NULL];

-- VARRAY
TYPE type_name IS VARRAY(max_size) OF element_type [NOT NULL];

3. 集合初始化與操作

索引表: 首次指派元素即自動初始化。

巢狀表與 VARRAY: 必須使用建構函數 type_name(val1, val2, ...) 初始化,未初始化狀態為 NULL(原子性 NULL)。

元素存取: collection(subscript),巢狀表/VARRAY 下標從 1 開始且必須連續。

4. 集合內建方法

方法說明適用類型
COUNT返回元素個數全部
DELETE / DELETE(n) / DELETE(m,n)刪除元素巢狀表、索引表
EXISTS(n)檢查元素是否存在全部
EXTEND / EXTEND(n) / EXTEND(n,v)擴展集合大小巢狀表、VARRAY
FIRST / LAST首/尾元素下標全部
LIMITVARRAY 最大容量VARRAY
NEXT(n) / PRIOR(n)下一個/上一個元素下標全部
TRIM / TRIM(n)從尾端移除元素巢狀表、VARRAY

5. 集合比較

同樣不可直接比較,需透過自訂函數回傳標量值進行比較,但可比較集合內的單個元素。

實務建議

  • 需持久化至資料庫時選擇巢狀表或 VARRAY。
  • 大量資料、頻繁插刪選擇巢狀表;小型固定集合、須保持順序選擇 VARRAY。
  • 單純記憶體操作、查找表優先使用索引表。
  • 記錄與集合結合可構建多維資料結構(如記錄型集合)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved