達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8 SQL程序設(shè)計(jì)_第1頁(yè)
達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8 SQL程序設(shè)計(jì)_第2頁(yè)
達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8 SQL程序設(shè)計(jì)_第3頁(yè)
達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8 SQL程序設(shè)計(jì)_第4頁(yè)
達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8 SQL程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩131頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、DM8SQL 程序設(shè)計(jì)Service manual of DM8_Sql_ProgramDM8SQL 程序設(shè)計(jì) PAGE * ROMAN VI前言概述DMSQL 程序是 DM 提供的一種過(guò)程化 SQL 語(yǔ)言。本文檔介紹了 DMSQL 程序支持的各種語(yǔ)法、功能及其使用方法,并提供了大量示例。讀者在閱讀完本文檔后可以自行設(shè)計(jì)較為復(fù)雜的DMSQL 程序以實(shí)現(xiàn)復(fù)雜應(yīng)用邏輯。讀者對(duì)象本文檔主要適用于DM 數(shù)據(jù)庫(kù)的:開(kāi)發(fā)工程師測(cè)試工程師技術(shù)支持工程師數(shù)據(jù)庫(kù)管理員通用約定在本文檔中可能出現(xiàn)下列標(biāo)志,它們所代表的含義如下:表 0.1 標(biāo)志含義標(biāo)志說(shuō)明表示可能導(dǎo)致系統(tǒng)損壞、數(shù)據(jù)丟失或不可預(yù)知的結(jié)果。表示可能導(dǎo)致

2、性能降低、服務(wù)不可用??梢詭椭鉀Q某個(gè)問(wèn)題或節(jié)省您的時(shí)間。表示正文的附加信息,是對(duì)正文的強(qiáng)調(diào)和補(bǔ)充。在本文檔中可能出現(xiàn)下列格式,它們所代表的含義如下:表 0.2 格式含義格式說(shuō)明宋體表示正文。Courier new表示代碼或者屏幕顯示內(nèi)容。粗體表示命令行中的關(guān)鍵字(命令中保持不變、必須照輸?shù)牟糠郑┗蛘哒闹袕?qiáng)調(diào)的內(nèi)容。標(biāo)題、警告、注意、小竅門(mén)、說(shuō)明等內(nèi)容均采用粗體。語(yǔ)法符號(hào)中,表示一個(gè)語(yǔ)法對(duì)象。:=語(yǔ)法符號(hào)中,表示定義符,用來(lái)定義一個(gè)語(yǔ)法對(duì)象。定義符左邊為語(yǔ)法對(duì)象,右邊為相應(yīng)的語(yǔ)法描述。|語(yǔ)法符號(hào)中,表示或者符,限定的語(yǔ)法選項(xiàng)在實(shí)際語(yǔ)句中只能出現(xiàn)一個(gè)。 語(yǔ)法符號(hào)中,大括號(hào)內(nèi)的語(yǔ)法選項(xiàng)在實(shí)際的

3、語(yǔ)句中可以出現(xiàn) 0N 次(N 為大于 0 的自然數(shù)),但是大括號(hào)本身不能出現(xiàn)在語(yǔ)句中。 語(yǔ)法符號(hào)中,中括號(hào)內(nèi)的語(yǔ)法選項(xiàng)在實(shí)際的語(yǔ)句中可以出現(xiàn) 01 次,但是中括號(hào)本身不能出現(xiàn)在語(yǔ)句中。關(guān)鍵字關(guān)鍵字在 DM_SQL 語(yǔ)言中具有特殊意義,在 SQL 語(yǔ)法描述中,關(guān)鍵字以大寫(xiě)形式出現(xiàn)。但在實(shí)際書(shū)寫(xiě) SQL 語(yǔ)句時(shí),關(guān)鍵字既可以大寫(xiě)也可以小寫(xiě)。目 錄 HYPERLINK l _bookmark0 概述1 HYPERLINK l _bookmark1 DMSQL 程序簡(jiǎn)介1 HYPERLINK l _bookmark2 使用 DMSQL 程序的優(yōu)點(diǎn)1 HYPERLINK l _bookmark3 一個(gè)簡(jiǎn)

4、單的 DMSQL 程序示例2 HYPERLINK l _bookmark4 DMSQL 程序數(shù)據(jù)類(lèi)型與操作符4 HYPERLINK l _bookmark5 常規(guī)數(shù)據(jù)類(lèi)型4 HYPERLINK l _bookmark6 數(shù)值數(shù)據(jù)類(lèi)型4 HYPERLINK l _bookmark7 字符數(shù)據(jù)類(lèi)型7 HYPERLINK l _bookmark8 多媒體數(shù)據(jù)類(lèi)型8 HYPERLINK l _bookmark9 日期時(shí)間數(shù)據(jù)類(lèi)型9 HYPERLINK l _bookmark10 BOOL/BOOLEAN 數(shù)據(jù)類(lèi)型12 HYPERLINK l _bookmark11 %TYPE 和%ROWTYPE12

5、HYPERLINK l _bookmark12 記錄類(lèi)型14 HYPERLINK l _bookmark13 數(shù)組類(lèi)型16 HYPERLINK l _bookmark14 靜態(tài)數(shù)組類(lèi)型16 HYPERLINK l _bookmark15 動(dòng)態(tài)數(shù)組類(lèi)型17 HYPERLINK l _bookmark16 復(fù)雜類(lèi)型數(shù)組19 HYPERLINK l _bookmark17 集合類(lèi)型21 HYPERLINK l _bookmark18 VARRAY21 HYPERLINK l _bookmark19 索引表22 HYPERLINK l _bookmark20 嵌套表25 HYPERLINK l _bo

6、okmark21 集合類(lèi)型支持的方法26 HYPERLINK l _bookmark22 類(lèi)類(lèi)型30 HYPERLINK l _bookmark23 子類(lèi)型30 HYPERLINK l _bookmark24 操作符30 HYPERLINK l _bookmark25 DMSQL 程序的定義、調(diào)用與刪除32 HYPERLINK l _bookmark26 存儲(chǔ)過(guò)程32 HYPERLINK l _bookmark27 存儲(chǔ)函數(shù)34 HYPERLINK l _bookmark28 客戶(hù)端 DMSQL 程序37 HYPERLINK l _bookmark29 3.4 參數(shù)38 HYPERLINK l

7、 _bookmark30 3.5 變量40 HYPERLINK l _bookmark31 使用 OR REPLACE 選項(xiàng)43 HYPERLINK l _bookmark32 調(diào)用權(quán)限子句43 HYPERLINK l _bookmark33 調(diào)用、重新編譯與刪除存儲(chǔ)模塊43 HYPERLINK l _bookmark34 調(diào)用存儲(chǔ)模塊43 HYPERLINK l _bookmark35 重新編譯存儲(chǔ)模塊45 HYPERLINK l _bookmark36 刪除存儲(chǔ)模塊45 HYPERLINK l _bookmark37 DMSQL 程序中的各種控制結(jié)構(gòu)47 HYPERLINK l _book

