基于Oracle的面向?qū)ο蠹夹g(shù)入門基礎(chǔ)簡析開發(fā)者網(wǎng)絡(luò)Oracle
一、概述
對象是Oracle8i以上版本中的一個新的特性,對象實際是對一組數(shù)據(jù)和操作的封裝,對象的抽象就是類。在面向?qū)ο蠹夹g(shù)中,對象涉及到以下幾個重要的特性:
封裝性
通過對數(shù)據(jù)和操作的封裝,將用戶關(guān)心的數(shù)據(jù)和操作暴露出來作為接口,其他數(shù)據(jù)和操作則隱藏到對象內(nèi)部,這樣便于用戶使用和維護(hù)。
繼承性
對象具有繼承性,通過這一特性可以增強(qiáng)程序的可擴(kuò)展性,適合大型項目的開發(fā)。
多態(tài)性
同一操作在運行時刻有不同的對象來引用,則其執(zhí)行結(jié)果是不一樣的。這一特性稱之為多態(tài)性。
正是因為面向?qū)ο蟮闹T多優(yōu)勢,Oracle公司在8.0版本以后就加入了對這一特性的全面支持,下來的部分重點講述在Oracle中的面向?qū)ο蟪绦蛟O(shè)計。
二、Oracle中的面向?qū)ο蟪绦蛟O(shè)計
既然對象具有這么多的優(yōu)點,那么在Oracle數(shù)據(jù)庫如何引用它呢?Oracle中的對象定義分兩步進(jìn)行:
首先定義對象類型。定義對象類型跟定義包類型完全一樣,即分為對象類型頭(或稱為對象規(guī)范,specification)和對象類型體(body)。對象類型頭包括了對象類型的屬性和方法的聲明,而對象類型體則包含了對象類型具體的實現(xiàn)。
例如,定義一個empObj對象類型,代碼如下:
特別需要注意的是,如果對象沒有成員函數(shù)部分,那么此對象類型的定義只有對象類型頭部分。
然后定義對象實例。定義了對象類型后就可以直接定義它的實例了,比如定義一個empObj實例對象,代碼如下:
經(jīng)過這兩步之后就可以引用對象實例的屬性和方法了,引用符號為“.”,比如
另外,在初始化無成員函數(shù)的對象時可以直接以構(gòu)造函數(shù)的形式進(jìn)行初始化,注意,這個時候不需顯式的定義構(gòu)造函數(shù)。比如,初始化上面v_empObj1對象(假設(shè)無成員函數(shù)的情況下才能進(jìn)行這種初始化操作), 代碼如下:
由于Oracle數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫,其存儲數(shù)據(jù)是以二維表的形式進(jìn)行的,而對象是對數(shù)據(jù)和操作進(jìn)行封裝的一個實體,其存儲信息往往是多維信息,那么對象在Oracle數(shù)據(jù)庫中的存儲是如何進(jìn)行的呢?(這里補充一點,PL/SQL程序塊中聲明的對象是臨時對象,在超出其作用區(qū)域后系統(tǒng)將自動收回其分配的資源,但是如果需要保存對象的信息,就必須將其存儲在數(shù)據(jù)庫中)
事實上,對象在Oracle數(shù)據(jù)庫中的存儲形式分為兩種:
1. 對象列。即可以將數(shù)據(jù)表中的列的數(shù)據(jù)類型定義為一個對象類型,這樣對象就可以存儲在數(shù)據(jù)列中了。比如定義一個表table1,其中emp列可以用來存儲對象。
2. 對象行。即可以創(chuàng)建一個對象表,其中每一列就表示對象中的一個屬性,這樣一條行記錄就是一個對象了。比如定義一個emp表如下:
這樣emp表的一個記錄就是一個empObj對象,插入一個表的操作就可以為:
注意,這里表中列類型與對象的屬性類型應(yīng)該一一對應(yīng),另外這樣存儲將忽略對象的成員函數(shù)的信息。
[NextPage]
三、對象操作與比較
可以采用DML語句對對象進(jìn)行操作,其操作的語法跟一般的數(shù)據(jù)類型完全一樣,比如在table1表中返回對象為empObj(10002,'mike',3000)的記錄:
如果需要進(jìn)行對象的大小比較,那么用一般的方法就很難處理,畢竟對象含有一組屬性,無法進(jìn)行組合比較。可以采用向?qū)ο蠹尤雖ap方法和order方法來解決此問題,前者是通過將對象某一屬性返回代表對象的值班來比較大小,后者是通過比較兩個對象之間某個屬性的值班來獲取對象的大小。由于兩者的相似性,這里以用途更廣的map成員函數(shù)為為例示范如下:
這樣定義了map函數(shù)后,對empObj對象大小的比較實質(zhì)轉(zhuǎn)化為對各個對象的emp_id屬性大小的比較,在實際操作中,應(yīng)該根據(jù)實際情況來返回關(guān)心的數(shù)據(jù),以進(jìn)行對象大小比較的操作。
四、小結(jié)
通過前面內(nèi)容的介紹,大家應(yīng)該對Oracle數(shù)據(jù)庫的面向?qū)ο蟮奶匦杂幸粋€初步的認(rèn)識,充分利用Oracle的這一特性,可以將面向?qū)ο蟮闹赜眯?,可擴(kuò)展性等優(yōu)點引入到數(shù)據(jù)庫中,提高了數(shù)據(jù)庫的運行性能。
上一頁
- ORACLE 查詢被鎖住的對象,并結(jié)束其會話的方法
- 解析Oracle數(shù)據(jù)庫中的對象集合schema
- oracle查看會話鎖定的所有對象代碼分享
- ORACLE 常用的SQL語法和數(shù)據(jù)對象
- Oracle使用PL/SQL操作COM對象
- PHP 5 數(shù)據(jù)對象 (PDO) 抽象層與 Oracle
- MS-sql 2005拒絕了對對象 ''xxx'' (數(shù)據(jù)庫 ''xxx'',架構(gòu) ''dbo'')的 SELECT 權(quán)限的解決方法
- 重新編譯PLSQL中的無效對象或者指定的對象 的方法
- asp sqlserver 執(zhí)行存儲過程返回記錄集報對象關(guān)閉時不允許操作
- 利用函數(shù)返回oracle對象表的三種方法
相關(guān)文章
Oracle 11g如何清理數(shù)據(jù)庫的歷史日志詳解
這篇文章主要給大家介紹了關(guān)于Oracle 11g如何清理數(shù)據(jù)庫歷史日志的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
解決Windows 7下安裝Oracle 11g相關(guān)問題的方法
本文將為大家介紹Windows 7下安裝Oracle 11g方面的有關(guān)問題解決方案。希望通過本文,能讓大家對11g這款產(chǎn)品有更多的認(rèn)識,需要的朋友可以參考下2015-08-08
深刻理解Oracle數(shù)據(jù)庫的啟動和關(guān)閉
深刻理解Oracle數(shù)據(jù)庫的啟動和關(guān)閉...2007-03-03
Oracle進(jìn)程占用CPU100%的問題分析及解決方法
這篇文章主要介紹了Oracle進(jìn)程占用CPU100%的問題分析及解決方法,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08
oracle數(shù)據(jù)庫臨時表代碼舉例總結(jié)
臨時表是一種特殊的表,當(dāng)需要對某一(也可以是多個)表中的一批數(shù)據(jù)進(jìn)行反復(fù)的操作時,通過為這批數(shù)據(jù)創(chuàng)建一個臨時表,可能會簡化操作并且有可能提高效率,這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫臨時表的相關(guān)資料,需要的朋友可以參考下2024-02-02
Oracle數(shù)據(jù)庫ORA 54013錯誤的解決辦法
ORA 54013 不允許對虛擬列執(zhí)行INSERT 操作,這是Oracle 11 的新特性。接下來通過本文給大家介紹oracle數(shù)據(jù)庫ORA 54013錯誤的解決辦法,非常不錯具有參考借鑒價值,感興趣的朋友一起看看吧2016-10-10
oracle中fdisk導(dǎo)致的ASM磁盤數(shù)據(jù)丟失的解決方法
oracle中fdisk 導(dǎo)致的ASM磁盤數(shù)據(jù)丟失 有需要的朋友可參考一下2012-10-10

