程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> Oracle復合數據類型(2)

Oracle復合數據類型(2)

編輯:關於Oracle數據庫

使用記錄

  用戶可以給記錄賦值、將值傳遞給其他程序。記錄作為一種復合數據結構意味作他有兩個層次可用。用戶可以引用整個記錄,使用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手冊。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved