自定義類型
用戶使用CREATE TYPE語(yǔ)句可以定義記錄類型、對(duì)象類型、命名的數(shù)組類型、集合類型等,如果在對(duì)象類型中聲明了過(guò)程或方法,可以使用CREATE TYPE BODY定義這些過(guò)程和方法。
創(chuàng)建類型可以使用CREATE TYPE語(yǔ)句創(chuàng)建記錄類型、對(duì)象類型、數(shù)組和集合類型。
語(yǔ)法格式
CREATE [OR REPLACE] TYPE [< 模式名>.]< 類型名>[WITH ENCRYPTION] [< 調(diào)用權(quán)限子句>] AS|IS < 記錄類型定義子句>|< 對(duì)象類型定義子句>
|< 數(shù)組類型定義子句>|< 集合類型定義子句>
[< 調(diào)用權(quán)限子句>]::= AUTHID DEFINER
| AUTHID CURRENT_USER
< 對(duì)象類型定義子句> ::= OBJECT [UNDER [< 模式名>.]< 父類型名>] (< 對(duì)象定義>,{< 對(duì)象定義>})[[NOT] FINAL] [[NOT] INSTANTIABLE]
< 對(duì)象定義> ::= < 變量列表定義>|< 過(guò)程聲明>|< 函數(shù)聲明>|< 構(gòu)造函數(shù)聲明>
< 過(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
< 構(gòu)造函數(shù)聲明> ::= CONSTRUCTOR FUNCTION < 函數(shù)名> < 參數(shù)列表> RETURN SELF AS RESULT
< 記錄類型定義子句> ::= RECORD(變量列表定義)
< 數(shù)組類型定義子句> ::= ARRAY < 數(shù)據(jù)類型>' [' [< 常量表達(dá)式>]{,[< 常量表達(dá)式>]}']'
< 集合類型定義子句> ::= < 數(shù)組集合定義子句>|< 嵌套表定義子句>|< 索引表定義子句>
< 數(shù)組集合定義子句> ::= VARRAY(< 常量表達(dá)式>) OF < 數(shù)據(jù)類型>
< 嵌套表定義子句> ::= TABLE OF < 數(shù)據(jù)類型>
< 索引表定義子句> ::= TABLE OF < 數(shù)據(jù)類型> [INDEX BY < 數(shù)據(jù)類型>]
使用說(shuō)明
1. 對(duì)象類型中過(guò)程和函數(shù)的聲明都是前向聲明,類型定義中不包括任何實(shí)現(xiàn)代碼;達(dá)夢(mèng)系統(tǒng)中對(duì)象類型與類是等價(jià)的。
2. 對(duì)象類型中過(guò)程和函數(shù)可以聲明為STATIC類型,表明為靜態(tài)過(guò)程或函數(shù);也可以聲明為MEMBER,表明為成員過(guò)程或函數(shù),非STATIC且非構(gòu)造函數(shù)的方法缺省為成員方法。MAP表示將對(duì)象類型的實(shí)例映射為標(biāo)量數(shù)值,只能用于成員函數(shù);
3. 關(guān)于對(duì)象類型的繼承,參考12.1節(jié)中類繼承的相關(guān)說(shuō)明;
4. WITH ENCRYPTION 選項(xiàng),指定是否對(duì)自定義類型定義進(jìn)行加密;
5. 記錄類型的定義格式與對(duì)象類型類似,但記錄類型中不能有過(guò)程和函數(shù)聲明;
6. 在< 數(shù)組類型定義子句>的數(shù)組長(zhǎng)度定義的[]內(nèi)添加’,’可以定義多維數(shù)組。若指定了常量表達(dá)式,則定義的是靜態(tài)數(shù)組,其數(shù)組長(zhǎng)度是固定的。若沒(méi)有指定常量表達(dá)式,則定義的是動(dòng)態(tài)數(shù)組,其數(shù)組長(zhǎng)度是在使用時(shí)指定。理論上DM支持靜態(tài)數(shù)組的每一個(gè)維度的大長(zhǎng)度為65534,動(dòng)態(tài)數(shù)組的每一個(gè)維度的大長(zhǎng)度為2147483646,但是數(shù)組大長(zhǎng)度同時(shí)受系統(tǒng)內(nèi)部空間大小的限制,如果超出堆棧/堆的空間限制,系統(tǒng)會(huì)報(bào)錯(cuò)。
7. 數(shù)組集合類型中的常量表達(dá)式定義了其大容量,其數(shù)組元素?cái)?shù)據(jù)類型可以是基礎(chǔ)類型,也可以是自定義數(shù)據(jù)類型。
8. 嵌套表類型和索引表類型沒(méi)有元素個(gè)數(shù)限制,元素?cái)?shù)據(jù)類型可以是基礎(chǔ)數(shù)據(jù)類型也可以是其它自定義類型或是對(duì)象、記錄、靜態(tài)數(shù)組,但是不能是動(dòng)態(tài)數(shù)組;第二個(gè)則是索引表的下標(biāo)類型,目前僅支持INTEGER/INT和VARCHAR兩種類型,分別代表整數(shù)下標(biāo)和字符串下標(biāo)。對(duì)于VARCHAR類型,長(zhǎng)度不能超過(guò)1024。
所需權(quán)限
1. 使用該語(yǔ)句的用戶必須是DBA或具有CREATE TYPE數(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)限。
創(chuàng)建類型體對(duì)于對(duì)象類型中聲明的過(guò)程和函數(shù),在類型體中進(jìn)行實(shí)現(xiàn)。
語(yǔ)法格式
CREATE [OR REPLACE] TYPE BODY [< 模式名>.]< 類型名>[WITH ENCRYPTION] AS|IS < 對(duì)象類型體定義子句> END
< 對(duì)象類型體定義子句>::= < 對(duì)象類型體定義>,{< 對(duì)象類型體定義>}
< 對(duì)象類型體定義>::= < 過(guò)程實(shí)現(xiàn)>|< 函數(shù)實(shí)現(xiàn)>|< 構(gòu)造函數(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
< 構(gòu)造函數(shù)實(shí)現(xiàn)> ::= CONSTRUCTOR FUNCTION < 函數(shù)名> < 參數(shù)列表> RETURN SELF AS RESULT AS|IS BEGIN < 實(shí)現(xiàn)體> END [函數(shù)名]
使用說(shuō)明
1. 對(duì)象類型體中的過(guò)程、函數(shù)定義必須和類型定義中的前向聲明完全相同。包括過(guò)程的名字、參數(shù)定義列表的參數(shù)名和數(shù)據(jù)類型定義;
所需權(quán)限
使用該語(yǔ)句的用戶必須是DBA或該類型對(duì)象的擁有者且具有CREATE TYPE數(shù)據(jù)庫(kù)權(quán)限的用戶。
重編譯類型
重新對(duì)類型進(jìn)行編譯,如果重新編譯失敗,則將類型置為禁止?fàn)顟B(tài)。
重編功能主要用于檢驗(yàn)類型的正確性。
語(yǔ)法格式
ALTER TYPE [< 模式名>.]< 類型名> COMPILE [DEBUG];
參數(shù)
1.< 模式名> 指明被重編譯的類型所屬的模式;
2.< 類型名> 指明被重編譯的類型的名字;
3.[DEBUG] 可忽略。
所需權(quán)限
執(zhí)行該操作的用戶必須是類型的創(chuàng)建者,或者具有DBA權(quán)限。
刪除類型
類型的刪除分為類型刪除和類型體的刪除。對(duì)于擁有類型體的對(duì)象類型,刪除類型會(huì)將類型體一起刪除;刪除類型體的話,類型本身依然存在。
刪除類型使用DROP TYPE完成類型的刪除。對(duì)于擁有類型體的對(duì)象類型,刪除類型會(huì)將類型體一起刪除。
語(yǔ)法格式
DROP TYPE [< 模式名>.]< 類型名>[RESTRICT | CASCADE];
使用說(shuō)明
1.如果被刪除的類型不屬于當(dāng)前模式,必須在語(yǔ)句中指明模式名;
2.如果一個(gè)擁有類型體的對(duì)象類型被刪除,那么對(duì)應(yīng)的類型體被自動(dòng)刪除。
所需權(quán)限
執(zhí)行該操作的用戶必須是該類型的擁有者,或者具有DBA權(quán)限。
刪除類型體
使用DROP TYPE BODY刪除一個(gè)對(duì)象類型的類型體。
語(yǔ)法格式
DROP TYPE BODY [< 模式名>.]< 類型名>[RESTRICT | CASCADE]; 使用說(shuō)明
如果被刪除的類型體不屬于當(dāng)前模式,必須在語(yǔ)句中指明模式名。
所需權(quán)限
執(zhí)行該操作的用戶必須是該類型的擁有者,或者具有DBA權(quán)限。
自定義類型的使用
使用規(guī)則
1. 對(duì)象類型與類等價(jià),類的使用規(guī)則可詳見(jiàn)第12章《類類型》;
2. 創(chuàng)建的記錄類型、數(shù)組類型和集合類型,可以直接在DMSQL程序語(yǔ)句塊中使用,不必在語(yǔ)句塊中聲明類型,使用方式可參見(jiàn)10.1.1節(jié)部分;
3. 用戶自定義數(shù)據(jù)類型可以作為其他用戶自定義數(shù)據(jù)類型的元素類型或成員變量類型;
4. 只有對(duì)象類型可以直接作為表中列的數(shù)據(jù)類型;其他類型只能作為對(duì)象類型中成員變量的類型或類型中嵌套使用的數(shù)據(jù)類型。但含有索引表類型和游標(biāo)類型的對(duì)象類型也不能作為表中列的數(shù)據(jù)類型。
應(yīng)用實(shí)例
創(chuàng)建一個(gè)用來(lái)表示復(fù)數(shù)的對(duì)象類型,有實(shí)數(shù)部分和虛數(shù)部分,并實(shí)現(xiàn)了復(fù)數(shù)的加與減的操作。
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對(duì)象類型。
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中插入數(shù)據(jù)
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.
網(wǎng)站標(biāo)題:DM自定義數(shù)據(jù)類型-創(chuàng)新互聯(lián)
文章來(lái)源:http://jinyejixie.com/article42/dpojhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、標(biāo)簽優(yōu)化、網(wǎng)站制作、網(wǎng)站導(dǎo)航、虛擬主機(jī)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
移動(dòng)網(wǎng)站建設(shè)知識(shí)