溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

DM類數(shù)據(jù)類型贊怎么使用

發(fā)布時(shí)間:2021-12-21 17:16:52 來(lái)源:億速云 閱讀:155 作者:iii 欄目:數(shù)據(jù)庫(kù)

這篇文章主要講解了“DM類數(shù)據(jù)類型贊怎么使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“DM類數(shù)據(jù)類型贊怎么使用”吧!

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

DM7的類類型分為普通類類型和JAVA CLASS類型。DM文檔中的示例除了特別聲明使用的是JAVA CLASS類型,要不然使用的都是普通類類型。

普通CLASS類型
DM7的類的定義分為類頭和類體兩部分,類頭完成類的聲明;類體完成類的實(shí)現(xiàn)。類中可以包括以下內(nèi)容:
1. 類型定義
在類中可以定義游標(biāo)、異常、記錄類型、數(shù)組類型、以及內(nèi)存索引表等數(shù)據(jù)類型,在類的聲明及實(shí)現(xiàn)中可以使用這些數(shù)據(jù)類型;類的聲明中不能聲明游標(biāo)和異常,但是實(shí)現(xiàn)中可以定義和使用。
2. 屬性
類中的成員變量,數(shù)據(jù)類型可以是標(biāo)準(zhǔn)的數(shù)據(jù)類型,可以是在類中自定義的特殊數(shù)據(jù)類型。
3. 成員方法
類中的函數(shù)或過(guò)程,在類頭中進(jìn)行聲明;其實(shí)現(xiàn)在類體中完成;
成員方法及后文的構(gòu)造函數(shù)包含一個(gè)隱含參數(shù),即自身對(duì)象,在方法實(shí)現(xiàn)中可以通過(guò)this或self來(lái)訪問(wèn)自身對(duì)象,self等價(jià)于this。如果不存在重名問(wèn)題,也可以直接使用對(duì)象的屬性和方法。this和self只能在包或?qū)ο竽_本中調(diào)用。

4. 構(gòu)造函數(shù)
構(gòu)造函數(shù)是類內(nèi)定義及實(shí)現(xiàn)的一種特殊的函數(shù),這類函數(shù)用于實(shí)例化類的對(duì)象,構(gòu)造函數(shù)滿足以下條件:
1) 函數(shù)名和類名相同;
2) 函數(shù)返回值類型為自身類。
構(gòu)造函數(shù)存在以下的約束:
1) 系統(tǒng)為每個(gè)類提供兩個(gè)默認(rèn)的構(gòu)造函數(shù),分別為0參的構(gòu)造函數(shù)和全參的構(gòu)造函數(shù);
2) 0參構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)為0,實(shí)例的對(duì)象內(nèi)所有的屬性初始化值為NULL;
3) 全參構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)及類型和類內(nèi)屬性的個(gè)數(shù)及屬性相同,按照屬性的順序依次讀取參數(shù)的值并給屬性賦值;
4) 用戶可以自定義構(gòu)造函數(shù),一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但每個(gè)構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)必須不同;
5) 如果用戶自定義了0個(gè)參數(shù)、或參數(shù)個(gè)數(shù)同屬性個(gè)數(shù)相同的構(gòu)造函數(shù),則會(huì)覆蓋相應(yīng)的默認(rèn)構(gòu)造函數(shù)。

下面從類的聲明、類的實(shí)現(xiàn)、類的刪除、類體的刪除和類的使用幾部分來(lái)詳細(xì)介紹類類型的實(shí)現(xiàn)過(guò)程。
類的聲明在類頭中完成。類頭定義通過(guò)CREATE CLASS語(yǔ)句來(lái)完成,其語(yǔ)法為:
語(yǔ)法格式
CREATE [OR REPLACE] CLASS [< 模式名>.]< 類名> [WITH ENCRYPTION] [UNDER [< 模式名>.]< 父類名>] [[NOT] FINAL] [[NOT]
INSTANTIABLE] [AUTHID DEFINER | AUTHID CURRENT_USER] AS|IS < 類內(nèi)聲明列表> END [類名]
< 類內(nèi)聲明列表> ::= < 類內(nèi)聲明>;{< 類內(nèi)聲明>;}
< 類內(nèi)聲明> ::= < 變量定義>|< 過(guò)程定義>|< 函數(shù)定義>|< 類型聲名>
< 變量定義> ::= < 變量名列表> < 數(shù)據(jù)類型> [默認(rèn)值定義]
< 過(guò)程定義> ::= [< 方法繼承屬性>][STATIC|MEMBER] PROCEDURE < 過(guò)程名> < 參數(shù)列表>
< 函數(shù)定義> ::= [< 方法繼承屬性>] [MAP] [STATIC|MEMBER] FUNCTION < 函數(shù)名>< 參數(shù)列表> RETURN < 返回值數(shù)據(jù)類型>[DETERMINISTIC]
[PIPELINED]
< 方法繼承屬性> ::= < 重載屬性> | | < 重載屬性>
< 重載屬性> ::= [NOT] OVERRDING
::= FINAL | NOT FINAL | INSTANTIABLE | NOT INSTANTIABLE
< 類型聲名> ::= TYPE < 類型名稱> IS < 數(shù)據(jù)類型>

