Oracle 9i支持三種集合數(shù)據(jù)類型:index-by 表,Varrays(可變數(shù)組)和嵌套表
Varrays 由其元素的最大數(shù)目限定的單維有限數(shù)組,可以改變varrays數(shù)組的上界.可以使用varrays按一定順序存儲固定數(shù)目的元素.元素插入到Varrays數(shù)組時,是從位置1開始的,可以一直增加到數(shù)組長度的上限,varrays元素的最大數(shù)目為2G
1、定義VARRAY類型
????? Type? type_name is {varray|varraying array}(max size) of data_type?[not null]
下面是一個定義例子:
type num_varray is varray(5) if?number;
在指定data_type時,以專守以下規(guī)則:?
??? 可以使用%TYPE和%ROWTYPE
??? data_type不能是BOOLEAN、NCHAR、NVARCHAR2、REF CURSOR、NCLOB類型
下面是一個可變數(shù)組的例程
procedure?varrays_demo
is
?num_varray??num_varray_type;
begin
?num_varray:=num_varray_type(1,2,3,4,5,6,7,8,9,10);
?dbms_output.put_line(num_varray(1));
?for?idx?in?1..10?loop
?????dbms_output.put_line(num_varray(idx));
?end?loop;
?
?if?num_varray?is?null?then
????dbms_output.put_line('num_varray?is?null');
?else
????dbms_output.put_line('num_varray?is??not?null');
?end?if;
end?varrays_demo;
end?test;
嵌套表
??????? 嵌套表是數(shù)據(jù)元素可以無限大而且無序的一個一維數(shù)據(jù),所有元素的數(shù)據(jù)類型都相同。除了定義它時不能使用index by?binary_integer子句外,與index-by表非常相似,嵌套表數(shù)組中沒有最大數(shù)目限制。(實際上也是一個一維數(shù)組)。
1、定義TABLE類型
???? 其語法如下
??????type table_name is table of data_type [not null]
??????如:
????? type num_table is table of number
?????該語句聲明了一個元素數(shù)目無限大的數(shù)字型嵌套表
????? 定義data_type時,要專守以下規(guī)劃:
??????A、可以使用%TYPE和%ROWTYPE
????? B、可以是另一個oracle 9i的varray或table類型
????? C、不能是BOOLEAN、NCHAR、NVARCHAR2、NCLOB、REF CURSOR類型,下面是一個例程:
procedure?table_demo
is?
???type?num_table?is?table?of?number;
???v_numtable?num_table;
???vcount?number;
begin
???if?v_numtable?is?null?then
??????dbms_output.put_line('v_numtable?is?null');
???end?if?;
???v_numtable?:=num_table();?--不帶參數(shù)構(gòu)造一個空表
???if?v_numtable?is?null?then
??????dbms_output.put_line('構(gòu)造一個空v_numtable?is?null');
???else?
??????dbms_output.put_line('構(gòu)造一個空表時,v_numtable?不等于null');
???end?if?;
??--?if?v_numtable(1)?is?null?then??--這樣的話,編譯雖通過,執(zhí)行時出錯
??--????dbms_output.put_line('a');
??--end?if;
???v_numtable:=num_table(1,2,50,20);
???vcount:=v_numtable.count();
???for?idx?in?1..vcount?loop
???????dbms_output.put_line(v_numtable(idx));
???end?loop;
end?table_demo;
end?test;
集合方法
pl/sql預(yù)定義了在varray 和嵌套表實例上進行調(diào)用的方法。這些方法能在集合上執(zhí)行一定的功能。
EXISTS | 該函數(shù)返回集合中第一個元素的索引,如果集合為空,返回NULL | Collection.EXISTS(index) |
COUNT | 該函數(shù)集合元素的數(shù)目 | Collection.COUNT |
DELETE | 該過程從嵌套表中刪除一個或多個或合部元素 | Table_name.DELETE 刪除所有元素 Table_name.delete(index)刪除指定索引的記錄 Table_name.delete(start_index,end_index)刪除區(qū)間內(nèi)元素 |
FIRST | 返回集合第一個元素索引,如果集合為空,返回NULL | Collection.FIRST |
LAST | 返回集合中最后一個元素索引,如果集合為空,返回NULL | Collection. LAST |
NEXT | 返回集合當(dāng)前元素的下一個元素的索引,如果它不存在就返回NULL | Collection. NEXT |
PRIOR | 返回集合當(dāng)前元素的上一個元素的索引,如果它不存在就返回NULL | Collection. PRIOR |
LIMIT | 返回varray中創(chuàng)建元素的最大個數(shù) | Collection. LIMIT |
EXTENDS | 該過程在集合的末尾添加新的元素 | Collection.EXTEND添加一個NULL元素;Collection.extends(n)添加N個NULL元素,Collection.extend(n,index)添加由index指定位置上元素的n個副表 |
TRIM | 從集合末尾處刪除元素 | Collection.TRIM 刪除最后一個元素 Collection.TRIM(n)刪除最后N個元素 |
?
數(shù)據(jù)加中的集合
與index-by表不同,varray和嵌套表可以作為對象-關(guān)系表中的珍存儲在數(shù)據(jù)庫中。它們也可以作為對象關(guān)系表中的列使用。為了表示出作為數(shù)據(jù)庫列的數(shù)據(jù)類型,集合類型必須是在pl/sql和sql中可見。這需要使用create or replace type 語句定義而不能僅在pl/sql塊中進行局部定義。語法如下:
create of? replace type table_name is table of data_type
?????
posted on 2007-01-22 14:34
有貓相伴的日子 閱讀(1200)
評論(1) 編輯 收藏 所屬分類:
pl/sql