達夢數據庫的CLASS類

達夢數據庫的CLASS類

達夢數據庫除了支持多種常用的數據類型,還支持CLASS類類型,達夢數據庫通過類類型在 DMSQL 程序中實現面向對象編程的支持。類將結構化的數據及對其進行操作的過程或函數封裝在一起,允許用戶根據現實世界的對象建模,而不必再將其抽象成關係數據。
達夢數據庫的類類型分爲普通類類型和 JAVA CLASS 類型。達夢文檔中的示例除了特別聲明,使用的都是普通類類型。
達夢數據庫類的定義分爲類頭和類體兩部分,類頭完成類的聲明;類體完成類的實現。類中可以包括以下內容:

1. 類型定義
在類中可以定義遊標、異常、記錄類型、數組類型、以及內存索引表等數據類型,在類的聲明及實現中可以使用這些數據類型;類的聲明中不能聲明遊標和異常,但是實現中可以定義和使用。

2. 屬性
類中的成員變量,數據類型可以是標準的數據類型,可以是在類中自定義的特殊數據類型。

3. 成員方法
類中的函數或過程,在類頭中進行聲明;其實現在類體中完成;
成員方法及後文的構造函數包含一個隱含參數,即自身對象,在方法實現中可以通過this 或 self 來訪問自身對象,self 等價於 this。如果不存在重名問題,也可以直接使用對象的屬性和方法。this 和 self 只能在包或對象腳本中調用。

4. 構造函數
構造函數是類內定義及實現的一種特殊的函數,這類函數用於實例化類的對象,構造函數滿足以下條件:
1) 函數名和類名相同;
2) 函數返回值類型爲自身類。

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

1、創建普通類CLASS類型
--類頭創建
create class mycls
as
type rec_type is record (c1 int, c2 int); --類型聲明
id int; --成員變量
r rec_type; --成員變量
--成員函數
function f1(a int, b int) return rec_type;
--用戶自定義構造函數
function mycls(id int , r_c1 int, r_c2 int) return mycls;
end;
/

--類體創建
create or replace class body mycls
as
function f1(a int, b int) return rec_type
as
begin
r.c1 = a;
r.c2 = b;
return r;
end;

function mycls(id int, r_c1 int, r_c2 int) return mycls
as
begin
    this.id = id; --可以使用 this.來訪問自身的成員
    r.c1 = r_c1; --this 也可以省略
    r.c2 = r_c2;
    return this; --使用 return this 返回本對象
end;

end;
/
達夢數據庫的CLASS類

2、使用CLASS類
使用類類型同普通的數據類型一樣,可以作爲表中列的數據類型,DMSQL 程序語句塊中變量的數據類型或過程及函數參數的數據類型。用DMSQL命令窗口執行返回的結果看不到輸出的內容,只能看到“DMSQL 過程已成功完成”,最好到DM管理工具裏的窗口查詢能看到返回結果。
declare
type ex_rec_t is record (a int, b int); --使用一個同結構的類型代替類定義的類型
rec ex_rec_t;
o1 mycls;
o2 mycls;
begin
o1 = new mycls(1,2,3);
o2 = o1; --對象引用
rec = o2.r; --變量對象的成員變量訪問
print rec.a; print rec.b;
rec = o1.f1(4,5); --成員函數調用
print rec.a; print rec.b;
print o1.id; --成員變量訪問
end;
達夢數據庫的CLASS類

3、編譯和刪除CLASS類
1)重編譯類:重新對類進行編譯,如果重新編譯失敗,則將類置爲禁止狀態。
alter class mycls compile;
2)刪除類:類的刪除分爲兩種方式:一是類頭的刪除,刪除類頭則會順帶將類體一起刪除;另外一種是類體的刪除,這種方式只能刪除類體,類頭依然存在。
drop class mycls;
達夢數據庫的CLASS類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章