8、mark38 語(yǔ)句塊47 HYPERLINK l _bookmark39 分支結(jié)構(gòu)49 HYPERLINK l _bookmark40 IF 語(yǔ)句49 HYPERLINK l _bookmark41 CASE 語(yǔ)句53 HYPERLINK l _bookmark42 SWITCH 語(yǔ)句55 HYPERLINK l _bookmark43 循環(huán)控制結(jié)構(gòu)56 HYPERLINK l _bookmark44 LOOP 語(yǔ)句56 HYPERLINK l _bookmark45 WHILE 語(yǔ)句57 HYPERLINK l _bookmark46 FOR 語(yǔ)句58 HYPERLINK l _bookma

9、rk47 REPEAT 語(yǔ)句59 HYPERLINK l _bookmark48 FORALL 語(yǔ)句60 HYPERLINK l _bookmark49 EXIT 語(yǔ)句61 HYPERLINK l _bookmark50 CONTINUE 語(yǔ)句64 HYPERLINK l _bookmark51 順序結(jié)構(gòu)66 HYPERLINK l _bookmark52 GOTO 語(yǔ)句66 HYPERLINK l _bookmark53 NULL 語(yǔ)句67 HYPERLINK l _bookmark54 其他語(yǔ)句68 HYPERLINK l _bookmark55 賦值語(yǔ)句68 HYPERLINK l _b

10、ookmark56 調(diào)用語(yǔ)句69 HYPERLINK l _bookmark57 RETURN 語(yǔ)句71 HYPERLINK l _bookmark58 PRINT 語(yǔ)句71 HYPERLINK l _bookmark59 PIPE ROW 語(yǔ)句72 HYPERLINK l _bookmark60 DMSQL 程序中的 SQL 語(yǔ)句74 HYPERLINK l _bookmark61 普通靜態(tài) SQL 語(yǔ)句74 HYPERLINK l _bookmark62 數(shù)據(jù)操縱74 HYPERLINK l _bookmark63 數(shù)據(jù)查詢(xún)75 HYPERLINK l _bookmark64 事務(wù)控制76

11、 HYPERLINK l _bookmark65 5.2 游標(biāo)77 HYPERLINK l _bookmark66 靜態(tài)游標(biāo)77 HYPERLINK l _bookmark67 動(dòng)態(tài)游標(biāo)83 HYPERLINK l _bookmark68 游標(biāo)變量(引用游標(biāo))85 HYPERLINK l _bookmark69 使用游標(biāo)更新、刪除數(shù)據(jù)86 HYPERLINK l _bookmark70 使用游標(biāo) FOR 循環(huán)87 HYPERLINK l _bookmark71 動(dòng)態(tài) SQL89 HYPERLINK l _bookmark72 返回查詢(xún)結(jié)果集92 HYPERLINK l _bookmark73

12、自治事務(wù)93 HYPERLINK l _bookmark74 定義自治事務(wù)93 HYPERLINK l _bookmark75 自治事務(wù)完整性與死鎖檢測(cè)94 HYPERLINK l _bookmark76 自治事務(wù)嵌套95 HYPERLINK l _bookmark77 DMSQL 程序異常處理97 HYPERLINK l _bookmark78 異常處理的優(yōu)點(diǎn)97 HYPERLINK l _bookmark79 預(yù)定義異常97 HYPERLINK l _bookmark80 用戶(hù)自定義異常98 HYPERLINK l _bookmark81 異常的拋出101 HYPERLINK l _boo

13、kmark82 內(nèi)置函數(shù) SQLCODE 和 SQLERRM102 HYPERLINK l _bookmark83 異常處理部分103 HYPERLINK l _bookmark84 基于 C、JAVA 語(yǔ)法的 DMSQL 程序107 HYPERLINK l _bookmark85 C 語(yǔ)法 DMSQL 程序107 HYPERLINK l _bookmark86 JAVA 語(yǔ)法 DMSQL 程序109 HYPERLINK l _bookmark87 DMSQL 程序調(diào)試112 HYPERLINK l _bookmark88 使用命令行工具 DMDBG 調(diào)試 DMSQL 程序112 HYPERL

14、INK l _bookmark89 dmdbg 工具命令簡(jiǎn)介112 HYPERLINK l _bookmark90 使用 dmdbg 工具113 HYPERLINK l _bookmark91 使用圖形化客戶(hù)端工具 MANAGER 調(diào)試 DMSQL 程序125DM8SQL 程序設(shè)計(jì) PAGE 4概述DMSQL 程序簡(jiǎn)介DMSQL 程序是達(dá)夢(mèng)數(shù)據(jù)庫(kù)對(duì)標(biāo)準(zhǔn) SQL 語(yǔ)言的擴(kuò)展,是一種過(guò)程化 SQL 語(yǔ)言。在DMSQL 程序中,包括一整套數(shù)據(jù)類(lèi)型、條件結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和異常處理結(jié)構(gòu)等,DMSQL 程序中可以執(zhí)行 SQL 語(yǔ)句,SQL 語(yǔ)句中也可以使用DMSQL 函數(shù)。DMSQL 程序是一種技術(shù),而不是

15、一種獨(dú)立的工具,它是和 DM 數(shù)據(jù)庫(kù)服務(wù)器緊密結(jié)合在一起的。可以認(rèn)為這種技術(shù)是執(zhí)行 DMSQL 程序的一種機(jī)器,它可以接受任何有效的DMSQL 程序,按照語(yǔ)言本身所規(guī)定的語(yǔ)義執(zhí)行,并將結(jié)果返回給客戶(hù)。DMSQL 程序可以分為存儲(chǔ)模塊和客戶(hù)端DMSQL 程序兩類(lèi)。用戶(hù)可以使用DMSQL 程序語(yǔ)言創(chuàng)建過(guò)程或函數(shù),稱(chēng)為存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)。這些過(guò)程或函數(shù)像普通的過(guò)程或函數(shù)一樣,有輸入、輸出參數(shù)和返回值,它們與表和視圖等數(shù)據(jù)庫(kù)對(duì)象一樣被存儲(chǔ)在數(shù)據(jù)庫(kù)中,供用戶(hù)隨時(shí)調(diào)用。存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)在功能上相當(dāng)于客戶(hù)端的一段SQL 批處理程序,但是在許多方面有著后者無(wú)法比擬的優(yōu)點(diǎn),它為用戶(hù)提供了一種高效率的編程手段,

16、成為現(xiàn)代數(shù)據(jù)庫(kù)系統(tǒng)的重要特征。通常,我們將存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)統(tǒng)稱(chēng)為存儲(chǔ)模塊??蛻?hù)端 DMSQL 程序可以實(shí)現(xiàn)的功能與存儲(chǔ)模塊一致,不同的是客戶(hù)端 DMSQL 程序并不創(chuàng)建一個(gè)具體的數(shù)據(jù)庫(kù)對(duì)象。其處理方法為 DM 數(shù)據(jù)庫(kù)服務(wù)器在預(yù)編譯階段將客戶(hù)端DMSQL 程序轉(zhuǎn)化為虛過(guò)程。虛過(guò)程不需要存儲(chǔ),創(chuàng)建后立即執(zhí)行,當(dāng)執(zhí)行的語(yǔ)句釋放時(shí), 虛過(guò)程對(duì)象也一同被釋放??蛻?hù)端DMSQL 程序只從語(yǔ)法上和存儲(chǔ)模塊兼容,完成和存儲(chǔ)模塊一樣的功能,是一種編程手段。使用 DMSQL 程序的優(yōu)點(diǎn)DMSQL 程序具有以下優(yōu)點(diǎn):與 SQL 語(yǔ)言的完美結(jié)合SQL 語(yǔ)言已成為數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,DMSQL 程序支持所有 SQL 數(shù)

