PL/SQL有两种复合数据结构:记录和集合。记录由不同的域组成,集合由不同的元素组成
复合数据类型必须在用来定义变量前被定义该类型;而简单数据类型直接就可以定义变量;
PL/SQL 记录
记录也可以看成表中的数据行,域则相当于表中的列
显式定义记录
TYPE record_type IS RECORD (field_definition_list);
隐式定义记录
隐式声明是在基于表的结构或查询上使用%TYPE属性,隐式声明是一个更强有力的工具,这是因为这种数据变量是动态创建的。
有一些PL/SQL指令在使用隐式定义记录时没有使用%ROWTYPE属性,比如游标FOR循环或触发器中的:old和:new记录
记录作为一种复合数据结构意味作他有两个层次可用
记录的一个字段的类型还可以是另一个记录类型;
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);
给记录赋值
1、 使用SELECT INTO
2、 使用FETCH
FETCH cursor_name INTO variable;
3. 使用赋值语句将整个记录复制给另一个记录是一项非常有用的技术,不过记录必须精确地被声明为相同的类型,不能是基于两个不同的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语句和将记录直接用于比较