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