嵌套表
一、嵌套表的定義:
嵌套表是表中之表。一個嵌套表是某些行的集合,它在主表中表示為其中的一列。對主表中的每一條記錄,嵌套表可以包含多個行。在某種意義上,它是在一個表中存儲一對多關系的一種方法。考查一個包含部門信息的表,在任何時間內每個部門會有很多項目正在實施。在一個嚴格的關系模型中,將需要建立兩個獨立的表department和project。
嵌套表允許在department表中存放關於項目的信息。勿需執行聯合操作,就可以通過department表直接訪問項目表中的記錄。這種不經聯合而直接選擇數據的能力使得用戶對數據訪問更加容易。甚至在並沒有定義方法來訪問嵌套表的情況下,也能夠很清楚地把部門和項目中的數據聯系在一起。在嚴格的關系模型中,department和project兩個表的聯系需要通過外部關鍵字(外鍵)關系才能實現。
二、舉例說明嵌套表的使用:
假設有一個關於動物飼養員的表,希望其中具有他們飼養的動物的信息。用一個嵌套表,就可以在同一個表中存儲飼養員和其飼養的全部動物的信息。
1、創建類型animal_ty:此類型中,對於每個動物都包含有一個記錄,記載了其品種、名稱和出生日期信息。
CREATE TYPE animal_ty AS OBJECT (
breed varchar2(25),
name varchar2(25),
birthdate date);
2、創建animals_nt:此類型將用作一個嵌套表的基礎類型。
CREATE TYPE animals_nt as table of animal_ty;
3、創建表breeder:飼養員的信息表
create table breeder
(breedername varchar2(25),
animals animal_nt)
nested table animals store as animals_nt_tab;
4、向嵌套表中插入記錄
insert into breeder
values('mary',animal_nt(animal_ty('dog','butch','31-MAR-97'),
animal_ty('dog','rover','31-MAR-97'),
animal_ty('dog','julio','31-MAR-97')));
insert into breeder
values('jane',animal_nt(animal_ty('cat','an','31-MAR-97'),
animal_ty('cat','jame','31-MAR-97'),
animal_ty('cat','killer','31-MAR-97')));
commit;
5、查詢嵌套表
select name,birthdate from
table(select animals from breeder);
select name,birthdate from
table(select animals from breeder
where breedername=’mary’)
where name=’dog’;
1、對象復用:如果編寫面向對象的代碼,就提高了重用以前編寫的代碼模塊的機會。同樣,如果創建面向對象的數據庫對象,也就提高了數據庫對象能夠被重用的機會。
2、標准支持:如果創建標准的對象,那麼它們被重用的機會就會提高。如果有多個應用或多個表使用同一數據庫對象集合,那麼它就是既成事實的數據庫對象標准。
3、定義訪問路徑:對於每一個對象,用戶可定義在其上運行的過程和函數,從而可以使數據和訪問此數據的方法聯合起來。有了用這種方式定義的訪問路徑,就可以標准化數據訪問的方法並提高對象的可復用性。
可變數組
一、可變數組的定義:
可變數組與嵌套表相似,也是一種集合。一個可變數組是對象的一個集合,其中每個對象都具有相同的數據類型。可變數組的大小由創建時決定。在表中建立可變數組後,可變數組在主表中作為一個列對待。從概念上講,可變數組是一個限制了行集合的嵌套表。
可變數組,允許用戶在表中存儲重復的屬性。例如:假設用戶有一個project表,並在項目中指定了工作人員,一個項目可以有多個工人,而一個工人也可以為多個項目工作。在嚴格的關系模型中,用戶可以創建一個project表,一個worker表和存儲它們之間關系的交叉表project_worker。
用戶可使用可變數組在project表中存儲工人的名字。如果項目限定的工人數不超過10人,可以建立一個以10個數據項為限的可變數組。接下來就可處理此可變數組,從而對於每一個項目,可以選取其中所有工人的名字,而勿需查詢表worker。
二、舉例說明可變數組的使用:
1、創建類型comm_info
CREATE TYPE comm_info AS OBJECT ( /*此類型為通訊方式的集合
no number(3), /*通訊類型號
comm_type varchar2(20), /*通訊類型
comm_no varchar2(30)); /*號碼
2、創建可變數組comm_info_list
CREATE TYPE comm_info_list AS
VARRAY(50) OF comm_info;
3、創建表
create table user_info
(user_id number(6), /*用戶ID號
user_name varchar2(20), /*用戶名稱
user_comm comm_info_list); /*與用戶聯系的通訊方式
4、向可變數組插入記錄
insert into user_info
values(1,'mary',comm_info_list(comm_info(1,'手機','13651401919'),
comm_info(2,'呼機','1281234567')));
insert into user_info
values(2,'carl',comm_info_list(comm_info(1,'手機','13901018888'),
comm_info(2,'呼機','1281234567')));
commit;
5、查詢可變數組
select user_comm from user_info
where user_id=1;
select comm_type,comm_no
from table(select user_comm from user_info
where user_id=1)
where no=1;
與一位用戶聯系的方式有很多種,比如:手機、呼機、座機等。在一個嚴格的關系模型中,將需要兩個獨立的表:用戶信息和通訊方式,而在可變數組中,允許在表user_info中直接訪問用戶的聯系方式,這種不經聯合而直接選擇數據的能力使得用戶對數據的訪問更加容易。
三、可變數組的特點:
1、對象復用:如果編寫面向對象的代碼,就提高了重用以前編寫的代碼模塊的機會。同樣,如果創建面向對象的數據庫對象,也就提高了數據庫對象能夠被重用的機會。
2、標准支持:如果創建標准的對象,那麼它們被重用的機會就會提高。如果有多個應用或多個表使用同一數據庫對象集合,那麼它就是既成事實的數據庫對象標准。
3定義訪問路徑:對於每一個對象,用戶可定義在其上運行的過程和函數,從而可以使數據和訪問此數據的方法聯合起來。有了用這種方式定義的訪問路徑,就可以標准化數據訪問的方法並提高對象的可復用性。