中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

DM類數據類型贊怎么使用

發布時間:2021-12-21 17:16:52 來源:億速云 閱讀:156 作者:iii 欄目:數據庫

這篇文章主要講解了“DM類數據類型贊怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“DM類數據類型贊怎么使用”吧!

類類型
DM7通過類類型在DMSQL程序中實現面向對象編程的支持。類將結構化的數據及對其進行操作的過程或函數封裝在一起。允許用戶根據現實世界的對象建模,而不必再將其抽象成關系數據。

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

普通CLASS類型
DM7的類的定義分為類頭和類體兩部分,類頭完成類的聲明;類體完成類的實現。類中可以包括以下內容:
1. 類型定義
在類中可以定義游標、異常、記錄類型、數組類型、以及內存索引表等數據類型,在類的聲明及實現中可以使用這些數據類型;類的聲明中不能聲明游標和異常,但是實現中可以定義和使用。
2. 屬性
類中的成員變量,數據類型可以是標準的數據類型,可以是在類中自定義的特殊數據類型。
3. 成員方法
類中的函數或過程,在類頭中進行聲明;其實現在類體中完成;
成員方法及后文的構造函數包含一個隱含參數,即自身對象,在方法實現中可以通過this或self來訪問自身對象,self等價于this。如果不存在重名問題,也可以直接使用對象的屬性和方法。this和self只能在包或對象腳本中調用。

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

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

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

所需權限
1、使用該語句的用戶必須是DBA或具有CREATE CLASS數據庫權限的用戶;
2、可以用關鍵字AUTHID DEFINER |AUTHID CURRENT_USER指定類的調用者權限,若為DEFINER,則采用類定義者權限,若為CURRENT_USER則為當前用戶權限,默認為類定義者權限。

類的實現通過類體完成。類體的定義通過CREATE CLASS BODY語句來完成,其語法為:
語法格式
CREATE [OR REPLACE] CLASS BODY [< 模式名>.]< 類名> [WITH ENCRYPTION] AS|IS < 類體部分> END [類名]
< 類體部分> ::= < 過程/函數列表> [< 初始化代碼>]
< 過程/函數列表> ::= < 過程實現|函數實現>{,< 過程實現|函數實現> }
< 過程實現> ::= [< 方法繼承屬性>][STATIC|MEMBER]PROCEDURE < 過程名> < 參數列表> AS|IS BEGIN < 實現體> END [過程名]
< 函數實現> ::= [< 方法繼承屬性>][MAP] [STATIC|MEMBER]FUNCTION < 函數名>< 參數列表> RETURN < 返回值數據類型>[DETERMINISTIC] [PIPELINED] AS|IS BEGIN < 實現體> END [函數名]
< 方法繼承屬性> ::= < 重載屬性> | | < 重載屬性>
< 重載屬性> ::= [NOT] OVERRDING
::= FINAL | NOT FINAL | INSTANTIABLE | NOT INSTANTIABLE
< 初始化代碼> ::= [[< 說明部分>]BEGIN< 執行部分>[< 異常處理部分>]]
< 說明部分> ::=[DECLARE]< 說明定義>{< 說明定義>}
< 說明定義>::=< 變量說明>|< 異常變量說明>|< 游標定義>|< 子過程定義>|< 子函數定義>
< 變量說明>::=< 變量名>{,< 變量名>}< 變量類型>[DEFAULT|ASSIGN|:=< 表達式>];
< 變量類型>::=|< [模式名.]表名.列名%TYPE>|< [模式名.]表名%ROWTYPE>|< 記錄類型>
< 記錄類型>::= RECORD(< 變量名> {,< 變量名> })
< 異常變量說明>::=< 異常變量名>EXCEPTION[FOR< 錯誤號>]
< 異常處理語句>::= WHEN < 異常名> THEN < SQL過程語句序列>

使用說明
1. 類聲明中定義的對象對于類體而言都是可見的,不需要聲明就可以直接引用。這些對象包括變量、游標、異常定義和類型定義;
2. 類體中的過程、函數定義必須和類聲明中的聲明完全相同。包括過程的名字、參數定義列表的參數名和數據類型定義;
3. 類中可以有重名的成員方法,要求其參數定義列表各不相同。系統會根據用戶的調用情況進行重載(OVERLOAD);
4. 聲明類與實現類時,對于確定性函數的指定邏輯與包內函數相同。目前不支持類的確定性函數在函數索引中使用。