使用說(shuō)明
1.類中元素可以以任意順序出現(xiàn),其中的對(duì)象必須在引用之前被聲明;
2.過(guò)程和函數(shù)的聲明都是前向聲明,類聲明中不包括任何實(shí)現(xiàn)代碼;
3.支持對(duì)象靜態(tài)方法聲明與調(diào)用??梢栽赑ROCEDURE/FUNCTION關(guān)鍵字前添加static保留字,以此指明方法為靜態(tài)方法。靜態(tài)方法只能以對(duì)象名為前綴調(diào)用,而不能在對(duì)象實(shí)例中調(diào)用;
4.支持對(duì)象成員方法聲明與調(diào)用??梢栽赑ROCEDURE/FUNCTION關(guān)鍵字前添加MEMBER以指明方法為成員方法。MEMBER與STATIC不能同時(shí)使用,非STATIC類型的非構(gòu)造函數(shù)方法默認(rèn)為成員方法。MAP表示將對(duì)象類型的實(shí)例映射為標(biāo)量數(shù)值,只能用于成員類型的FUNCTION;
5.關(guān)于類繼承,有以下使用限制:
1) 類定義默認(rèn)為FINAL,表示該對(duì)象類型不能被繼承,定義父類時(shí)必須指定NOT FINAL選項(xiàng);
2) 定義子類時(shí)必須指定UNDER選項(xiàng);
3) NOT INSTANTIABLE對(duì)象不能為FINAL;
4) NOT INSTANTIABLE對(duì)象不能實(shí)例化,但是可以用其子類賦值;
5) 對(duì)象實(shí)例化時(shí),必須對(duì)父類和子類的成員變量都賦值,且從父類到子類逐個(gè)賦值;
6) 不支持對(duì)象的循環(huán)繼承;
7) 不支持對(duì)象的多繼承,即一個(gè)類有多個(gè)父類;
6) 不支持對(duì)象的循環(huán)繼承;
7) 不支持對(duì)象的多繼承,即一個(gè)類有多個(gè)父類;
8) 不支持父類和子類包含同名變量;
9) 父類和子類可以同名同參,此時(shí)子類必須指定OVERRIDING;
10) 方法默認(rèn)為NOT OVERRIDING,OVERRIDING不能與static一起使用;
11) 父類和子類支持同名不同參(參數(shù)個(gè)數(shù)不同、參數(shù)個(gè)數(shù)相同但類型不同)的方法;
12) 同名且參數(shù)個(gè)數(shù)相同但類型不同時(shí),根據(jù)參數(shù)類型選擇使用的方法;
13) 方法默認(rèn)為INSTANTIABLE,如果聲明為NOT INSTANTIABLE,則不能與FINAL、STATIC一起使用;
14) 如果父類有多個(gè)NOT INSTANTIABLE方法,子類可以只部分重寫(xiě),但此時(shí)子類必須定義為NOT FINAL NOT INSTANTIABLE;
15) NOT INSTANTIABLE方法不能具有主體;
16) 方法默認(rèn)為NOT FINAL,如果聲明為FINAL,則不能被子類重寫(xiě);
17) 子類可以賦值給父類;
18) 如果父類對(duì)應(yīng)的實(shí)例是子類或者子類的孩子,則該父類可以賦值給子類;
19) 可以用INSTANTIABLE子類對(duì)NOT INSTANTIABLE父類進(jìn)行賦值;
20) 子類實(shí)例賦值給父類后,調(diào)用時(shí)使用的是父類方法而不是子類方法;
21) 支持使用as語(yǔ)句轉(zhuǎn)換為父類。