17、據(jù)類(lèi)型和所有 SQL 函數(shù),同時(shí)支持所有 DM 對(duì)象類(lèi)型。在DMSQL 程序中可以使用 SELECT、INSERT、DELETE、UPDATE 數(shù)據(jù)操作語(yǔ)句,事務(wù)控制語(yǔ)句,游標(biāo)操縱語(yǔ)句以及通過(guò)動(dòng)態(tài) SQL 執(zhí)行DDL 語(yǔ)句。與 SQL 語(yǔ)言的完美結(jié)合使得 DMSQL 程序不僅能實(shí)現(xiàn) SQL 的所有功能,且由于其自身的程序設(shè)計(jì)特性,能提供更加豐富、強(qiáng)大的功能。提供更高的生產(chǎn)率在使用 DMSQL 程序設(shè)計(jì)應(yīng)用時(shí),圍繞存儲(chǔ)過(guò)程/函數(shù)進(jìn)行設(shè)計(jì),可以避免重復(fù)編碼, 提高生產(chǎn)率;在自頂向下設(shè)計(jì)應(yīng)用時(shí),不必關(guān)心實(shí)現(xiàn)的細(xì)節(jié);編程方便。從DM7 開(kāi)始,支持 C 和JAVA 語(yǔ)言語(yǔ)法的DMSQL 程序,這樣在對(duì)自

18、定義的 DMSQL 程序語(yǔ)法不熟悉的情況下也可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行各種操作,對(duì)數(shù)據(jù)庫(kù)的操作更加靈活,也更加容易。提供更好的性能DMSQL 存儲(chǔ)模塊在創(chuàng)建時(shí)被編譯成偽碼序列,在運(yùn)行時(shí)不需要重新進(jìn)行編譯和優(yōu)化處理,具有更快的執(zhí)行速度,可以同時(shí)被多個(gè)用戶(hù)調(diào)用,并能夠減少操作錯(cuò)誤。使用存儲(chǔ)模塊可減少應(yīng)用對(duì)DM 的調(diào)用,降低系統(tǒng)資源浪費(fèi),顯著提高性能,尤其是對(duì)在網(wǎng)絡(luò)上與 DM 通訊的應(yīng)用更加顯著。便于維護(hù)用戶(hù)定義的存儲(chǔ)模塊在 DM 數(shù)據(jù)庫(kù)中集中存放,用戶(hù)可以根據(jù)需要隨時(shí)查詢(xún)、刪除或重建它們,而調(diào)用這些存儲(chǔ)模塊的應(yīng)用程序可以不作任何修改,或只做少量調(diào)整。存儲(chǔ)模塊能被其他的DMSQL 程序或 SQL 命令調(diào)用,任

19、何客戶(hù)/服務(wù)器工具都能訪問(wèn)存儲(chǔ)模塊,具有很好的可重用性。提供更高的安全性存儲(chǔ)模塊可將用戶(hù)與具體的內(nèi)部數(shù)據(jù)操作進(jìn)行隔離,提高數(shù)據(jù)庫(kù)的安全性。如一個(gè)存 儲(chǔ)模塊查詢(xún)并修改一個(gè)表的某幾個(gè)列,管理員將這個(gè)存儲(chǔ)模塊的執(zhí)行權(quán)限授予某用戶(hù),而不必將表的訪問(wèn)和修改權(quán)限授予這個(gè)用戶(hù),保證用戶(hù)只訪問(wèn)修改其需要的數(shù)據(jù)??梢允褂肈M 的管理工具管理存儲(chǔ)在數(shù)據(jù)庫(kù)中的存儲(chǔ)模塊的安全性,可以授予或撤銷(xiāo)數(shù)據(jù)庫(kù)其他用戶(hù)執(zhí)行存儲(chǔ)模塊的權(quán)限。一個(gè)簡(jiǎn)單的 DMSQL 程序示例CREATE OR REPLACE PROCEDURE RESOURCES.person_accountAS DECLAREperson_count INT;下面

20、通過(guò)一個(gè)簡(jiǎn)單的例子讓讀者對(duì) DMSQL 程序有一個(gè)直觀的了解。BEGINSELECT COUNT(*) INTO person_count FROM RESOURCES.EMPLOYEE;DBMS_OUTPUT.PUT_LINE(公司總?cè)藬?shù) | person_count); IF person_count 5 THENRAISE_APPLICATION_ERROR(-20001, 公司總?cè)藬?shù)過(guò)少!); ELSENULL; END IF;END;/該例子創(chuàng)建一個(gè)名為 RESOURCES.person_account 的存儲(chǔ)過(guò)程,其中定義了變量, 在執(zhí)行部分執(zhí)行一條 SELECT 語(yǔ)句,打印查詢(xún)結(jié)

21、果,并對(duì)查詢(xún)結(jié)果進(jìn)行判斷,如果查詢(xún)出的值5,則拋出一個(gè)異常,否則不做任何處理。這個(gè)例子用到了 DMSQL 程序的定義存儲(chǔ)過(guò)程、變量定義、執(zhí)行 DML 語(yǔ)句、控制語(yǔ)句、拋出異常等功能,而 DMSQL 程序的功能遠(yuǎn)不止這些,后續(xù)章節(jié)將對(duì) DMSQL 程序的功能一一進(jìn)行介紹。DMSQL 程序數(shù)據(jù)類(lèi)型與操作符DMSQL 程序支持所有的 DM SQL 數(shù)據(jù)類(lèi)型,包括:精確數(shù)值數(shù)據(jù)類(lèi)型、近似數(shù)值數(shù)據(jù)類(lèi)型、字符數(shù)據(jù)類(lèi)型、多媒體數(shù)據(jù)類(lèi)型、一般日期時(shí)間數(shù)據(jù)類(lèi)型、時(shí)間間隔數(shù)據(jù)類(lèi)型。此外,為了進(jìn)一步提高 DMSQL 程序的程序設(shè)計(jì)屬性,DMSQL 程序還擴(kuò)展支持了%TYPE、%ROWTYPE、記錄類(lèi)型、數(shù)組類(lèi)型、集

22、合類(lèi)型和類(lèi)類(lèi)型,用戶(hù)還可以定義自己的子類(lèi)型。常規(guī)數(shù)據(jù)類(lèi)型數(shù)值數(shù)據(jù)類(lèi)型NUMERIC 類(lèi)型語(yǔ)法:NUMERIC( 精度 , 標(biāo)度)功能:NUMERIC 數(shù)據(jù)類(lèi)型用于存儲(chǔ)零、正負(fù)定點(diǎn)數(shù)。其中:精度是一個(gè)無(wú)符號(hào)整數(shù),定義了總的數(shù)字?jǐn)?shù),精度范圍是 1 至 38,標(biāo)度定義了小數(shù)點(diǎn)右邊的數(shù)字位數(shù),定義時(shí)如省略精度,則默認(rèn)是 16。如省略標(biāo)度,則默認(rèn)是 0。一個(gè)數(shù)的標(biāo)度不應(yīng)大于其精度。例如: NUMERIC(4,1)定義了小數(shù)點(diǎn)前面 3 位和小數(shù)點(diǎn)后面 1 位,共 4 位的數(shù)字,范圍在 -999.9 到 999.9。所有 NUMERIC 數(shù)據(jù)類(lèi)型,如果其值超過(guò)精度,達(dá)夢(mèng)數(shù)據(jù)庫(kù)返回一個(gè)出錯(cuò)信息,如果超過(guò)標(biāo)度,