所需權限
使用該語句的用戶必須是DBA或該類對象的擁有者且具有CREATE CLASS數據庫權限的用戶。
完整的類頭、類體的創建如下所示:
----類頭創建

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; --成員函數
7   function mycls(id int , r_c1 int, r_c2 int) return mycls;
8   --用戶自定義構造函數
9   end;
10  /
executed successfully
used time: 14.032(ms). Execute id is 106.

----類體創建

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.來訪問自身的成員
14    r.c1 = r_c1; --this也可以省略
15    r.c2 = r_c2;
16    return this; --使用return this 返回本對象
17   end;
18  end;
19  /
executed successfully
used time: 61.783(ms). Execute id is 107.

重編譯類
重新對類進行編譯,如果重新編譯失敗,則將類置為禁止狀態。
重編功能主要用于檢驗類的正確性。
語法格式
ALTER CLASS [< 模式名>.]< 類名> COMPILE [DEBUG];

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

所需權限
執行該操作的用戶必須是類的創建者,或者具有DBA權限。
舉例說明
例如重新編譯類

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

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

刪除類頭
類的刪除通過DROP CLASS完成,即類頭的刪除。刪除類頭的同時會一并刪除類體。
語法格式
DROP CLASS [< 模式名>.]< 類名>[RESTRICT | CASCADE]; 使用說明
1.如果被刪除的類不屬于當前模式,必須在語句中指明模式名;
2.如果一個類的聲明被刪除,那么對應的類體被自動刪除。

所需權限
執行該操作的用戶必須是該類的擁有者,或者具有DBA權限。

刪除類體
從數據庫中刪除一個類的實現主體對象。
語法格式
DROP CLASS BODY [< 模式名>.]< 類名>[RESTRICT | CASCADE]; 使用說明
如果被刪除的類不屬于當前模式,必須在語句中指明模式名。
權限
執行該操作的用戶必須是該類的擁有者,或者具有DBA權限。

類的使用
類類型同普通的數據類型一樣,可以作為表中列的數據類型,DMSQL程序語句塊中變量的數據類型或過程及函數參數的數據類型。

具體使用規則
1.作為表中列類型或其他類成員變量屬性的類不能被修改,刪除時需要指定CASCADE級聯刪除類中定義的數據類型,其名稱只在類的聲明及實現中有效。如果類內的函數的參數或返回值是類內的數據類型,或是進行類內成員變量的復制,需要在DMSQL程序中定義一個結構與之相同的類型。

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

2.變量對象的實例化
類的實例化通過NEW 表達式調用構造函數完成。
3.變量對象的引用
通過‘=’進行的類類型變量之間的賦值所進行的是對象的引用,并沒有復制一個新的對象。

4.變量對象屬性訪問
可以通過如下方式進行屬性的訪問。
< 對象名>.< 屬性名>
5.變量對象成員方法調用
成員方法的調用通過以下方式調用:
< 對象名>.< 成員方法名>(< 參數>{,< 參數>})
如果函數內修改了對象內屬性的值,則該修改生效。
6.列對象的插入
列對象的創建是通過INSERT語句向表中插入數據完成,插入語句中的值是變量對象,插入后存儲在表中的數據即為列對象。
7.列對象的復制
存儲在表中的對象不允許對對象中成員變量的修改,通過into查詢或’=’進行的列到變量的賦值所進行的是對象的賦值,生成了一個與列對象數據一樣的副本,在該副本上進行的修改不會影響表中列對象的值。
8.列對象的屬性訪問
通過如下方式進行屬性的訪問:
< 列名>.< 屬性名>
9.列對象的方法調用
< 列名>.< 成員方法名>(< 參數>{,< 參數>})
列對象方法調用過程中對類型內屬性的修改,都是在列對象的副本上進行的,不會影響列對象的值。

應用實例
1. 變量對象的應用實例

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

2. 列對象的應用實例
表的創建。

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

列對象的創建--插入數據。

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.

列對象的復制及訪問。

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

