DM自定義資料型別

eric0435發表於2020-03-18

自定義型別
使用者使用CREATE TYPE語句可以定義記錄型別、物件型別、命名的陣列型別、集合型別等,如果在物件型別中宣告瞭過程或方法,可以使用CREATE TYPE BODY定義這些過程和方法。

建立型別可以使用CREATE TYPE語句建立記錄型別、物件型別、陣列和集合型別。
語法格式
CREATE [OR REPLACE] TYPE [< 模式名>.]< 型別名>[WITH ENCRYPTION] [< 呼叫許可權子句>] AS|IS < 記錄型別定義子句>|< 物件型別定義子句>
|< 陣列型別定義子句>|< 集合型別定義子句>
[< 呼叫許可權子句>]::= AUTHID DEFINER
| AUTHID CURRENT_USER
< 物件型別定義子句> ::= OBJECT [UNDER [< 模式名>.]< 父型別名>] (< 物件定義>,{< 物件定義>})[[NOT] FINAL] [[NOT] INSTANTIABLE]
< 物件定義> ::= < 變數列表定義>|< 過程宣告>|< 函式宣告>|< 建構函式宣告>
< 過程宣告> ::= [< 方法繼承屬性>][STATIC|MEMBER] PROCEDURE < 過程名> < 引數列表>
< 函式宣告> ::= [< 方法繼承屬性>][MAP] [STATIC|MEMBER] FUNCTION < 函式名> < 引數列表> RETURN < 返回值資料型別>[DETERMINISTIC]
[PIPELINED]
< 方法繼承屬性> ::= < 過載屬性> | | < 過載屬性>
< 過載屬性> ::= [NOT] OVERRDING
::= FINAL | NOT FINAL | INSTANTIABLE | NOT INSTANTIABLE
< 建構函式宣告> ::= CONSTRUCTOR FUNCTION < 函式名> < 引數列表> RETURN SELF AS RESULT
< 記錄型別定義子句> ::= RECORD(變數列表定義)
< 陣列型別定義子句> ::= ARRAY < 資料型別>' [' [< 常量表示式>]{,[< 常量表示式>]}']'
< 集合型別定義子句> ::= < 陣列集合定義子句>|< 巢狀表定義子句>|< 索引表定義子句>
< 陣列集合定義子句> ::= VARRAY(< 常量表示式>) OF < 資料型別>
< 巢狀表定義子句> ::= TABLE OF < 資料型別>
< 索引表定義子句> ::= TABLE OF < 資料型別> [INDEX BY < 資料型別>]

使用說明
1. 物件型別中過程和函式的宣告都是前向宣告,型別定義中不包括任何實現程式碼;達夢繫統中物件型別與類是等價的。
2. 物件型別中過程和函式可以宣告為STATIC型別,表明為靜態過程或函式;也可以宣告為MEMBER,表明為成員過程或函式,非STATIC且非建構函式的方法預設為成員方法。MAP表示將物件型別的例項對映為標量數值,只能用於成員函式;
3. 關於物件型別的繼承,參考12.1節中類繼承的相關說明;
4. WITH ENCRYPTION 選項,指定是否對自定義型別定義進行加密;
5. 記錄型別的定義格式與物件型別類似,但記錄型別中不能有過程和函式宣告;
6. 在< 陣列型別定義子句>的陣列長度定義的[]內新增’,’可以定義多維陣列。若指定了常量表示式,則定義的是靜態陣列,其陣列長度是固定的。若沒有指定常量表示式,則定義的是動態陣列,其陣列長度是在使用時指定。理論上DM支援靜態陣列的每一個維度的最大長度為65534,動態陣列的每一個維度的最大長度為2147483646,但是陣列最大長度同時受系統內部空間大小的限制,如果超出堆疊/堆的空間限制,系統會報錯。
7. 陣列集合型別中的常量表示式定義了其最大容量,其陣列元素資料型別可以是基礎型別,也可以是自定義資料型別。
8. 巢狀表型別和索引表型別沒有元素個數限制,元素資料型別可以是基礎資料型別也可以是其它自定義型別或是物件、記錄、靜態陣列,但是不能是動態陣列;第二個則是索引表的下標型別,目前僅支援INTEGER/INT和VARCHAR兩種型別,分別代表整數下標和字串下標。對於VARCHAR型別,長度不能超過1024。

所需許可權
1. 使用該語句的使用者必須是DBA或具有CREATE TYPE資料庫許可權的使用者。
2.可以用關鍵字AUTHID DEFINER |AUTHID CURRENT_USER指定自定義型別的呼叫者許可權,若為DEFINER,則採用自定義型別定義者許可權,若為CURRENT_USER則為當前使用者許可權,預設為定義者許可權。

