Oracle復合數據類型(2)
2024-08-29 13:36:00
供稿:網友
 
             
  使用記錄
  
  用戶可以給記錄賦值、將值傳遞給其他程序。記錄作為一種復合數據結構意味作他有兩個層次可用。用戶可以引用整個記錄,使用select into或fetch轉移所有域,也可以將整個記錄傳遞給一個程序或將所有域的值賦給另一個記錄。                                                                                            在更低的層次,用戶可以處理記錄內單獨的域,用戶可以給單獨的域賦值或者在單獨的域上運行布爾表達式,也可以將一個或更多的域傳遞給另一個程序。
  
  引用記錄
  
  記錄由域組成,訪問記錄中的域使用點(.)符號。我們使用上面的例子看看
  
  DELCARE
  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'
  );
  
  TYPE detailed_quote_rec IS RECORD
  (quote stock_quote_rec
  ,timestamp date
  ,bid_size NUMBER
  ,ask.size NUMBER
  ,last_tick VARCHAR2(4)
  );
  
  real_time_detail detail_quote_rec;
  
  BEGIN
  
  real_time_detail.bid_size:=1000;
  real_time_detail.quote.volume:=156700;
  log_quote(real_time_detail.quote);
  
  給記錄賦值
  
  給記錄或記錄中的域賦值的方法有幾種,可以使用SELECT INTO或FETCH給整個記錄或單獨的域賦值, 可以將整個記錄的值賦給其他記錄,也可以通過給每個域賦值來得到記錄,以下我們通過實例講解每一種賦值方法。
  
  1、使用SELECT INTO
  
  使用SELECT INTO給記錄賦值要將記錄或域放在INTO子串中,INTO子串中的變量與SELECT中列的位置相對應。
  
  例:
  
  DECLARE
  
  stock_info1 stocks%ROWTYPE;
  stock_info2 stocks%ROWTYPE;
  
  BEGIN
  
  SELECT symbol,exchange
  INTO stock_info1.symbol,stock_info1.exchange
  FROM stocks
  WHERE symbol='ORCL';
  
  SELECT * INTO stock_info2 FROM stocks
  WHERE symbol='ORCL';
  
  2、使用FETCH
  
  假如SQL語句返回多行數據或者希望使用帶參數的游標,那么就要使用游標,這種情況下使用FETCH語句代替INSTEAD INTO是一個更簡單、更有效率的方法,但在安全性較高的包中FETCH的語法如下:
  
  FETCH cursor_name INTO variable;
  
  我們改寫上面的例子:
  
  DECLARE
  CURSOR stock_cur(symbol_in VARCHAR2) IS
  SELECT symbol,exchange,begin_date
  FROM stock
  WHERE symbol=UPPER(symbol_in);
  
  stock_info stock_cur%ROWTYPE
  
  BEGIN
  OPEN stock_cur('ORCL');
  FETCH stock_cur INTO stock_info;
  
  使用賦值語句將整個記錄復制給另一個記錄是一項非常有用的技術,不過記錄必須精確地被聲明為相同的類型,不能是基于兩個不同的TYPE語句來獲得相同的結構。
  
  例:
  
  DECLARE
  
  TYPE stock_quote_rec IS RECORD
  (symbol stocks.symbol%TYPE
  ,bid NUMBER(10,4)
  ,ask number(10,4)
  ,volume NUMBER
  );
  
  TYPE stock_quote_too IS RECORD
  (symbol stocks.symbol%TYPE
  ,bid NUMBER(10,4)
  ,ask number(10,4)
  ,volume NUMBER
  );
  --這兩個記錄看上去是一樣的,但實際上是不一樣的
  stock_one stocks_quote_rec;
  stock_two stocks_quote_rec;
  --這兩個域有相同的數據類型和大小
  
  stock_also stock_rec_too;--與stock_quote_rec是不同的數據類型
  BEGIN
  stock_one.symbol:='orcl';
  stock_one.volume:=1234500;
  stock_two:=stock_one;--正確
  syock_also:=stock_one;--錯誤,數據類型錯誤
  
  stock_also.symbol:=stock_one.symbol;
  stock_also.volume:=stock_one.volume;
  
  記錄不能用于INSERT語句和將記錄直接用于比較,下面兩種情況是錯誤的:
  
  INSERT INTO stocks VALUES (stock_record);
  
  和
  
  IF stock_rec1>stock_rec2 THEN
  
  要非凡注重考試中試題中有可能用%ROWTYPE來欺騙你,但這是錯誤的,記住這一點。
                         還有可能會出現用記錄排序的情況,Oracle不支持記錄之間的直接比較。對于記錄比較,可以采用下面的兩個選擇:
  
  . 設計一個函數,該函數返回scalar數據類型,使用這個函數比較記錄,如
  
  IF sort_rec(stock_one)>sort_rec(stock_two) THEN
  
  . 可以使用數據庫對象,數據庫對象可以使用order或map方法定義,答應oracle對復合數據類型進行比較。關于數據庫對象的討論已經超越了本文的范圍,要具體了解數據庫對象,可以查閱oracle手冊。