23、則多余的位截?cái)唷H绻恢付ň群蜆?biāo)度,缺省精度為 38。NUMBER 類(lèi)型語(yǔ)法:NUMBER(精度 , 標(biāo)度)功能:與 NUMERIC 類(lèi)型相同。DECIMAL/DEC 類(lèi)型DM8SQL 程序設(shè)計(jì) PAGE 6語(yǔ)法:DECIMAL(精度 , 標(biāo)度)DEC(精度 , 標(biāo)度)功能:與 NUMERIC 相似。BIT 類(lèi)型語(yǔ)法:BIT功能:BIT 類(lèi)型用于存儲(chǔ)整數(shù)數(shù)據(jù) 1、0 或NULL,可以用來(lái)支持 ODBC 和 JDBC 的布爾數(shù)據(jù)類(lèi)型。DM 的 BIT 類(lèi)型與 SQL SERVER2000 的BIT 數(shù)據(jù)類(lèi)型相似。INTEGER/INT 類(lèi)型語(yǔ)法:INTEGERINT功能:用于存儲(chǔ)有符號(hào)整數(shù),精

24、度為 10,標(biāo)度為 0。取值范圍為:-2147483648(- 231) +2147483647(231-1)。PLS_INTEGER 類(lèi)型語(yǔ)法:PLS_INTEGER功能:與 INTEGER 相同。BIGINT 類(lèi)型語(yǔ)法:BIGINT功能:用于存儲(chǔ)有符號(hào)整數(shù),精度為 19,標(biāo)度為 0。取值范圍為:- 9223372036854775808(-263) 9223372036854775807(263-1)。TINYINT 類(lèi)型語(yǔ)法:TINYINT功能:用于存儲(chǔ)有符號(hào)整數(shù),精度為 3,標(biāo)度為 0。取值范圍為:-128+127。BYTE 類(lèi)型語(yǔ)法:BYTE功能:與 TINYINT 相似,精度為 3

25、,標(biāo)度為 0。SMALLINT 類(lèi)型語(yǔ)法:SMALLINT功能:用于存儲(chǔ)有符號(hào)整數(shù),精度為 5,標(biāo)度為 0。BINARY 類(lèi)型語(yǔ)法:BINARY(長(zhǎng)度 )功能:BINARY 數(shù)據(jù)類(lèi)型指定定長(zhǎng)二進(jìn)制數(shù)據(jù)。缺省長(zhǎng)度為 1 個(gè)字節(jié),最大長(zhǎng)度由數(shù)據(jù)庫(kù)頁(yè)面大小決定,具體可參考DM8_SQL 語(yǔ)言使用手冊(cè)1.4.1 節(jié)。BINARY 常量以 0 x 開(kāi)始, 后跟數(shù)據(jù)的十六進(jìn)制表示,例如 0 x2A3B4058。VARBINARY 類(lèi)型語(yǔ)法:VARBINARY(長(zhǎng)度 )功能:VARBINARY 數(shù)據(jù)類(lèi)型指定變長(zhǎng)二進(jìn)制數(shù)據(jù),用法類(lèi)似BINARY 數(shù)據(jù)類(lèi)型,可以指定一個(gè)正整數(shù)作為數(shù)據(jù)長(zhǎng)度。缺省長(zhǎng)度為 8188

26、個(gè)字節(jié),最大長(zhǎng)度由數(shù)據(jù)庫(kù)頁(yè)面大小決定, 具體可參考DM8_SQL 語(yǔ)言使用手冊(cè)1.4.1 節(jié)。DM8SQL 程序設(shè)計(jì) PAGE 8REAL 類(lèi)型語(yǔ)法:REAL功能:REAL 是帶二進(jìn)制的浮點(diǎn)數(shù),但它不能由用戶(hù)指定使用的精度,系統(tǒng)指定其二進(jìn)制精度為 24,十進(jìn)制精度為 7。取值范圍-3.4E + 38 3.4E + 38。FLOAT 類(lèi)型語(yǔ)法:FLOAT(精度)功能:FLOAT 是帶二進(jìn)制精度的浮點(diǎn)數(shù),精度最大不超過(guò) 53,如省略精度,則二進(jìn)制精度為 53,十進(jìn)制精度為 15。取值范圍為-1.7E + 308 1.7E + 308。DOUBLE 類(lèi)型語(yǔ)法:DOUBLE(精度)功能:同 FLOAT

27、 相似,精度最大不超過(guò) 53。DOUBLE PRECISION 類(lèi)型語(yǔ)法:DOUBLE PRECISION功能:該類(lèi)型指明雙精度浮點(diǎn)數(shù),其二進(jìn)制精度為 53,十進(jìn)制精度為 15。取值范圍-1.7E+ 308 1.7E + 308。字符數(shù)據(jù)類(lèi)型CHAR/CHARACTER 類(lèi)型語(yǔ)法:CHAR(長(zhǎng)度)CHARACTER(長(zhǎng)度)功能:定長(zhǎng)字符串,最大長(zhǎng)度由數(shù)據(jù)庫(kù)頁(yè)面大小決定,具體可參考DM8_SQL 語(yǔ)言使用手冊(cè)1.4.1 節(jié)。長(zhǎng)度不足時(shí),自動(dòng)填充空格。VARCHAR 類(lèi)型語(yǔ)法:VARCHAR(長(zhǎng)度)功能:可變長(zhǎng)字符串,最大長(zhǎng)度由數(shù)據(jù)庫(kù)頁(yè)面大小決定,具體可參考DM8_SQL 語(yǔ)言使用手冊(cè)1.4.1

28、節(jié)。多媒體數(shù)據(jù)類(lèi)型TEXT/LONGVARCHAR 類(lèi)型語(yǔ)法:TEXTLONGVARCHAR功能:變長(zhǎng)字符串類(lèi)型,其字符串的長(zhǎng)度最大為 2G-1,可用于存儲(chǔ)長(zhǎng)的文本串。IMAGE/LONGVARBINARY 類(lèi)型語(yǔ)法:IMAGELONGVARBINARY功能:可用于存儲(chǔ)多媒體信息中的圖像類(lèi)型。圖像由不定長(zhǎng)的象素點(diǎn)陣組成,長(zhǎng)度最大為2G-1 字節(jié)。該類(lèi)型除了存儲(chǔ)圖像數(shù)據(jù)之外,還可用于存儲(chǔ)任何其它二進(jìn)制數(shù)據(jù)。BLOB 類(lèi)型語(yǔ)法:BLOBDM8SQL 程序設(shè)計(jì) PAGE 52功能:BLOB 類(lèi)型用于指明變長(zhǎng)的二進(jìn)制大對(duì)象,長(zhǎng)度最大為 2G-1 字節(jié)。CLOB 類(lèi)型語(yǔ)法:CLOB功能:CLOB 類(lèi)型用