建立型別體對於物件型別中宣告的過程和函式,在型別體中進行實現。
語法格式
CREATE [OR REPLACE] TYPE 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
< 建構函式實現> ::= CONSTRUCTOR FUNCTION < 函式名> < 引數列表> RETURN SELF AS RESULT AS|IS BEGIN < 實現體> END [函式名]

使用說明
1. 物件型別體中的過程、函式定義必須和型別定義中的前向宣告完全相同。包括過程的名字、引數定義列表的引數名和資料型別定義;

所需許可權
使用該語句的使用者必須是DBA或該型別物件的擁有者且具有CREATE TYPE資料庫許可權的使用者。

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

所需許可權
執行該操作的使用者必須是型別的建立者,或者具有DBA許可權。

刪除型別
型別的刪除分為型別刪除和型別體的刪除。對於擁有型別體的物件型別,刪除型別會將型別體一起刪除;刪除型別體的話,型別本身依然存在。

刪除型別使用DROP TYPE完成型別的刪除。對於擁有型別體的物件型別,刪除型別會將型別體一起刪除。
語法格式
DROP TYPE [< 模式名>.]< 型別名>[RESTRICT | CASCADE];
使用說明
1.如果被刪除的型別不屬於當前模式,必須在語句中指明模式名;
2.如果一個擁有型別體的物件型別被刪除,那麼對應的型別體被自動刪除。

所需許可權
執行該操作的使用者必須是該型別的擁有者,或者具有DBA許可權。

刪除型別體
使用DROP TYPE BODY刪除一個物件型別的型別體。
語法格式
DROP TYPE BODY [< 模式名>.]< 型別名>[RESTRICT | CASCADE]; 使用說明
如果被刪除的型別體不屬於當前模式,必須在語句中指明模式名。

所需許可權
執行該操作的使用者必須是該型別的擁有者,或者具有DBA許可權。

自定義型別的使用
使用規則
1. 物件型別與類等價,類的使用規則可詳見第12章《類型別》;
2. 建立的記錄型別、陣列型別和集合型別,可以直接在DMSQL程式語句塊中使用,不必在語句塊中宣告型別,使用方式可參見10.1.1節部分;

3. 使用者自定義資料型別可以作為其他使用者自定義資料型別的元素型別或成員變數型別;
4. 只有物件型別可以直接作為表中列的資料型別;其他型別只能作為物件型別中成員變數的型別或型別中巢狀使用的資料型別。但含有索引表型別和遊標型別的物件型別也不能作為表中列的資料型別。

應用例項
建立一個用來表示複數的物件型別,有實數部分和虛數部分,並實現了複數的加與減的操作。

SQL> CREATE TYPE COMPLEX AS OBJECT(
2     RPART REAL,
3     IPART REAL,
4     FUNCTION PLUS(X COMPLEX) RETURN COMPLEX,
5     FUNCTION LES(X COMPLEX) RETURN COMPLEX
6   );
7   /
executed successfully
used time: 53.553(ms). Execute id is 128
SQL> CREATE TYPE BODY COMPLEX AS
2     FUNCTION PLUS(X COMPLEX) RETURN COMPLEX IS
3     BEGIN
4      RETURN COMPLEX(RPART+X.RPART, IPART+X.IPART);
5     END;
6     FUNCTION LES(X COMPLEX) RETURN COMPLEX IS
7     BEGIN
8      RETURN COMPLEX(RPART-X.RPART, IPART-X.IPART);
9     END;
10  END;
11  /
executed successfully
used time: 14.330(ms). Execute id is 129.

建立表c_tab,表中的第二列的列型別為complex物件型別。

SQL> CREATE TABLE C_TAB(C1 INT, C2 COMPLEX);
executed successfully
used time: 16.381(ms). Execute id is 130.
SQL> INSERT INTO C_TAB VALUES(1, COMPLEX(2,3));
affect rows 1
used time: 1.508(ms). Execute id is 131.

向表c_tab中插入資料

SQL> INSERT INTO C_TAB VALUES(2, COMPLEX(4,2).PLUS(COMPLEX(2,3)));
affect rows 1
used time: 0.969(ms). Execute id is 132.
SQL> commit;
executed successfully
used time: 10.709(ms). Execute id is 133.
SQL> select * from c_tab;
LINEID     C1          C2
---------- ----------- -------------------
1          1           SYSDBA.COMPLEX(2,3)
2          2           SYSDBA.COMPLEX(6,5)
used time: 1.047(ms). Execute id is 134.

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2681033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章