記錄型別定義兩種方式
1. 顯式定義 (TYPE ... IS RECORD)
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'
);
r_quote stock_quote_rec; -- 宣告變數
BEGIN ... END;
- 欄位定義:
field_name data_type [NOT NULL] [:=|DEFAULT expr]
- 欄位可為標量、記錄、%TYPE 參考資料庫欄位型別。
- 使用
%TYPE 參考資料庫欄位,編譯期自動同步型別與長度,維護性最佳。
2. 隱式定義 (%ROWTYPE)
DECLARE
acct_rec accounts%ROWTYPE; -- 參考資料表/視圖
CURSOR c_txn(p_acct VARCHAR2) IS SELECT action, ts, holding FROM portfolios WHERE account_nbr=p_acct;
txn_rec c_txn%ROWTYPE; -- 參考游標
BEGIN ... END;
- 無需列出欄位,自動對應資料表/游標結構。
- 若資料表結構變更,重新編譯即自動同步,極具彈性。
- 游標 FOR 迴圈、觸發器
:OLD/:NEW 隱含使用 %ROWTYPE。
隱式定義實戰範例
DECLARE
CURSOR c_txn IS SELECT action, ts, holding FROM portfolios WHERE account_nbr='37';
BEGIN
FOR r_txn IN c_txn LOOP
IF r_txn.holding = 'ORCL' THEN notify_shareholder; END IF;
END LOOP;
END;
選擇建議
| 場景 | 建議方式 |
| 需自訂欄位、預設值、NOT NULL、多層記錄 | 顯式 TYPE IS RECORD |
| 直接對應資料表/視圖/游標結構,追求維護彈性 | 隱式 %ROWTYPE |
| 觸發器、游標 FOR 迴圈 | 隱式 (系統自動) |