所需權(quán)限
1、使用該語(yǔ)句的用戶必須是DBA或具有CREATE CLASS數(shù)據(jù)庫(kù)權(quán)限的用戶;
2、可以用關(guān)鍵字AUTHID DEFINER |AUTHID CURRENT_USER指定類的調(diào)用者權(quán)限,若為DEFINER,則采用類定義者權(quán)限,若為CURRENT_USER則為當(dāng)前用戶權(quán)限,默認(rèn)為類定義者權(quán)限。

類的實(shí)現(xiàn)通過(guò)類體完成。類體的定義通過(guò)CREATE CLASS BODY語(yǔ)句來(lái)完成,其語(yǔ)法為:
語(yǔ)法格式
CREATE [OR REPLACE] CLASS BODY [< 模式名>.]< 類名> [WITH ENCRYPTION] AS|IS < 類體部分> END [類名]
< 類體部分> ::= < 過(guò)程/函數(shù)列表> [< 初始化代碼>]
< 過(guò)程/函數(shù)列表> ::= < 過(guò)程實(shí)現(xiàn)|函數(shù)實(shí)現(xiàn)>{,< 過(guò)程實(shí)現(xiàn)|函數(shù)實(shí)現(xiàn)> }
< 過(guò)程實(shí)現(xiàn)> ::= [< 方法繼承屬性>][STATIC|MEMBER]PROCEDURE < 過(guò)程名> < 參數(shù)列表> AS|IS BEGIN < 實(shí)現(xiàn)體> END [過(guò)程名]
< 函數(shù)實(shí)現(xiàn)> ::= [< 方法繼承屬性>][MAP] [STATIC|MEMBER]FUNCTION < 函數(shù)名>< 參數(shù)列表> RETURN < 返回值數(shù)據(jù)類型>[DETERMINISTIC] [PIPELINED] AS|IS BEGIN < 實(shí)現(xiàn)體> END [函數(shù)名]
< 方法繼承屬性> ::= < 重載屬性> | | < 重載屬性>
< 重載屬性> ::= [NOT] OVERRDING
::= FINAL | NOT FINAL | INSTANTIABLE | NOT INSTANTIABLE
< 初始化代碼> ::= [[< 說(shuō)明部分>]BEGIN< 執(zhí)行部分>[< 異常處理部分>]]
< 說(shuō)明部分> ::=[DECLARE]< 說(shuō)明定義>{< 說(shuō)明定義>}
< 說(shuō)明定義>::=< 變量說(shuō)明>|< 異常變量說(shuō)明>|< 游標(biāo)定義>|< 子過(guò)程定義>|< 子函數(shù)定義>
< 變量說(shuō)明>::=< 變量名>{,< 變量名>}< 變量類型>[DEFAULT|ASSIGN|:=< 表達(dá)式>];
< 變量類型>::=|< [模式名.]表名.列名%TYPE>|< [模式名.]表名%ROWTYPE>|< 記錄類型>
< 記錄類型>::= RECORD(< 變量名> {,< 變量名> })
< 異常變量說(shuō)明>::=< 異常變量名>EXCEPTION[FOR< 錯(cuò)誤號(hào)>]
< 異常處理語(yǔ)句>::= WHEN < 異常名> THEN < SQL過(guò)程語(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. 聲明類與實(shí)現(xiàn)類時(shí),對(duì)于確定性函數(shù)的指定邏輯與包內(nèi)函數(shù)相同。目前不支持類的確定性函數(shù)在函數(shù)索引中使用。

所需權(quán)限
使用該語(yǔ)句的用戶必須是DBA或該類對(duì)象的擁有者且具有CREATE CLASS數(shù)據(jù)庫(kù)權(quán)限的用戶。
完整的類頭、類體的創(chuàng)建如下所示:
----類頭創(chuàng)建

SQL> create or replace class mycls
2   as
3   type rec_type is record (c1 int, c2 int); --類型聲明
4   id int; --成員變量
5   r rec_type; --成員變量
6   function f1(a int, b int) return rec_type; --成員函數(shù)
7   function mycls(id int , r_c1 int, r_c2 int) return mycls;
8   --用戶自定義構(gòu)造函數(shù)
9   end;
10  /
executed successfully
used time: 14.032(ms). Execute id is 106.

----類體創(chuàng)建

SQL> create or replace class body mycls
2   as
3    function f1(a int, b int) return rec_type
4    as
5    begin
6     r.c1 = a;
7     r.c2 = b;
8     return r;
9    end;
10   function mycls(id int, r_c1 int, r_c2 int) return mycls
11   as
12   begin
13    this.id = id; --可以使用this.來(lái)訪問(wèn)自身的成員
14    r.c1 = r_c1; --this也可以省略
15    r.c2 = r_c2;
16    return this; --使用return this 返回本對(duì)象
17   end;
18  end;
19  /
executed successfully
used time: 61.783(ms). Execute id is 107.

重編譯類
重新對(duì)類進(jìn)行編譯,如果重新編譯失敗,則將類置為禁止?fàn)顟B(tài)。
重編功能主要用于檢驗(yàn)類的正確性。
語(yǔ)法格式
ALTER CLASS [< 模式名>.]< 類名> COMPILE [DEBUG];

