Oracle复合数据类型(2)

张佳媛ok

张佳媛ok

2016-02-19 21:13

下面是个简单易学的Oracle复合数据类型(2)教程,图老师小编详细图解介绍包你轻松学会,喜欢的朋友赶紧get起来吧!

使用记录

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  用户可以给记录赋值、将值传递给其他程序。记录作为一种复合数据结构意味作他有两个层次可用。用户可以引用整个记录,使用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中列的位置相对应。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  例:

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_rec1stock_rec2 THEN

  要特别注意考试中试题中有可能用%ROWTYPE来欺骗你,但这是错误的,记住这一点。还有可能会出现用记录排序的情况,ORACLE不支持记录之间的直接比较。对于记录比较,可以采用下面的两个选择:

  . 设计一个函数,该函数返回scalar数据类型,使用这个函数比较记录,如

IF sort_rec(stock_one)sort_rec(stock_two) THEN

  . 可以使用数据库对象,数据库对象可以使用order或map方法定义,允许oracle对复合数据类型进行比较。关于数据库对象的讨论已经超越了本文的范围,要详细了解数据库对象,可以查阅oracle手册。

展开更多 50%)
分享

猜你喜欢

Oracle复合数据类型(2)

编程语言 网络编程
Oracle复合数据类型(2)

Oracle复合数据类型(4)

编程语言 网络编程
Oracle复合数据类型(4)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Oracle复合数据类型(1)

编程语言 网络编程
Oracle复合数据类型(1)

Oracle复合数据类型(3)

编程语言 网络编程
Oracle复合数据类型(3)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Oracle与DB2数据类型分类对应说明

编程语言 网络编程
Oracle与DB2数据类型分类对应说明

Oracle 9i的数据类型

编程语言 网络编程
Oracle 9i的数据类型

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

小情绪伤感分组设计_光影流年辗转间谁忘了谁

小情绪伤感分组设计_光影流年辗转间谁忘了谁

我想我可以忘记你

我想我可以忘记你
下拉加载更多内容 ↓