29、于指明變長(zhǎng)的字符串,長(zhǎng)度最大為 2G-1 字節(jié)。BFILE 類(lèi)型語(yǔ)法:BFILE功能:BFILE 用于指明存儲(chǔ)在操作系統(tǒng)中的二進(jìn)制文件,文件存儲(chǔ)在操作系統(tǒng)而非數(shù)據(jù)庫(kù)中, 僅能進(jìn)行只讀訪問(wèn)。日期時(shí)間數(shù)據(jù)類(lèi)型DMSQL 程序支持的日期時(shí)間數(shù)據(jù)類(lèi)型分為一般日期時(shí)間數(shù)據(jù)類(lèi)型、時(shí)區(qū)數(shù)據(jù)類(lèi)型和時(shí)間間隔數(shù)據(jù)類(lèi)型三類(lèi)。一般日期時(shí)間數(shù)據(jù)類(lèi)型DATE 類(lèi)型語(yǔ)法:DATE功能:DATE 類(lèi)型包括年、月、日信息,定義了-4712-01-01和9999-12-31之間任何一個(gè)有效的格里高利日期。TIME 類(lèi)型語(yǔ)法:TIME(小數(shù)秒精度)功能:TIME 類(lèi)型包括時(shí)、分、秒信息,定義了一個(gè)在00:00:00.000000和

30、23:59:59.999999之間的有效時(shí)間。TIME 類(lèi)型的小數(shù)秒精度規(guī)定了秒字段中小數(shù)點(diǎn)后面的位數(shù),取值范圍為 06,如果未定義,缺省精度為 0。TIMESTAMP/DATETIME 類(lèi)型語(yǔ)法:TIMESTAMP(小數(shù)秒精度)DATETIME(小數(shù)秒精度)功能:TIMESTAMP/DATETIME 類(lèi)型包括年、月、日、時(shí)、分、秒信息,定義了一個(gè)在- 4712-01-01 00:00:00.000000和9999-12-31 23:59:59.999999之間的有效格里高利日期時(shí)間。小數(shù)秒精度規(guī)定了秒字段中小數(shù)點(diǎn)后面的位數(shù),取值范圍為 06,如果未定義,缺省精度為 6。時(shí)區(qū)數(shù)據(jù)類(lèi)型TIME

31、WITH TIME ZONE 類(lèi)型語(yǔ)法:TIME(小數(shù)秒精度)WITH TIME ZONE功能:描述一個(gè)帶時(shí)區(qū)的TIME 值,其定義是在 TIME 類(lèi)型的后面加上時(shí)區(qū)信息。時(shí)區(qū)部分的實(shí)質(zhì)是INTERVAL HOUR TO MINUTE 類(lèi)型,取值范圍:-12:59 與+14:00 之間。例如:TIME 09:10:21 +8:00。TIMESTAMP WITH TIME ZONE 類(lèi)型語(yǔ)法:TIMESTAMP(小數(shù)秒精度)WITH TIME ZONE功能:描述一個(gè)帶時(shí)區(qū)的TIMESTAMP 值,其定義是在 TIMESTAMP 類(lèi)型的后面加上時(shí)區(qū)信息。時(shí)區(qū)部分的實(shí)質(zhì)是INTERVAL HOUR

32、TO MINUTE 類(lèi)型,取值范圍:-12:59 與+14:00 之間。例如:2009-10-11 19:03:05.0000 -02:10。TIMESTAMP WITH LOCAL TIME ZONE 類(lèi)型語(yǔ)法:TIMESTAMP(小數(shù)秒精度)WITH LOCAL TIME ZONE功能:描述一個(gè)本地時(shí)區(qū)的 TIMESTAMP 值,能夠?qū)?biāo)準(zhǔn)時(shí)區(qū)類(lèi)型 TIMESTAMP WITHTIME ZONE 類(lèi)型轉(zhuǎn)化為本地時(shí)區(qū)類(lèi)型,如果插入的值沒(méi)有指定時(shí)區(qū),則默認(rèn)為本地時(shí)區(qū)。時(shí)間間隔數(shù)據(jù)類(lèi)型DM 支持兩類(lèi)十三種時(shí)間間隔類(lèi)型:兩類(lèi)是年-月間隔類(lèi)和日-時(shí)間隔類(lèi),它們通過(guò)時(shí)間間隔限定符區(qū)分,前者結(jié)合了日期字

33、段年和月,后者結(jié)合了時(shí)間字段日、時(shí)、分、秒。由時(shí)間間隔數(shù)據(jù)類(lèi)型所描述的值總是有符號(hào)的。對(duì)時(shí)間間隔類(lèi)型的介紹見(jiàn)表 2.1,需要查看更為詳細(xì)的信息可參看DM8_SQL 語(yǔ)言使用手冊(cè)1.4.3 節(jié)。表 2.1 DMSQL 程序支持的時(shí)間間隔數(shù)據(jù)類(lèi)型類(lèi)型名類(lèi)型描述INTERVAL YEAR(P)年間隔,即兩個(gè)日期之間的年數(shù)字,P 為時(shí)間間隔的首項(xiàng)字段精度(后面簡(jiǎn)稱(chēng)為:首精度)INTERVAL MONTH(P)月間隔,即兩個(gè)日期之間的月數(shù)字,P 為時(shí)間間隔的首精度INTERVAL DAY(P)日間隔,即為兩個(gè)日期/時(shí)間之間的日數(shù)字,P 為時(shí)間間隔的首精度INTERVA L HOUR(P)時(shí)間隔,即為兩個(gè)

34、日期/時(shí)間之間的時(shí)數(shù)字,P 為時(shí)間間隔的首精度INTERVAL MINUTE(P)分間隔,即為兩個(gè)日期/時(shí)間之間的分?jǐn)?shù)字,P 為時(shí)間間隔的首精度INTERVAL SECOND(P,Q)秒間隔,即為兩個(gè)日期/時(shí)間之間的秒數(shù)字,P 為時(shí)間間隔的首精度,Q 為時(shí)間間隔秒精度INTERVALYEAR(P)TO MONTH年月間隔,即兩個(gè)日期之間的年月數(shù)字,P 為時(shí)間間隔的首精度INTERVAL DAY(P) TO HOUR日時(shí)間隔,即為兩個(gè)日期/時(shí)間之間的日時(shí)數(shù)字,P 為時(shí)間間隔的首精度INTERVAL DAY(P) TO MINUTE日時(shí)分間隔,即為兩個(gè)日期/時(shí)間之間的日時(shí)分?jǐn)?shù)字,P 為時(shí)間間隔的首

35、精度INTERVALDAY(P)TO SECOND(Q)日時(shí)分秒間隔,即為兩個(gè)日期/時(shí)間之間的日時(shí)分秒數(shù)字,P 為時(shí)間間隔的首精度,Q 為時(shí)間間隔秒精度INTERVALLHOUR(P) TO MINUTE時(shí)分間隔,即為兩個(gè)日期/時(shí)間之間的時(shí)分?jǐn)?shù)字,P 為時(shí)間間隔的首精度INTERVALHOUR(P) TO SECOND(Q)時(shí)分秒間隔,即為兩個(gè)日期/時(shí)間之間的時(shí)分秒數(shù)字,P 為時(shí)間間隔的首精度,Q 為時(shí)間間隔秒精度INTERVAL MINUTE(P) TO SECOND(Q)分秒間隔,即為兩個(gè)日期/時(shí)間之間的分秒間隔,P 為時(shí)間間隔的首精度,Q 為時(shí)間間隔秒精度BOOL/BOOLEAN 數(shù)據(jù)類(lèi)