參數(shù)
1.< 模式名> 指明被重編譯的類所屬的模式;
2.< 類名> 指明被重編譯的類的名字;
3.[DEBUG] 可忽略。

所需權(quán)限
執(zhí)行該操作的用戶必須是類的創(chuàng)建者,或者具有DBA權(quán)限。
舉例說(shuō)明
例如重新編譯類

SQL> ALTER CLASS mycls COMPILE;
executed successfully
used time: 8.867(ms). Execute id is 108.

刪除類
類的刪除分為兩種方式:一是類頭的刪除,刪除類頭則會(huì)順帶將類體一起刪除;另外一種是類體的刪除,這種方式只能刪除類體,類頭依然
存在。

刪除類頭
類的刪除通過(guò)DROP CLASS完成,即類頭的刪除。刪除類頭的同時(shí)會(huì)一并刪除類體。
語(yǔ)法格式
DROP CLASS [< 模式名>.]< 類名>[RESTRICT | CASCADE]; 使用說(shuō)明
1.如果被刪除的類不屬于當(dāng)前模式,必須在語(yǔ)句中指明模式名;
2.如果一個(gè)類的聲明被刪除,那么對(duì)應(yīng)的類體被自動(dòng)刪除。

所需權(quán)限
執(zhí)行該操作的用戶必須是該類的擁有者,或者具有DBA權(quán)限。

刪除類體
從數(shù)據(jù)庫(kù)中刪除一個(gè)類的實(shí)現(xiàn)主體對(duì)象。
語(yǔ)法格式
DROP CLASS BODY [< 模式名>.]< 類名>[RESTRICT | CASCADE]; 使用說(shuō)明
如果被刪除的類不屬于當(dāng)前模式,必須在語(yǔ)句中指明模式名。
權(quán)限
執(zhí)行該操作的用戶必須是該類的擁有者,或者具有DBA權(quán)限。

類的使用
類類型同普通的數(shù)據(jù)類型一樣,可以作為表中列的數(shù)據(jù)類型,DMSQL程序語(yǔ)句塊中變量的數(shù)據(jù)類型或過(guò)程及函數(shù)參數(shù)的數(shù)據(jù)類型。

具體使用規(guī)則
1.作為表中列類型或其他類成員變量屬性的類不能被修改,刪除時(shí)需要指定CASCADE級(jí)聯(lián)刪除類中定義的數(shù)據(jù)類型,其名稱只在類的聲明及實(shí)現(xiàn)中有效。如果類內(nèi)的函數(shù)的參數(shù)或返回值是類內(nèi)的數(shù)據(jù)類型,或是進(jìn)行類內(nèi)成員變量的復(fù)制,需要在DMSQL程序中定義一個(gè)結(jié)構(gòu)與之相同的類型。

根據(jù)類使用方式的不同,對(duì)象可分為變量對(duì)象及列對(duì)象。變量對(duì)象指的是在DMSQL程序語(yǔ)句塊中聲明的類類型的變量;列對(duì)象指的是在表中類類型的列。變量對(duì)象可以修改其屬性的值而列對(duì)象不能。

2.變量對(duì)象的實(shí)例化
類的實(shí)例化通過(guò)NEW 表達(dá)式調(diào)用構(gòu)造函數(shù)完成。
3.變量對(duì)象的引用
通過(guò)‘=’進(jìn)行的類類型變量之間的賦值所進(jìn)行的是對(duì)象的引用,并沒(méi)有復(fù)制一個(gè)新的對(duì)象。

