Oracle 9i支持三種集合數據類型:index-by 表,Varrays(可變數組)和嵌套表
Varrays 由其元素的最大數目限定的單維有限數組,可以改變varrays數組的上界.可以使用varrays按一定順序存儲固定數目的元素.元素插入到Varrays數組時,是從位置1開始的,可以一直增加到數組長度的上限,varrays元素的最大數目為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時,以專守以下規則:?
??? 可以使用%TYPE和%ROWTYPE
??? data_type不能是BOOLEAN、NCHAR、NVARCHAR2、REF CURSOR、NCLOB類型
下面是一個可變數組的例程
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;
嵌套表
??????? 嵌套表是數據元素可以無限大而且無序的一個一維數據,所有元素的數據類型都相同。除了定義它時不能使用index by?binary_integer子句外,與index-by表非常相似,嵌套表數組中沒有最大數目限制。(實際上也是一個一維數組)。
1、定義TABLE類型
???? 其語法如下
??????type table_name is table of data_type [not null]
??????如:
????? type num_table is table of number
?????該語句聲明了一個元素數目無限大的數字型嵌套表
????? 定義data_type時,要專守以下規劃:
??????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();?--不帶參數構造一個空表
???if?v_numtable?is?null?then
??????dbms_output.put_line('構造一個空v_numtable?is?null');
???else?
??????dbms_output.put_line('構造一個空表時,v_numtable?不等于null');
???end?if?;
??--?if?v_numtable(1)?is?null?then??--這樣的話,編譯雖通過,執行時出錯
??--????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預定義了在varray 和嵌套表實例上進行調用的方法。這些方法能在集合上執行一定的功能。
EXISTS | 該函數返回集合中第一個元素的索引,如果集合為空,返回NULL | Collection.EXISTS(index) |
COUNT | 該函數集合元素的數目 | Collection.COUNT |
DELETE | 該過程從嵌套表中刪除一個或多個或合部元素 | Table_name.DELETE 刪除所有元素 Table_name.delete(index)刪除指定索引的記錄 Table_name.delete(start_index,end_index)刪除區間內元素 |
FIRST | 返回集合第一個元素索引,如果集合為空,返回NULL | Collection.FIRST |
LAST | 返回集合中最后一個元素索引,如果集合為空,返回NULL | Collection. LAST |
NEXT | 返回集合當前元素的下一個元素的索引,如果它不存在就返回NULL | Collection. NEXT |
PRIOR | 返回集合當前元素的上一個元素的索引,如果它不存在就返回NULL | Collection. PRIOR |
LIMIT | 返回varray中創建元素的最大個數 | Collection. LIMIT |
EXTENDS | 該過程在集合的末尾添加新的元素 | Collection.EXTEND添加一個NULL元素;Collection.extends(n)添加N個NULL元素,Collection.extend(n,index)添加由index指定位置上元素的n個副表 |
TRIM | 從集合末尾處刪除元素 | Collection.TRIM 刪除最后一個元素 Collection.TRIM(n)刪除最后N個元素 |
?
數據加中的集合
與index-by表不同,varray和嵌套表可以作為對象-關系表中的珍存儲在數據庫中。它們也可以作為對象關系表中的列使用。為了表示出作為數據庫列的數據類型,集合類型必須是在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
有貓相伴的日子 閱讀(1193)
評論(1) 編輯 收藏 所屬分類:
pl/sql