36、型語(yǔ)法:BOOLBOOLEAN功能:布爾數(shù)據(jù)類(lèi)型:TRUE 和 FALSE。DMSQL 程序的布爾類(lèi)型和 INT 類(lèi)型可以相互轉(zhuǎn)化。如果變量或方法返回的類(lèi)型是布爾類(lèi)型,則返回值為 0 或 1。TRUE 和非 0 值的返回值為1,F(xiàn)ALSE 和 0 值返回為 0。%TYPE 和%ROWTYPEDECLAREV_NAME VARCHAR(30);在許多時(shí)候,DMSQL 程序變量被用來(lái)處理存儲(chǔ)在數(shù)據(jù)庫(kù)表中的數(shù)據(jù)。這種情況下,變量應(yīng)該擁有與表列相同的類(lèi)型。例如表T(ID INT, NAME VARCHAR(30)中字段 NAME 類(lèi)型為 VARCHAR(30)。對(duì)應(yīng)地在 DMSQL 程序中,我們可以聲

37、明一個(gè)變量:DECLAREV_NAME VARCHAR(100);但是如果 T 中的NAME 字段定義發(fā)生了變化,比如變?yōu)閂ARCHAR(100)。那么存儲(chǔ)過(guò)程中的變量 V_NAME 也要相應(yīng)修改為:如果用戶(hù)應(yīng)用中有很多的變量以及 DMSQL 程序代碼,這種處理可能是十分耗時(shí)和容易出錯(cuò)的。DECLAREV_NAME T.NAME%TYPE;為了解決上述問(wèn)題,DMSQL 程序提供了%TYPE 類(lèi)型。%TYPE 可以將變量同表列的類(lèi)型進(jìn)行綁定。例如:通過(guò)使用%TYPE,V_NAME 將擁有 T 表的NAME 列所擁有的類(lèi)型。如果表 T 的 NAME列類(lèi)型定義發(fā)生變化,V_NAME 的類(lèi)型也隨之自動(dòng)

38、發(fā)生變化,而不需要用戶(hù)手動(dòng)修改。例如,使用%TYPE 把變量 v1 的類(lèi)型和表 PERSON.ADDRESS 的ADDRESS1 列類(lèi)型進(jìn)DECLAREv_type PERSON.ADDRESS.ADDRESS1%TYPE; BEGINSELECT ADDRESS1 INTO v_type FROM PERSON.ADDRESS WHERE ADDRESSID=1;PRINT v_type; END;/行綁定。與%TYPE 類(lèi)似,%ROWTYPE 將返回一個(gè)基于表定義的運(yùn)算類(lèi)型,它將一個(gè)記錄聲明為具有相同類(lèi)型的數(shù)據(jù)庫(kù)行。例如:DECLAREV_TREC T % ROWTYPE;將定義一個(gè)記錄,

39、該記錄中的字段與表 T 中的行相對(duì)應(yīng)。V_TREC 變量會(huì)擁有這樣的結(jié)構(gòu):(ID INT, NAME VARCHAR(30)。如果表定義改變了,那么%ROWTYPE 定義的變量也會(huì)隨之改變。DECLAREv_row PERSON.ADDRESS%ROWTYPE; cur CURSOR;BEGINOPEN cur FOR SELECT * FROM PERSON.ADDRESS WHERE ADDRESSID=3;FETCH cur INTO v_row; PRINT v_row.ADDRESSID;例如,使用%ROWTYPE 將變量 v_row 與表PERSON.ADDRESS 的行相對(duì)應(yīng)。P

40、RINT v_row.ADDRESS1;CLOSE cur; END;在 DMSQL 程序設(shè)計(jì)中使用%TYPE 和%ROWTYPE 是一種非常好的編程風(fēng)格,它使得 DMSQL 程序更加靈活,更適應(yīng)于對(duì)數(shù)據(jù)庫(kù)的處理。記錄類(lèi)型記錄類(lèi)型是由單行多列的標(biāo)量類(lèi)型構(gòu)成復(fù)合類(lèi)型,類(lèi)似于 C 語(yǔ)言中的結(jié)構(gòu)。記錄類(lèi)型提供了處理分立但又作為一個(gè)整體單元的相關(guān)變量的一種機(jī)制。例如:DECLARE V_ID INT; V_NAME VARCHAR(30); 這兩個(gè)變量在邏輯上是相互關(guān)聯(lián)的,因?yàn)樗鼈兎謩e對(duì)應(yīng)表 T(ID INT, NAME VARCHAR(30)中的兩個(gè)字段。如果為這樣的變量聲明一個(gè)記錄類(lèi)型,那么它們之

41、間的關(guān)系就十分明顯了。定義記錄類(lèi)型的語(yǔ)法如下:TYPE IS RECORD( , ); := | := DEFAULT := := 通過(guò)將需要操作的表結(jié)構(gòu)定義成一個(gè)記錄,可以方便地對(duì)表中的行數(shù)據(jù)進(jìn)行操作。在DMSQL 程序中使用記錄,需要先定義一個(gè) RECORD 類(lèi)型,再用該類(lèi)型聲明變量,也可以使用上一小節(jié)介紹的%ROWTYPE 來(lái)創(chuàng)建與表結(jié)構(gòu)匹配的記錄。可以單獨(dú)對(duì)記錄中的字段賦值,使用點(diǎn)標(biāo)記引用一個(gè)記錄中的字段(記錄名.字段名)。DECLARETYPE sale_person IS RECORD(ID SALES.SALESPERSON.SALESPERSONID%TYPE, SALESTH

42、ISYEAR SALES.SALESPERSON.SALESTHISYEAR%TYPE);例如,下面的例子定義了一個(gè)記錄類(lèi)型sale_person,聲明一個(gè)該記錄類(lèi)型的變量v_rec,使用點(diǎn)標(biāo)記為 v_rec 的兩個(gè)字段賦值,之后使用 v_rec 更新表的一行數(shù)據(jù)。v_rec sale_person; BEGINv_rec.ID := 1;v_rec.SALESTHISYEAR:= 5500;UPDATE SALES.SALESPERSON SET SALESTHISYEAR=v_rec.SALESTHISYEAR WHERE SALESPERSONID =v_rec.ID;END;/DECL

43、ARETYPE t_rec IS RECORD( ID INT, NAME VARCHAR(50); TYPE t_rec_NEW IS RECORD( ID INT, NAME VARCHAR(50);v_rec1 T_REC; v_rec2 T_REC_NEW;BEGINSELECT PRODUCTID,NAMEINTO v_rec1 FROM PRODUCTION.PRODUCT WHERE AUTHOR LIKE 魯迅;v_rec2 := v_rec1;PRINT v_rec2.ID;PRINT v_rec2.NAME;END;/也可以將一個(gè)記錄直接賦值給另外一個(gè)記錄,此時(shí)兩個(gè)記錄中的

44、字段類(lèi)型定義必須完全一致。如下面的例子將表中的一行數(shù)據(jù)讀取到一個(gè)記錄中。然后,將記錄 v_rec1 賦值給 v_rec2。DECLARETYPE T_REC IS RECORD( ID INT3, NAME VARCHAR(30)3);定義記錄類(lèi)型時(shí),字段的數(shù)據(jù)類(lèi)型除了可以是常規(guī)數(shù)據(jù)類(lèi)型,還可以是常規(guī)數(shù)據(jù)類(lèi)型后跟著“n”或“n1,n2.”表示一維或多維數(shù)組,如:DMSQL 程序還支持定義包含數(shù)組、集合和其他 RECORD 的RECORD。例如下面是一個(gè)在 RECORD 定義中包含其他 RECORD 的例子,關(guān)于數(shù)組和集合的介紹請(qǐng)看后續(xù)小節(jié)。); BEGINNULL; END;/- 嵌套記錄 T

45、imeTypetime_of TimeTypeDATE,dayTYPE MeetingType IS RECORD (-定義記錄 TimeTypeDECLARETYPE TimeType IS RECORD (hours INT, minutes INT );數(shù)組類(lèi)型DMSQL 程序支持?jǐn)?shù)組數(shù)據(jù)類(lèi)型,包括靜態(tài)數(shù)組類(lèi)型和動(dòng)態(tài)數(shù)組類(lèi)型。 DM數(shù)組下標(biāo)的起始值為1。靜態(tài)數(shù)組類(lèi)型靜態(tài)數(shù)組是在聲明時(shí)已經(jīng)確定了數(shù)組大小的數(shù)組,其長(zhǎng)度是預(yù)先定義好的,在整個(gè)程序中,一旦給定大小后就無(wú)法改變。array_nameIS定義靜態(tài)數(shù)組類(lèi)型的語(yǔ)法圖例如下:TYPEdatatypeconst_exp;,ARRAY定義了靜

46、態(tài)數(shù)組類(lèi)型后需要用這個(gè)類(lèi)型申明一個(gè)數(shù)組變量然后進(jìn)行操作。理論上 DM 支持靜態(tài)數(shù)組的每一個(gè)維度的最大長(zhǎng)度為 65534,但是靜態(tài)數(shù)組最大長(zhǎng)度同時(shí)受系統(tǒng)內(nèi)部堆棧空間大小的限制,如果超出堆棧的空間限制,系統(tǒng)會(huì)報(bào)錯(cuò)。-TYPE 定義一維數(shù)組類(lèi)型DECLARETYPE Arr IS ARRAY VARCHAR3;下面是一個(gè)使用靜態(tài)數(shù)組的例子:BEGINFOR I IN 1.3 LOOP aI := I * 10; PRINT aI;END LOOP;PRINT ;FOR I IN 1.2 LOOP FOR J IN 1.4 LOOPbIJ = 4*(I-1)+J; PRINT bIJ;END LOOP

47、; END LOOP;END;/-聲明二維數(shù)組b Arr1;TYPE Arr1 IS ARRAY VARCHAR2,4; -TYPE 定義二維數(shù)組類(lèi)型-聲明一維數(shù)組a Arr;動(dòng)態(tài)數(shù)組類(lèi)型與靜態(tài)數(shù)組不同,動(dòng)態(tài)數(shù)組可以隨程序需要而重新指定大小,其內(nèi)存空間是從堆(HEAP)上分配(即動(dòng)態(tài)分配)的,通過(guò)執(zhí)行代碼而為其分配存儲(chǔ)空間,并由 DM 自動(dòng)釋放內(nèi)存。TYPEdatatype;,ARRAYarray_nameIS動(dòng)態(tài)數(shù)組與靜態(tài)數(shù)組的定義方法類(lèi)似,區(qū)別只在于動(dòng)態(tài)數(shù)組沒(méi)有指定下標(biāo),需要?jiǎng)討B(tài)分配空間。定義動(dòng)態(tài)數(shù)組類(lèi)型的語(yǔ)法圖例如下:數(shù)組變量名 := NEW 數(shù)據(jù)類(lèi)型常量表達(dá)式,;定義了動(dòng)態(tài)數(shù)組類(lèi)型后需