4.變量對(duì)象屬性訪問(wèn)
可以通過(guò)如下方式進(jìn)行屬性的訪問(wèn)。
< 對(duì)象名>.< 屬性名>
5.變量對(duì)象成員方法調(diào)用
成員方法的調(diào)用通過(guò)以下方式調(diào)用:
< 對(duì)象名>.< 成員方法名>(< 參數(shù)>{,< 參數(shù)>})
如果函數(shù)內(nèi)修改了對(duì)象內(nèi)屬性的值,則該修改生效。
6.列對(duì)象的插入
列對(duì)象的創(chuàng)建是通過(guò)INSERT語(yǔ)句向表中插入數(shù)據(jù)完成,插入語(yǔ)句中的值是變量對(duì)象,插入后存儲(chǔ)在表中的數(shù)據(jù)即為列對(duì)象。
7.列對(duì)象的復(fù)制
存儲(chǔ)在表中的對(duì)象不允許對(duì)對(duì)象中成員變量的修改,通過(guò)into查詢或’=’進(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)用
< 列名>.< 成員方法名>(< 參數(shù)>{,< 參數(shù)>})
列對(duì)象方法調(diào)用過(guò)程中對(duì)類型內(nèi)屬性的修改,都是在列對(duì)象的副本上進(jìn)行的,不會(huì)影響列對(duì)象的值。

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

SQL> declare
2     type ex_rec_t is record (a int, b int); --使用一個(gè)同結(jié)構(gòu)的類型代替類定義的類型
3     rec ex_rec_t;
4     o1 mycls;
5     o2 mycls;
6   begin
7     o1 = new mycls(1,2,3);
8     o2 = o1; --對(duì)象引用
9     rec = o2.r; --變量對(duì)象的成員變量訪問(wèn)
10    print rec.a; print rec.b;
11    rec = o1.f1(4,5); --成員函數(shù)調(diào)用
12    print rec.a; print rec.b;
13    print o1.id; --成員變量訪問(wèn)
14  end;
15  /
2
3
4
5
1
DMSQL executed successfully
used time: 3.129(ms). Execute id is 109.

2. 列對(duì)象的應(yīng)用實(shí)例
表的創(chuàng)建。

SQL> create table tt1(c1 int, c2 mycls);
executed successfully
used time: 28.302(ms). Execute id is 112.

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

SQL> insert into tt1 values(1, mycls(1,2,3));
affect rows 1
used time: 22.639(ms). Execute id is 113.
SQL> commit;
executed successfully
used time: 17.285(ms). Execute id is 114.

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

SQL> declare
2     o mycls;
3     id int;
4   begin
5     select top 1 c2 into o from tt1; --列對(duì)象的復(fù)制
6     select top 1 c2.id into id from tt1; --列對(duì)象成員的訪問(wèn)
7   end;
8   /
DMSQL executed successfully
used time: 33.518(ms). Execute id is 115.

3. 類繼承的應(yīng)用實(shí)例

SQL> CREATE OR REPLACE CLASS cls01 NOT FINAL IS
2     name VARCHAR2(10);
3     MEMBER FUNCTION get_info RETURN VARCHAR2;
4   END;
5   /
executed successfully
used time: 22.220(ms). Execute id is 116.
SQL> CREATE OR REPLACE CLASS cls02 UNDER cls01 IS
2     ID INT;
3     OVERRIDING MEMBER FUNCTION get_info RETURN VARCHAR2;
4   END;
5   /
executed successfully
used time: 14.072(ms). Execute id is 117.

