本文來自:http://www.tkk7.com/improviser/archive/2007/10/02/150166.html
關系數據庫在不斷地發展時,許多數據庫引入了面向對象的思想,這其中以Oracle為代表,Oracle9i就號稱面向對象數據庫。 自Oracle9i以來,Oracle就不再是單純的關系數據庫管理系統,它在關系數據庫模型的基礎上,添加了一系列面向對象的特性。Oracle的對象體系遵從面向對象思想的基本特征,許多概念同C++,JAVA中類似,具有繼承,重載,多態等特征,但又有自己的特點。
1、 Oracle面向對象的最基本元素是它的對象類型——Type。
下面開始寫自定義對象類型( as object 必須關鍵字)
1 create or replace type ADDRESS as object
2 (
3 PROVINCE varchar(10),
4 CITY varchar(20),
5 STREET varchar(30)
6 );
創建表并使用以上對象類型ADDRESS
1 create table STUDENTOBJ
2 (
3 STUNAME varchar(20),
4 STUADD ADDRESS
5 );
6
7 向表中插入數據:
8 insert into STUDENTOBJ values('improviser',ADDRESS('廣東省','廣州市','江海大道');
通過別名對表進行查詢
1 select S.STUNAME S.ADDRESS.PROVINCE S.ADDRESS.CITY
2 S.ADDRESS.STREET from STUDENTOBJ S;
從上面的測試代碼,可以很容易看到其與面向對象語言(比如Java)的差異,不必使用new創建實例,也沒有了默認無參數構造器,默認使用定義的屬性作為構造器參數,足以描述各種實體。另外,Type的屬性沒有private,protected,public的說法,所有的屬性調用者都可以訪問,即都是public。
2、Oracle中面向對象特征——繼承(父類型必須聲明為NOT FINAL,子類型使用關鍵字UNDER)
1 創建父類型
2 create or replace type PERSON as object
3 (
4 PERNAME varchar(10),
5 PERSEX varchar(2)
6 )not final;
7
8 子類型繼承父類型
9 create or replace type STUDENT under PERSON
10 (
11 STUNO varchar(8),
12 STUSCORE varchar(10)
13 );
由以上定義,其子類型中屬性包含了父類型中所有屬性。
3、可變數組
可變數組,是一種集合。一個可變數組是對象的一個集合,其中每個對象都具有相同的數據類型。可變數組的大小由創建時決定。在表中建立可變數組后,可變數組在主表中作為一個列對待。
1 創建對象類型
2 create or replace type ADDRESS as object
3 (
4 PROVINCE varchar(10),
5 CITY varchar(20),
6 );
7
8 創建ADDRESS可變數組
9 create or replace type ADDRESS_LIST as varray(3) of ADDRESS;
10
11 創建表并使用可變數組ADDRESS_LIST
12 create table STUDENT
13 (
14 STUNAME varchar(20),
15 STUADDS ADDRESS_LIST
16 );
17
18 向表中插入數據
19 insert into STUDENT values('improviser',ADDRESS_LIST(ADDRESS('廣東省','廣州市','江海大道'),
ADDRESS('廣東省','潮州市','潮楓路')));
20
21 查詢(使用table函數將數據表格形式輸出)
22 select *from table(select s.STUADDS from STUDENT where STUNAME='improviser');
4、嵌套表
嵌套表是表中之表,一個嵌套表是某些行的集合,它在主表中表示為其中的一列。對主表中的每一條記錄,嵌套表可以包含多個行。
1 定義嵌套表方法:
2 create or replace type ADDRESS_TABLE as table of ADDRESS;
3
4 基本對象類型、創建表、查詢和插入數據都跟上面可變數組一樣
5
6 嵌套表更新(table轉化為表再利用表別名操作列進行更新)
7 update table(select S.STUADDS from STUDENT S where
8 S.STUNAME = 'improviser') AD set AD.PROVINCE = '北京' where city = '廣州';
9
10刪除嵌套表記錄
11delete from table(select S.STUADDS from STUDENT S
12 where S.STUNAME = 'improviser') AD where AD.city = '潮州市';
13
比較:可變數組,查詢速度快,但是更新困難得整體更新,適用與數據不修改情況,如醫生處方。使用嵌套表可以對表中的表內容進行修改而無需進行整體更新操作。
4、對象表
1 首先創建對象類型
2 create or replace type OFFICETYPE as object
3 (
4 id varchar(10),
5 typename varchar(20)
6 );
7
8 將對象類型轉化為對象表
9 create table office of officetype;
10
11 創建對象關系表(使用ref ,指示OID進行對象表關聯)
12 create table worker
13 (
14 workerid varchar(10) primary key,
15 workername varchar(20),
16 workeroffice ref officetpey scope is office,
17 phone varchar(20)
18 );
19
20 使用deref 取得關聯對象表相關內容
21 select workerid,workername,deref(w.workeroffice),phone from worker w
where workerid = 'C001';
22 結果為
23 C001 張小明 OFFICETYPE('0001', '財務科') 010-12345
24
25 使用VALUE(別名)查詢對象內容
26 select value(o) from office o;
27
5、對象視圖
1 創建對象視圖(通過OID連接dept)
2 create view deptview of deptype with object oid(deptno) as select *from dept;
3 create view emp_view as select make_ref(deptview,deptno) deptoid,empno,ename
4 from emp;
好了,有關Oracle中面向對象的內容就簡要敘述這么多了,雖然現在很少使用到,但在以后有用到之處有一定的參考作用。
posted on 2008-06-18 17:42
henry1451 閱讀(336)
評論(0) 編輯 收藏 所屬分類:
Oracle技術