48、要用這個(gè)類(lèi)型申明一個(gè)數(shù)組變量,之后在 DMSQL 程序的執(zhí)行部分需要為這個(gè)數(shù)組變量動(dòng)態(tài)分配空間。動(dòng)態(tài)分配空間語(yǔ)句如下所示:數(shù)組變量名 := NEW 數(shù)據(jù)類(lèi)型常量表達(dá)式;或者可以使用如下語(yǔ)句對(duì)多維數(shù)組的某一維度進(jìn)行空間分配:下面給出了一個(gè)使用動(dòng)態(tài)數(shù)組的例子:DECLARETYPE Arr IS ARRAY VARCHAR;a Arr; BEGINa := NEW VARCHAR4;-動(dòng)態(tài)分配空間FOR I IN 1.4 LOOP aI := I * 4; PRINT aI;END LOOP; END;/DECLARETYPE Arr1 IS ARRAY VARCHAR,;b Arr1; BEGI

49、Nb := NEW VARCHAR2;-動(dòng)態(tài)分配第一維空間FOR I IN 1.2 LOOPbI := NEW VARCHAR4;-動(dòng)態(tài)分配第二維空間FOR J IN 1.4 LOOPbIJ = I*10+J;PRINT bIJ; END LOOP;END LOOP;END;/對(duì)于多維動(dòng)態(tài)數(shù)組,可以單獨(dú)為每個(gè)維度動(dòng)態(tài)分配空間,如下面的例子所示:也可以一次性為多維動(dòng)態(tài)數(shù)組分配空間,則上面的例子可以寫(xiě)為:DECLARETYPE Arr1 IS ARRAY VARCHAR,; b ARR1;BEGINb := NEW VARCHAR2,4; FOR I IN 1.2 LOOPFOR J IN 1.4

50、 LOOP bIJ= I*10+J;PRINT bIJ; END LOOP;END LOOP;END;/理論上 DM 支持動(dòng)態(tài)數(shù)組的每一個(gè)維度的最大長(zhǎng)度為 2147483646,但是數(shù)組最大長(zhǎng)度同時(shí)受系統(tǒng)內(nèi)部堆空間大小的限制,如果超出堆的空間限制,系統(tǒng)會(huì)報(bào)錯(cuò)。復(fù)雜類(lèi)型數(shù)組除了普通數(shù)據(jù)類(lèi)型的數(shù)組,DM 還支持自定義類(lèi)型、記錄類(lèi)型和集合類(lèi)型的數(shù)組。在下面的例子中,定義了一個(gè)自定義類(lèi)型(OBJECT 類(lèi)型)的靜態(tài)數(shù)組,存放圖書(shū)的DECLARETYPE ARR_COMPLEX IS ARRAY SYSDBA.COMPLEX3; arr ARR_COMPLEX;);/VARCHAR(100)IPARTI