3. 類繼承的應用實例

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語言語法,類中可定義。
JAVA類中可以包括以下內容:
1. 類型定義
在類中可以定義游標、異常,可以聲明記錄類型、數組類型、結構體類型以及內存索引表等數據類型變量。
2. 屬性
類中的成員變量,數據類型可以是標準的數據類型,可以是在類外自定義的特殊數據類型。
3. 成員方法
JAVA類中的成員方法及后文的構造函數包含一個隱含參數,即自身對象,在方法實現中可以通過this或self來訪問自身對象,self等價于this。如果不存在重名問題,也可以直接使用對象的屬性和方法。
4. 構造函數
構造函數是類內定義及實現的一種特殊的函數,這類函數用于實例化類的對象,構造函數滿足以下條件:
1) 函數名和類名相同;
2) 函數沒有返回值類型。
構造函數存在以下的約束:
1) 系統為每個類提供兩個默認的構造函數,分別為0參的構造函數和全參的構造函數;
2) 0參構造函數的參數個數為0,實例的對象內所有的屬性初始化值為NULL;
3) 全參構造函數的參數個數及類型和類內屬性的個數及屬性相同,按照屬性的順序依次讀取參數的值并給屬性賦值;
4) 用戶可以自定義構造函數,一個類可以有多個構造函數,但每個構造函數的參數個數必須不同;
5) 如果用戶自定義了0個參數、或參數個數同屬性個數相同的構造函數,則會覆蓋相應的默認構造函數。

定義JAVA類
定義通過CREATE JAVA CLASS語句來完成,其語法為:
語法格式
CREATE [OR REPLACE] JAVA [PUBLIC] [ABSTRACT] [FINAL] CLASS < 類名> [EXTENDS [< 模式名>.]< 父類名>] {< 類內定義部分> }
< 類內定義部分> ::= < 類內定義列表>
< 類內定義列表> ::= < 類內定義>;{< 類內定義>;}
< 類內定義> ::= [PUBLIC|PRIVATE] < 變量定義>|< 方法定義>
< 變量定義> ::= < 變量屬性> < 數據類型>< 變量名列表> [默認值定義]
< 變量屬性> ::= [STATIC]
< 方法定義> ::= [PUBLIC|PRIVATE] [< 方法繼承屬性>] [STATIC] < 返回類型> < 函數名>< 參數列表> { < 實現體> }
< 方法繼承屬性> ::= < 重載屬性> | |
::= ABSTRACT
::= FINAL
< 重載屬性> ::= OVERRIDE

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

重編譯JAVA類
重新對JAVA類進行編譯,如果重新編譯失敗,則將JAVA類置為禁止狀態。
重編功能主要用于檢驗JAVA類的正確性。
語法格式
ALTER JAVA CLASS [< 模式名>.] COMPILE [DEBUG];
參數
1.< 模式名> 指明被重編譯的JAVA類所屬的模式;
2. 指明被重編譯的JAVA類的名字;
3.[DEBUG] 可忽略。

所需權限
執行該操作的用戶必須是JAVA類的創建者,或者具有DBA權限。
12.2.3 刪除JAVA類
JAVA類的刪除通過DROP CLASS完成。
語法格式
DROP CLASS < 類名>[RESTRICT | CASCADE];

類的使用
下面列舉一個簡單的應用實例。在列對象上如何使用JAVA CLASS。
1.創建JAVA CLASS。

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

2. 在列對象中使用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)); //靜態方法調用
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)); //成員方法調用之前必須實例化
2   /
affect rows 1
used time: 1.023(ms). Execute id is 126.

感謝各位的閱讀,以上就是“DM類數據類型贊怎么使用”的內容了,經過本文的學習后,相信大家對DM類數據類型贊怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

dm
AI

湘西| 仙居县| 胶州市| 喜德县| 河北省| 尖扎县| 峨眉山市| 左云县| 探索| 恩施市| 祥云县| 马公市| 定远县| 潮州市| 白银市| 大埔县| 云南省| 南溪县| 巴楚县| 安西县| 福海县| 广宗县| 连南| 永胜县| 宜宾县| 美姑县| 宜丰县| 湘阴县| 井陉县| 兴山县| 乌拉特前旗| 共和县| 信阳市| 哈尔滨市| 宜君县| 长岛县| 昌黎县| 平顶山市| 安塞县| 长海县| 舞阳县|