官术网_书友最值得收藏!

2.5.8 類類型

DM通過(guò)類類型在DM SQL程序中實(shí)現(xiàn)面向?qū)ο蠓椒ǖ某绦蛟O(shè)計(jì)。類將結(jié)構(gòu)化的數(shù)據(jù)及對(duì)其進(jìn)行操作的過(guò)程或函數(shù)封裝在一起。允許用戶根據(jù)現(xiàn)實(shí)世界的對(duì)象建模,而不必再將其抽象成關(guān)系數(shù)據(jù)。

DM的類的定義分為類頭和類體兩部分,類頭完成類的聲明;類體完成類的實(shí)現(xiàn)。類中可以有以下內(nèi)容。

(1)類型定義。在類中可以定義游標(biāo)、異常、記錄、數(shù)組及內(nèi)存索引表等數(shù)據(jù)類型。在類的聲明中不能聲明游標(biāo)和異常,但是在類的實(shí)現(xiàn)中可以定義和使用。

(2)屬性。類中的成員變量、數(shù)據(jù)類型可以是標(biāo)準(zhǔn)的數(shù)據(jù)類型,也可以是在類中自定義的特殊數(shù)據(jù)類型。

(3)成員方法。類中的函數(shù)或過(guò)程,在類頭中聲明,在類體中實(shí)現(xiàn)。成員方法及構(gòu)造函數(shù)包含一個(gè)隱含參數(shù),即自身對(duì)象,在方法實(shí)現(xiàn)中可以通過(guò)“this”來(lái)訪問(wèn)自身對(duì)象。如果不存在重名問(wèn)題,那么也可以直接使用對(duì)象的屬性和方法。

(4)構(gòu)造函數(shù)。構(gòu)造函數(shù)是類內(nèi)定義及實(shí)現(xiàn)的一種特殊函數(shù),這類函數(shù)用于實(shí)例化類的對(duì)象。構(gòu)造函數(shù)滿足以下條件。

① 函數(shù)名和類名相同。

② 函數(shù)返回值類型為自身類。

構(gòu)造函數(shù)存在以下約束。

① 系統(tǒng)為每個(gè)類提供兩個(gè)默認(rèn)的構(gòu)造函數(shù),分別為無(wú)參構(gòu)造函數(shù)和全參構(gòu)造函數(shù)。

② 無(wú)參構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)為0,實(shí)例對(duì)象內(nèi)所有的屬性初始化值都為NULL。

③ 全參構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)及類型與類內(nèi)屬性的個(gè)數(shù)及屬性相同,按照屬性的順序依次讀取參數(shù)的值并給屬性賦值。

④ 用戶可以自定義構(gòu)造函數(shù),一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但每個(gè)構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)必須不同。

⑤ 如果用戶自定義了0個(gè)參數(shù)或參數(shù)個(gè)數(shù)同屬性個(gè)數(shù)相同的構(gòu)造函數(shù),則會(huì)覆蓋相應(yīng)的默認(rèn)構(gòu)造函數(shù)。

下面從類的聲明、類的實(shí)現(xiàn)、類的刪除、類體刪除和類的使用5個(gè)方面來(lái)詳細(xì)介紹類類型的實(shí)現(xiàn)過(guò)程。

1.類的聲明

類的聲明在類頭中完成。類頭定義通過(guò)CREATE CLASS語(yǔ)句完成,其語(yǔ)法格式如下:

img

語(yǔ)法說(shuō)明如下。

(1)類中元素可以任意順序出現(xiàn),其中的對(duì)象必須在引用之前進(jìn)行聲明。

(2)過(guò)程和函數(shù)的聲明都是前向聲明,類聲明中不包括任何實(shí)現(xiàn)代碼。有權(quán)限使用該語(yǔ)句的用戶必須是DBA或具有CREATE CLASS數(shù)據(jù)庫(kù)權(quán)限的用戶。

2.類的實(shí)現(xiàn)

類的實(shí)現(xiàn)通過(guò)類體完成。類體的定義通過(guò)CREATE CLASS BODY語(yǔ)句完成,其語(yǔ)法格式如下:

img

語(yǔ)法說(shuō)明如下。

(1)類聲明中定義的對(duì)象對(duì)于類體而言都是可見(jiàn)的,不需要聲明就可以直接引用。這些對(duì)象包括變量、游標(biāo)、異常和類型定義。

(2)類體中的過(guò)程、函數(shù)定義必須和類聲明中的聲明完全相同,包括過(guò)程名、參數(shù)列表的參數(shù)名和數(shù)據(jù)類型定義。

(3)類中可以有重名的成員方法,要求其參數(shù)列表各不相同。系統(tǒng)會(huì)根據(jù)用戶的調(diào)用情況進(jìn)行重載(Overload)。

(4)權(quán)限。使用該語(yǔ)句的用戶必須是DBA或該類對(duì)象的擁有者,并且具有CREATE CLASS數(shù)據(jù)庫(kù)權(quán)限的用戶。

【例2-21】完整的類頭、類體創(chuàng)建。

img
img

3.類的刪除

類的刪除分為兩種方式:一種是類頭的刪除,刪除類頭的同時(shí)會(huì)一并刪除類體;另一種是類體的刪除,這種方式只能刪除類體,類頭依然存在。

刪除類頭:類的刪除通過(guò)DROP CLASS完成,即類頭的刪除。語(yǔ)法格式如下:

img

語(yǔ)法說(shuō)明如下。

(1)如果被刪除的類不屬于當(dāng)前模式,則必須在語(yǔ)句中指明模式名。

