淺談oracle複合資料型別 (2)

jss001發表於2009-02-27

二、集合

類似C語言中的陣列,在ORACLE7.3及以前的版本中只有一種集合稱為PL/SQL表,這種型別的集合依然保留,就是索引(INDEX_BY)表。
PL/SQL有三種型別的集合a、Index_by表
b、巢狀表
c、VARRAY
三種型別的集合之間的差異,包括資料繫結、稀疏性(sparsity)、資料庫中的儲存能力都有不相同。
資料繫結:
繫結涉及到集合中元素數量的限制,VARRAY集合中的元素的數量是有限,Index_by和巢狀表則是沒有限制的。
稀疏性(sparsity):
稀疏性描述了集合的下標是否有間隔,Index_by表和巢狀表可以是稀疏的,VARRAY型別的集合則是緊密的,它的下標之間沒有間隔。
儲存:
Index_by表不能儲存在資料庫中,但巢狀表和VARRAY可以被儲存在資料庫中。

Index_by表定義語法如下:
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER;
關鍵字是INDEX BY BINARY_INTEGER,沒有這個關鍵字,那麼集合將是一個巢狀表。由於不儲存在資料庫中,
element_type可以是任何合法的PL/SQL資料型別,包括:PLS/INTEGER、SIGNTYPE、和BOOLEAN。

巢狀表定義語法如下:
巢狀表非常類似於Index_by表,建立的語法也非常相似。只是沒有INDEX BY BINARY_INTEGER子串
TYPE type_name IS TABLE OF element_type [NOT NULL];
儲存在一個資料庫中的巢狀表並不與表中的其它資料存放在同一個資料塊中,它們實際上被存放在第二個表中。
從資料庫中取回的巢狀表也不保證元素的順序。集合資料是離線儲存的,所以巢狀表適合大型集合。

VARRAY定義語法如下:
TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF element_type [NOT NULL];
max_size是一個整數,用於標示VARRAY集合擁有的最多元素數目。VARRAY集合的元素數量可以低於max_size,但不能超過max_size。
element_type是一維元素的資料型別,如果element_type是記錄,那麼這個記錄只能使用標量資料欄位(與巢狀標相似)。
VARRAY儲存在資料庫中時與表中的其他資料存放在同一個資料塊中,元素的順序儲存在VARRAY中。
集合是線上儲存的,VARRAY很適合於小型集合。

巢狀表和VARRAY都能作為列儲存在資料庫表中,所以集合自身可以為NULL,當集合為NULL時,使用者也不能引用集合中的元素。
使用者可以使用IS NULL運算子檢測集合是否為NULL。

1、index_by表:

*/

declare
cursor cur_test is select id,mc from test;
type t_test1 is table of varchar2(60) index by binary_integer;
type t_test2 is table of test%rowtype index by binary_integer;
var_test1 t_test1;
var_test2 t_test2;
var_new t_test2;
begin
SELECT id,mc INTO var_test2(0) FROM test WHERE id='111';
dbms_output.put_line('var_test2(0):'||var_test2(0).id||'---'||var_test2(0).mc);
SELECT id,mc INTO var_test2(8) FROM test WHERE id='333';
dbms_output.put_line('var_test2(8):'||var_test2(8).id||'---'||var_test2(8).mc);
var_new := var_test2;
dbms_output.put_line('===== copy var_test2 to var_new =====');
dbms_output.put_line('var_new(0):'||var_new(0).id||'---'||var_new(0).mc);
dbms_output.put_line('var_new(8):'||var_new(8).id||'---'||var_new(8).mc);
end;
/

/*
巢狀表和VARRAY由建構函式初始化

2、巢狀表和VARRAY:

*/

DECLARE
TYPE t_test1 IS TABLE OF test.id%TYPE;
TYPE t_test2 IS VARRAY (10) OF test.id%TYPE;
var_test1 t_test1;
var_test2 t_test2;
begin
--var_test1(1) := ('test1.1'); --沒有初始化不能賦值
var_test1 := t_test1('test1.1','test1.2','test1.3');
dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));
var_test2 := t_test2('test2.1','test2.2','test2.3');
dbms_output.put_line('var_test2: '||var_test2(1)||','||var_test2(2)||','||var_test2(3));
var_test1(2) := 'test1.2_update';
dbms_output.put_line('==== 修改了var_test1(2) ====');
dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));
dbms_output.put_line(var_test1.next(3));
dbms_output.put_line('var_test2元素個數: '||var_test2.limit());
end;
/

/*
巢狀表的元素可以是集合,注意賦值的時候是varray_element.record_column := 的形式.
除了建構函式外,集合還有很多內建函式,按照物件導向編成的叫法稱之為方法。
方法==========描述====================================================================使用限制
COUNT=========返回集合中元素的個數
DELETE========刪除集合中所有元素
DELETE(x)=====刪除元素下標為x的元素===================================================對VARRAY非法
DELETE(x,y)===刪除元素下標從X到Y的元素================================================對VARRAY非法
EXIST(x)======如果集合元素x已經初始化,則返回TRUE, 否則返回FALSE
EXTEND========在集合末尾新增一個元素==================================================對Index_by非法
EXTEND(x)=====在集合末尾新增x個元素===================================================對Index_by非法
EXTEND(x,n)===在集合末尾新增元素n的x個副本============================================對Index_by非法
FIRST=========返回集合中的第一個元素的下標號,對於VARRAY集合始終返回1。
LAST==========返回集合中最後一個元素的下標號, 對於VARRAY返回值始終等於COUNT.
LIMIT=========返回VARRY集合的最大的元素個數===========================================Index_by集合和巢狀表無用
NEXT(x)=======返回在第x個元素之後及緊挨著它的元素的值,如果x是最後一個元素,返回null.
PRIOR(x)======返回在第x個元素之前緊挨著它的元素的值,如果x是第一個元素,則返回null。
TRIM==========從集合末端開始刪除一個元素==============================================對於index_by不合法
TRIM(x)=======從集合末端開始刪除x個元素===============================================對index_by不合法

*/

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017066/,如需轉載,請註明出處,否則將追究法律責任。

相關文章