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

Oracle 複合資料類型(二):記錄型別完整操作指南——引用、賦值、SELECT INTO、FETCH、限制與比較

     編輯:Oracle 資料庫相關知識

記錄兩大操作層面

  • 整體操作:SELECT INTO、FETCH、整體指派 rec2 := rec1、傳遞給子程式。
  • 欄位操作:rec.field := value、布林運算、單欄位傳遞。

欄位引用語法

DECLARE
  TYPE detail_rec IS RECORD (
    quote   stock_quote_rec,
    ts      DATE,
    bid_sz  NUMBER,
    ask_sz  NUMBER
  );
  r_detail detail_rec;
BEGIN
  r_detail.bid_sz := 1000;
  r_detail.quote.volume := 156700;  -- 多層記錄用點串聯
  log_quote(r_detail.quote);        -- 傳遞子記錄
END;

四種賦值方式

1. SELECT INTO

SELECT symbol, exchange INTO r_stock.symbol, r_stock.exchange FROM stocks WHERE symbol='ORCL';
SELECT * INTO r_stock2 FROM stocks WHERE symbol='ORCL';  -- 欄位順序對應

2. FETCH 遊標

CURSOR c_stock(p_sym VARCHAR2) IS SELECT symbol, exchange, begin_date FROM stock WHERE symbol=UPPER(p_sym);
r_stock c_stock%ROWTYPE;
OPEN c_stock('ORCL');
FETCH c_stock INTO r_stock;

3. 整體指派 (同型別)

TYPE rec_a IS RECORD (a NUMBER, b VARCHAR2(10));
TYPE rec_b IS RECORD (a NUMBER, b VARCHAR2(10));  -- 雖結構相同但型別不同
r1 rec_a; r2 rec_a; r3 rec_b;
r2 := r1;   -- 正確
-- r3 := r1; -- 編譯錯誤:型別不符
r3.a := r1.a; r3.b := r1.b;  -- 必須逐欄位指派

4. 逐欄位指派

r_rec.field1 := val1; r_rec.field2 := val2; ...

重要限制

  • 不可直接用於 INSERT:INSERT INTO table VALUES (rec) 會報錯。
  • 不可直接比較:IF rec1 > rec2 不支援。
  • 解決比較需求:
    ① 自寫函數回傳標量比較 IF sort(rec1) > sort(rec2)
    ② 使用物件型別定義 ORDER 或 MAP 方法。

%ROWTYPE 陷阱提醒

考試常以 %ROWTYPE 變數直接用於 INSERT 或比較作為干擾項,請牢記:記錄型別不可直接用於 DML 與比較運算。

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