JAVA CLASS類型
JAVA類的定義類似JAVA語(yǔ)言語(yǔ)法,類中可定義。
JAVA類中可以包括以下內(nèi)容:
1. 類型定義
在類中可以定義游標(biāo)、異常,可以聲明記錄類型、數(shù)組類型、結(jié)構(gòu)體類型以及內(nèi)存索引表等數(shù)據(jù)類型變量。
2. 屬性
類中的成員變量,數(shù)據(jù)類型可以是標(biāo)準(zhǔn)的數(shù)據(jù)類型,可以是在類外自定義的特殊數(shù)據(jù)類型。
3. 成員方法
JAVA類中的成員方法及后文的構(gòu)造函數(shù)包含一個(gè)隱含參數(shù),即自身對(duì)象,在方法實(shí)現(xiàn)中可以通過(guò)this或self來(lái)訪問(wèn)自身對(duì)象,self等價(jià)于this。如果不存在重名問(wèn)題,也可以直接使用對(duì)象的屬性和方法。
4. 構(gòu)造函數(shù)
構(gòu)造函數(shù)是類內(nèi)定義及實(shí)現(xiàn)的一種特殊的函數(shù),這類函數(shù)用于實(shí)例化類的對(duì)象,構(gòu)造函數(shù)滿足以下條件:
1) 函數(shù)名和類名相同;
2) 函數(shù)沒(méi)有返回值類型。
構(gòu)造函數(shù)存在以下的約束:
1) 系統(tǒng)為每個(gè)類提供兩個(gè)默認(rèn)的構(gòu)造函數(shù),分別為0參的構(gòu)造函數(shù)和全參的構(gòu)造函數(shù);
2) 0參構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)為0,實(shí)例的對(duì)象內(nèi)所有的屬性初始化值為NULL;
3) 全參構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)及類型和類內(nèi)屬性的個(gè)數(shù)及屬性相同,按照屬性的順序依次讀取參數(shù)的值并給屬性賦值;
4) 用戶可以自定義構(gòu)造函數(shù),一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但每個(gè)構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)必須不同;
5) 如果用戶自定義了0個(gè)參數(shù)、或參數(shù)個(gè)數(shù)同屬性個(gè)數(shù)相同的構(gòu)造函數(shù),則會(huì)覆蓋相應(yīng)的默認(rèn)構(gòu)造函數(shù)。

定義JAVA類
定義通過(guò)CREATE JAVA CLASS語(yǔ)句來(lái)完成,其語(yǔ)法為:
語(yǔ)法格式
CREATE [OR REPLACE] JAVA [PUBLIC] [ABSTRACT] [FINAL] CLASS < 類名> [EXTENDS [< 模式名>.]< 父類名>] {< 類內(nèi)定義部分> }
< 類內(nèi)定義部分> ::= < 類內(nèi)定義列表>
< 類內(nèi)定義列表> ::= < 類內(nèi)定義>;{< 類內(nèi)定義>;}
< 類內(nèi)定義> ::= [PUBLIC|PRIVATE] < 變量定義>|< 方法定義>
< 變量定義> ::= < 變量屬性> < 數(shù)據(jù)類型>< 變量名列表> [默認(rèn)值定義]
< 變量屬性> ::= [STATIC]
< 方法定義> ::= [PUBLIC|PRIVATE] [< 方法繼承屬性>] [STATIC] < 返回類型> < 函數(shù)名>< 參數(shù)列表> { < 實(shí)現(xiàn)體> }
< 方法繼承屬性> ::= < 重載屬性> | |
::= ABSTRACT
::= FINAL
< 重載屬性> ::= OVERRIDE

