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

PL/SQL 複合資料類型全解析:Record (記錄) 與 Collection (集合) 定義、用法與進階技巧

     編輯:關於SqlServer

概述

PL/SQL 提供兩大複合資料結構:Record (記錄) — 由不同欄位組成,對應資料表列;Collection (集合) — 由同類型元素組成,對應陣列/清單。本文聚焦 Record 類型的定義、使用與最佳實務。

Record 類型定義方式

1. 顯式定義 (Explicit Declaration)

在宣告區塊先定義 TYPE,再宣告變數。

DECLARE
    TYPE stock_quote_rec IS RECORD (
        symbol     stock.symbol%TYPE,      -- 參考資料表欄位型別
        bid        NUMBER(10,4),
        ask        NUMBER(10,4),
        volume     NUMBER NOT NULL := 0,   -- 可加約束與預設值
        exchange   VARCHAR2(6) DEFAULT 'NASDAQ'
    );
    real_time_quote stock_quote_rec;       -- 宣告變數
BEGIN
    real_time_quote.symbol := 'ORCL';
    real_time_quote.bid := 45.50;
    -- ...
END;

%TYPE 屬性:自動繫結資料表欄位型別與大小,結構變更時自動同步,提升維護性。

2. 隱式定義 (%ROWTYPE)

直接依資料表、檢視表、游標結構定義記錄,無需列舉欄位。

DECLARE
    account_info   accounts%ROWTYPE;           -- 對應 accounts 資料表結構
    CURSOR txn_cur (acct_no VARCHAR2) IS
        SELECT action, timestamp, holding FROM portfolios WHERE account_nbr = acct_no;
    txn_info       txn_cur%ROWTYPE;            -- 對應游標結果結構
BEGIN
    SELECT * INTO account_info FROM accounts WHERE id = 123;
    -- account_info 現在包含整列資料
END;

游標 FOR 迴圈、觸發器 :OLD/:NEW 亦隱式使用 %ROWTYPE。

Record 使用技巧

  • 整體指派: rec1 := rec2; (結構相容時) 或 SELECT * INTO rec FROM ...
  • 傳遞參數: 程序/函數參數可為 Record 類型,封裝多欄位資料。
  • 欄位存取: rec.field_name 點號語法。
  • 動態 SQL 搭配: EXECUTE IMMEDIATE ... USING rec (需支援)。

進階應用:巢狀 Record 與集合整合

TYPE address_rec IS RECORD (street VARCHAR2(50), city VARCHAR2(30), zip VARCHAR2(10));
TYPE emp_rec IS RECORD (id NUMBER, name VARCHAR2(30), addr address_rec);  -- 巢狀記錄

TYPE emp_tab IS TABLE OF emp_rec INDEX BY BINARY_INTEGER;  -- 關聯陣列 (集合)
emp_list emp_tab;

最佳實務建議

  1. 優先使用 %ROWTYPE 對應資料表/游標,減少硬編碼型別。
  2. 需自訂結構或加約束/預設值時,使用 顯式 TYPE IS RECORD。
  3. 避免在 SQL 陳述式中直接使用 Record 變數 (部分版本不支援),改用個別欄位或集合。
  4. 大量資料處理時,考慮 BULK COLLECT INTO collection 而非逐筆 FETCH INTO Record。
  5. 文件化自訂 Record 類型結構,納入團隊程式碼規範。

結語

Record 是 PL/SQL 中表達「資料列」最自然的結構。善用 %TYPE/%ROWTYPE 實現與資料庫結構的強繫結,配合集合類型可構建高效能、可維護的批次處理邏輯。掌握顯式/隱式定義時機,是編寫健壯 PL/SQL 程式的關鍵基礎。

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