(2)如果一個(gè)類的聲明被刪除,那么對(duì)應(yīng)的類體被自動(dòng)刪除。

(3)權(quán)限說(shuō)明:執(zhí)行該操作的用戶必須是該類的擁有者,或者具有DBA權(quán)限。

4.類體刪除

類體刪除即從數(shù)據(jù)庫(kù)中刪除一個(gè)類的實(shí)現(xiàn)主體對(duì)象。語(yǔ)法格式如下:

img

語(yǔ)法說(shuō)明如下。

(1)如果被刪除的類不屬于當(dāng)前模式,則必須在語(yǔ)句中指明模式名。

(2)權(quán)限說(shuō)明:執(zhí)行該操作的用戶必須是該類的擁有者,或者具有DBA權(quán)限。

5.類的使用

類類型同普通的數(shù)據(jù)類型一樣,可以作為表列的數(shù)據(jù)類型、程序塊中變量的數(shù)據(jù)類型,以及過(guò)程和函數(shù)參數(shù)的數(shù)據(jù)類型。類的使用規(guī)則如下。

(1)作為表列的類型或其他類成員變量屬性的類型,不能被修改或刪除類中定義的數(shù)據(jù)類型,其名稱只在類的聲明及實(shí)現(xiàn)中有效。如果類內(nèi)函數(shù)的參數(shù)或返回值是類內(nèi)數(shù)據(jù)類型,或者進(jìn)行類內(nèi)成員變量的復(fù)制,則需要在PL/SQL程序塊中定義一個(gè)結(jié)構(gòu)與之相同的類型。根據(jù)類使用方式的不同,對(duì)象可分為變量對(duì)象及列對(duì)象。變量對(duì)象指的是在PL/SQL程序塊中聲明類類型的變量;列對(duì)象指的是表中類類型的列。變量對(duì)象可以修改其屬性的值,而列對(duì)象不能。

(2)變量對(duì)象的實(shí)例化。實(shí)例化通過(guò)NEW表達(dá)式調(diào)用構(gòu)造函數(shù)完成。

(3)變量對(duì)象的引用。通過(guò)“=”進(jìn)行的類類型變量之間的賦值是對(duì)對(duì)象的引用,并沒(méi)有復(fù)制一個(gè)新的對(duì)象。

(4)變量對(duì)象屬性訪問(wèn)。可以通過(guò)<對(duì)象名>.<屬性名>方式進(jìn)行屬性的訪問(wèn)。

(5)變量對(duì)象成員方法調(diào)用。成員方法的調(diào)用通過(guò)<對(duì)象名>.<成員方法名>(<參數(shù)>{,<參數(shù)>})方式進(jìn)行。如果成員方法內(nèi)修改了對(duì)象內(nèi)屬性的值,則該修改生效。

(6)列對(duì)象的插入。列對(duì)象的創(chuàng)建是通過(guò)使用INSERT語(yǔ)句向表中插入數(shù)據(jù)實(shí)現(xiàn)的,插入語(yǔ)句中的值是變量對(duì)象,插入后存儲(chǔ)在表中的數(shù)據(jù)即列對(duì)象。

(7)列對(duì)象的復(fù)制。存儲(chǔ)在表中的對(duì)象不允許對(duì)對(duì)象中的成員變量進(jìn)行修改,通過(guò)INTO語(yǔ)句進(jìn)行的查詢或“=”操作符進(jìn)行的列到變量的賦值是對(duì)象的賦值,生成了一個(gè)與列對(duì)象數(shù)據(jù)一樣的副本,在該副本上進(jìn)行的修改不會(huì)影響表中列對(duì)象的值。

(8)列對(duì)象的屬性訪問(wèn)。通過(guò)<列名>.<屬性名>方式進(jìn)行屬性的訪問(wèn)。

(9)列對(duì)象的方法調(diào)用。通過(guò)<列名>.<成員方法名>(<參數(shù)>{,<參數(shù)>})調(diào)用。

在列對(duì)象方法調(diào)用過(guò)程中對(duì)類型內(nèi)屬性的修改,都是在列對(duì)象的副本上進(jìn)行的,不會(huì)影響列對(duì)象的值。

(10)對(duì)象表的更新。表中存儲(chǔ)的列對(duì)象雖然不能進(jìn)行修改,但是可以通過(guò)UPDATE語(yǔ)句直接更新某行數(shù)據(jù),即并不是修改對(duì)象內(nèi)屬性的值,而是直接替換了對(duì)象。

【例2-22】類類型的變量對(duì)象、列對(duì)象的應(yīng)用。

(1)變量對(duì)象的應(yīng)用實(shí)例如下:

img

(2)列對(duì)象的應(yīng)用實(shí)例如下:

① 表的創(chuàng)建:

img

② 列對(duì)象的創(chuàng)建——插入數(shù)據(jù):

img

③ 列對(duì)象的復(fù)制及訪問(wèn):

img
主站蜘蛛池模板: 新源县| 赫章县| 胶南市| 岳阳县| 鹿邑县| 通道| 浦北县| 杂多县| 阆中市| 黑水县| 鄯善县| 台北市| 介休市| 新宁县| 尼勒克县| 府谷县| 丹东市| 郯城县| 康马县| 托里县| 邯郸县| 绍兴县| 通山县| 当涂县| 延寿县| 榆社县| 平陆县| 柞水县| 普兰店市| 高要市| 民乐县| 密云县| 云林县| 石阡县| 邵武市| 四平市| 丰镇市| 轮台县| 崇文区| 越西县| 广州市|