??? 關系數據庫在不斷地發展時,許多數據庫引入了面向對象的思想,這其中以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
刪除嵌套表記錄
11
delete
?
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中面向對象的內容就簡要敘述這么多了,雖然現在很少使用到,但在以后有用到之處有一定的參考作用。
? (轉載請注明出處)?
?
鳳凰涅槃/浴火重生/馬不停蹄/只爭朝夕
???? 隱姓埋名/低調華麗/簡單生活/完美人生