使用集合
象记录一样集合可以在两个层面上使用
操作整个集合
访问集合中的单个元素
第一种情况使用集合名第二种情况使用下标
collection(subscript)
index_by表的下标是两为的整数可以为正也可以为负范围是嵌套表和VARRAY表示元素在集合中的位置用户很难灵活设计下标这是因为
嵌套表开始是紧密的(相对于疏松)
VARRAY始终保持紧密
这两种集合的下标都由开始
初始化删除引用集合
使用集合之前必须要初始化对于Index_by表初始化是自动进行的但是对于嵌套表和VARRAY就必须使用内建的构造函数如果重新调用嵌套表和VARRAY自动置NULL这不只是元素置NULL而是整个集合置NULL给集合内的元素赋值需要使用下标符号将一个集合的值赋给另一个集合只需要简单的使用赋值操作符
Index_by集合初始化是最简单的只要涉及其中的一个元素集合就被初始化了
例
DECLARE
TYPE symbol_tab_typ IS TABLE OF VARCHAR() INDEX BY BINARY_INTEGER;
TYPE account_tab_typ IS TABLE OF account%ROWTYPE INDEX BY BINARY_INTEGER;
symbol_tab symbol_tab_typ;
account_tab account_tab_typ;
new_acct_tab account_tab_typ;
BEGIN
初始化集合元素和
SELECT * INTO account_tab()
FROM accounts WHERE account_nbr=;
SELECT * INTO account_tab()
FROM accounts WHERE account_nbr=;
IF account_tab()balance< THEN
chang_maintenance_fee();
END IF
new_acct_tab:=account_tab;
symbol_tab():=ORCL;
symbol_tab():=CSCO;
symbol_tab():=SUNM;
publish_portfolio(symbol_tab);
嵌套表和VARRAY由构造函数初始化构造函数和集合的名字相同同时有一组参数每个参数对应一个元素如果参数为NULL那么对应的元素就被初始化为NULL如果创建了元素但没有填充数据那么元素将保持null值可以被引用但不能保持数据如果元素没有初始化那么就不能引用该元素
例
DECLARE
TYPE stock_list IS TABLE OF stocksymbol%TYPE;
TYPE top_list IS VARRAY () OF stockssymbol%TYPE;
biotech_stocks stock_list;
tech_ top_list;
BEGIN
非法集合未初始化
biotech_stocks():=AMGN;
IF biotech_stocks IS NULL THEN
初始化集合
biotech_stocks=(AMGNBGENIMCLGERNCRA);
END IF;
tech_:=top_list(ORCLCSCOMSFTINTCSUNWIBMNULLNULL);
IF tech_() IS NULL THEN
tech_():=CPQ;
END
tech_():=DELL;
在这个例子中嵌套表BIOTECH_STOCKS初始化有个元素VARRAY tech_集合最多能有 个元素但构造函数只创建了个元素其中还有两个元素是NULL值并程序中给他们赋值
初始化基于记录的集合就必须将记录传递给构造函数注意不能只是简单的将记录的域传递给构造函数
例
DECLARE
TYPE stock_quote_rec IS RECORD
(symbol stocksymbol%TYPE
bid NUMBER()
ask NUMBER()
volume NUMBER NOT NULL:=
);
TYPE stock_tab_typ IS TABLE OF stock_quote_rec;
quote_list stock_tab_typ;
single_quote stock_quote_rec;
BEGIN
single_quotesymbol:=OPCL;
single_quotebid:=;
single_quoteask:=;
single_quotevolume:=;
合法
quote_list:=stock_tab_typ(single_quote);
不合法
quote_list:=stock_tab_typ(CSCO);
DBMS_OUTPUTLINE(quote_list()bid);