PL/SQL 提供兩大複合資料結構:Record (記錄) — 由不同欄位組成,對應資料表列;Collection (集合) — 由同類型元素組成,對應陣列/清單。本文聚焦 Record 類型的定義、使用與最佳實務。
在宣告區塊先定義 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 屬性:自動繫結資料表欄位型別與大小,結構變更時自動同步,提升維護性。
直接依資料表、檢視表、游標結構定義記錄,無需列舉欄位。
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。
rec1 := rec2; (結構相容時) 或 SELECT * INTO rec FROM ...rec.field_name 點號語法。EXECUTE IMMEDIATE ... USING rec (需支援)。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;
Record 是 PL/SQL 中表達「資料列」最自然的結構。善用 %TYPE/%ROWTYPE 實現與資料庫結構的強繫結,配合集合類型可構建高效能、可維護的批次處理邏輯。掌握顯式/隱式定義時機,是編寫健壯 PL/SQL 程式的關鍵基礎。