51、NT,RPARTCREATE OR REPLACE TYPE COMPLEX AS OBJECT(序號(hào)和名稱(chēng)。DECLARETYPE VARY IS VARRAY(3) OF varchar(100); TYPE ARR_VARY IS ARRAY VARY8;arr ARR_VARY; v1,v2,v3 varchar(50);BEGINBEGINFOR I IN 1.3 LOOPSELECT SYSDBA.COMPLEX(PRODUCTID, NAME) INTO arrI FROM PRODUCTION.PRODUCT WHERE PRODUCTID=I;PRINT arrI.RPART

52、 | arrI.IPART; END LOOP;END;/DECLARETYPE REC IS RECORD(ID INT, NAME VARCHAR(128); TYPE REC_ARR IS ARRAY REC3;arr REC_ARR;BEGINFOR I IN 1.3 LOOPSELECT PRODUCTID, NAME INTO arrI FROM PRODUCTION.PRODUCT WHERE PRODUCTID=I;PRINT arrI.ID | arrI.NAME; END LOOP;END;/也可以將上例中的對(duì)象類(lèi)型改為記錄類(lèi)型,則 DMSQL 程序可寫(xiě)為:下面的例子定義了

53、一個(gè)集合類(lèi)型(以 VARRAY 為例)的數(shù)組,將員工的姓名、性別和職位信息存放到數(shù)組變量中。FOR I IN 1.8 LOOPSELECT NAME,PERSON.SEX,TITLE INTO v1,v2,v3 FROM PERSON.PERSON,RESOURCES.EMPLOYEE WHERE PERSON.PERSONID=EMPLOYEE.PERSONID AND PERSON.PERSONID=I;arrI := VARY(v1,v2,v3);PRINT *工號(hào)|I|*; FOR J IN 1.3 LOOPPRINT arrIJ; END LOOP;END LOOP;END;/集合類(lèi)

54、型DMSQL 程序支持三種集合類(lèi)型:VARRAY 類(lèi)型、索引表類(lèi)型和嵌套表類(lèi)型。VARRAYVARRAY 是一種具有可伸縮性的數(shù)組,數(shù)組中的每個(gè)元素具有相同的數(shù)據(jù)類(lèi)型。VARRAY 在定義時(shí)由用戶(hù)指定一個(gè)最大容量,其元素索引是從 1 開(kāi)始的有序數(shù)字。定義VARRAY 的語(yǔ)法格式為:TYPE IS VARRAY() OF ;表示數(shù)組的最大容量。是 VARRAY 中元素的數(shù)據(jù)類(lèi)型,可以是常規(guī)數(shù)據(jù)類(lèi)型,也可以是其他自定義類(lèi)型或?qū)ο?、記錄、其?VARRAY 類(lèi)型等,使得構(gòu)造復(fù)雜的結(jié)構(gòu)成為可能。TYPE my_array_type IS VARRAY(10) OF INTEGER;v MY_ARRAY

55、_TYPE;在定義了一個(gè)VARRAY 數(shù)組類(lèi)型后,再聲明一個(gè)該數(shù)組類(lèi)型的變量,就可以對(duì)這個(gè)數(shù)組變量進(jìn)行操作了。如下面的代碼片段所示:使用v.COUNT()方法可以得到數(shù)組 v 當(dāng)前的實(shí)際大小,v.LIMIT()則可獲得數(shù)組 v的最大容量。需要注意的是,VARRAY 的元素索引總是連續(xù)的。DECLARETYPE MY_ARRAY_TYPE IS VARRAY(10) OF VARCHAR(100); v MY_ARRAY_TYPE;BEGINv:=MY_ARRAY_TYPE();PRINT v.COUNT()= | v.COUNT();FOR I IN 1.8 LOOP v.EXTEND();S

56、ELECT NAME INTO v(I) FROM PERSON.PERSONWHERE PERSON.PERSONID=I; END LOOP;PRINT v.COUNT()= | v.COUNT(); FOR I IN 1.v.COUNT() LOOPPRINT v( | i | )= |v(i); END LOOP;END;/下面給出一個(gè)VARRAY 的簡(jiǎn)單使用示例,查詢(xún)?nèi)藛T姓名并將其存入一個(gè) VARRAY 變量中。VARRAY 最初的實(shí)際大小為 0,使用 EXCTEND()方法可擴(kuò)展 VARRAY 元素個(gè)數(shù),具體在 2.5.4 節(jié)中介紹。索引表索引表提供了一種快速、方便地管理一組相關(guān)數(shù)

57、據(jù)的方法。索引表是一組數(shù)據(jù)的集合, 它將數(shù)據(jù)按照一定規(guī)則組織起來(lái),形成一個(gè)可操作的整體,是對(duì)大量數(shù)據(jù)進(jìn)行有效組織和管理的手段之一,通過(guò)函數(shù)可以對(duì)大量性質(zhì)相同的數(shù)據(jù)進(jìn)行存儲(chǔ)、排序、插入及刪除等操作,從而可以有效地提高程序開(kāi)發(fā)效率及改善程序的編寫(xiě)方式。索引表不需要用戶(hù)指定大小,其大小根據(jù)用戶(hù)的操作自動(dòng)增長(zhǎng)。定義索引表的語(yǔ)法格式為:DECLARETYPE Rd IS RECORD(ID INT, NAME VARCHAR(128); TYPE Arr IS TABLE OF Rd INDEX BY INT;x Arr; i INT;CURSOR C1;BEGINi := 1;OPEN C1 FOR

58、SELECT PERSONID, NAME FROM PERSON.PERSON;TYPE IS TABLE OF INDEX BY ;“數(shù)據(jù)類(lèi)型”指索引表存放的數(shù)據(jù)的類(lèi)型,這個(gè)數(shù)據(jù)類(lèi)型可以是常規(guī)數(shù)據(jù)類(lèi)型,也可以是其他自定義類(lèi)型或是對(duì)象、記錄、靜態(tài)數(shù)組,但不能是動(dòng)態(tài)數(shù)組;“索引數(shù)據(jù)類(lèi)型”則是索引表中元素索引的數(shù)據(jù)類(lèi)型,DM 目前僅支持 INTEGER/INT 和VARCHAR 兩種類(lèi)型, 分別代表整數(shù)索引和字符串索引。對(duì)于 VARCHAR 類(lèi)型,長(zhǎng)度不能超過(guò) 1024。用戶(hù)可使用“索引-數(shù)據(jù)”對(duì)向索引表插入數(shù)據(jù),之后可通過(guò)“索引”修改和查詢(xún)這個(gè)數(shù)據(jù),而不需要知道數(shù)據(jù)在索引表中實(shí)際的位置。DEC

59、LARETYPE Arr IS TABLE OF VARCHAR(100) INDEX BY INT;x Arr; BEGINx(1) := TEST1;x(2) := TEST2;x(3) := x(1) | x(2); PRINT x(3);END;/下面給出了一個(gè)非常簡(jiǎn)單的索引表的使用示例。索引表還可以用來(lái)管理記錄,下面的例子索引表中存放的數(shù)據(jù)類(lèi)型為RECORD,展示了如何存入和遍歷輸出索引表的記錄類(lèi)型數(shù)據(jù)。-遍歷結(jié)果集,把每行的值都存放入索引表中LOOPIF C1%NOTFOUND THEN EXIT;END IF;FETCH C1 INTO x(i).ID, x(i).NAME; i

60、 := i + 1;END LOOP;-遍歷輸出索引表中的記錄i = x.FIRST();LOOPIF i IS NULL THEN EXIT;END IF;PRINT ID: | CAST(x(i).ID AS VARCHAR(10) | , NAME: | x(i).NAME; i = x.NEXT(i);END LOOP;END;/DECLARETYPE Arr IS TABLE OF VARCHAR(100) INDEX BY BINARY_INTEGER; TYPE Arr2 IS TABLE OF Arr INDEX BY VARCHAR(100);x Arr2; ind_i IN

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論