使用說(shuō)明
1.類中元素可以以任意順序出現(xiàn),其中的對(duì)象必須在引用之前被聲明。
2.支持對(duì)象靜態(tài)方法聲明與調(diào)用??梢栽诜椒ㄇ疤砑觭tatic保留字,以此指明方法為靜態(tài)方法。靜態(tài)方法只能以對(duì)象名為前綴調(diào)用,而不能在對(duì)象實(shí)例中調(diào)用。
3.支持對(duì)象成員方法聲明與調(diào)用。非STATIC類型的非構(gòu)造函數(shù)方法默認(rèn)為成員方法。成員方法調(diào)用時(shí),需要先實(shí)例化,實(shí)例化參數(shù)值缺省為null。
4. 變量定義還包括游標(biāo)、異常定義。
5.方法屬性是PUBLIC,則訪問(wèn)類時(shí)可以訪問(wèn),如果是PRIVATE屬性,則訪問(wèn)類時(shí)不可以訪問(wèn)該方法。
6.關(guān)于JAVA 類繼承,有以下使用限制:
1) JAVA CLASS定義默認(rèn)可繼承,F(xiàn)INAL表示該類不能被繼承;
2) 定義子類時(shí)必須指定EXTENDS選項(xiàng);
3) ABSTRACT對(duì)象不能為FINAL;
4) ABSTRACT對(duì)象不能實(shí)例化,但是可以用其子類賦值;
5) 子類對(duì)象實(shí)例化時(shí),必須對(duì)父類和子類的成員變量都賦值,且從父類到子類逐個(gè)賦值;
6) 不支持對(duì)象的循環(huán)繼承;
7) 不支持對(duì)象的多繼承,即一個(gè)類只能有一個(gè)父類;
8) 不支持父類和子類包含同名變量;
9) 父類和子類可以同名同參,此時(shí)子類必須指定OVERRIDE;
10) 方法默認(rèn)為NOT OVERRIDING,OVERRIDING不能與static一起使用;
11) 父類和子類支持同名不同參(參數(shù)個(gè)數(shù)不同、參數(shù)個(gè)數(shù)相同但類型不同)的方法;
12) 同名且參數(shù)個(gè)數(shù)相同但類型不同時(shí),根據(jù)參數(shù)類型選擇使用的方法;
13) 方法如果聲明為ABSTRACT,則不能與FINAL、STATIC一起使用;
14) 如果父類有多個(gè)ABSTRACT方法,子類可以只部分重寫(xiě),但此時(shí)子類必須定義為ABSTRACT;
15) ABSTRACT方法不能具有主體;
16) 方法默認(rèn)為可繼承,如果聲明為FINAL,則不能被子類重寫(xiě);
17) 子類可以賦值給父類;
18) 如果父類對(duì)應(yīng)的實(shí)例是子類或者子類的孩子,則該父類可以賦值給子類;
19) 可以用ABSTRACT子類對(duì)非ABSTRACT父類進(jìn)行賦值;
20) 子類實(shí)例賦值給父類后,調(diào)用時(shí)使用的是父類方法而不是子類方法;
21) 支持使用super無(wú)參方法轉(zhuǎn)換為父類引用;
22) 支持使用this()調(diào)用該類構(gòu)造函數(shù),super()調(diào)用父類構(gòu)造函數(shù);
23) 子類必須有新增成員或方法,不能完全為空。

重編譯JAVA類
重新對(duì)JAVA類進(jìn)行編譯,如果重新編譯失敗,則將JAVA類置為禁止?fàn)顟B(tài)。
重編功能主要用于檢驗(yàn)JAVA類的正確性。
語(yǔ)法格式
ALTER JAVA CLASS [< 模式名>.] COMPILE [DEBUG];
參數(shù)
1.< 模式名> 指明被重編譯的JAVA類所屬的模式;
2. 指明被重編譯的JAVA類的名字;
3.[DEBUG] 可忽略。

所需權(quán)限
執(zhí)行該操作的用戶必須是JAVA類的創(chuàng)建者,或者具有DBA權(quán)限。
12.2.3 刪除JAVA類
JAVA類的刪除通過(guò)DROP CLASS完成。
語(yǔ)法格式
DROP CLASS < 類名>[RESTRICT | CASCADE];

類的使用
下面列舉一個(gè)簡(jiǎn)單的應(yīng)用實(shí)例。在列對(duì)象上如何使用JAVA CLASS。
1.創(chuàng)建JAVA CLASS。

SQL> create or replace java class jcls
2   {
3     int a;
4     public static int testAdd2(int a, int b)
5     { //此處創(chuàng)建的是靜態(tài)STATIC方法
6       return a + b;
7     }
8     public int testAdd3(int a, int b, int c)
9     { //此處創(chuàng)建的是成員方法
10     return a + b +c;
11    }
12  };
13  /
executed successfully
used time: 16.964(ms). Execute id is 123.

2. 在列對(duì)象中使用JAVA CLASS。

SQL> create table tt2(c1 int, c2 jcls);
executed successfully
used time: 9.261(ms). Execute id is 124.
SQL> insert into tt2 values(jcls.testadd2(1,2),jcls(1)); //靜態(tài)方法調(diào)用
2   /
affect rows 1
used time: 1.255(ms). Execute id is 125.
SQL> insert into tt2 values(jcls().testadd3(1,2,3),jcls(2)); //成員方法調(diào)用之前必須實(shí)例化
2   /
affect rows 1
used time: 1.023(ms). Execute id is 126.

感謝各位的閱讀,以上就是“DM類數(shù)據(jù)類型贊怎么使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)DM類數(shù)據(jù)類型贊怎么使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

dm
AI