




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、DM8SQL 程序設計Service manual of DM8_Sql_ProgramDM8SQL 程序設計 PAGE * ROMAN VI前言概述DMSQL 程序是 DM 提供的一種過程化 SQL 語言。本文檔介紹了 DMSQL 程序支持的各種語法、功能及其使用方法,并提供了大量示例。讀者在閱讀完本文檔后可以自行設計較為復雜的DMSQL 程序以實現(xiàn)復雜應用邏輯。讀者對象本文檔主要適用于DM 數(shù)據(jù)庫的:開發(fā)工程師測試工程師技術支持工程師數(shù)據(jù)庫管理員通用約定在本文檔中可能出現(xiàn)下列標志,它們所代表的含義如下:表 0.1 標志含義標志說明表示可能導致系統(tǒng)損壞、數(shù)據(jù)丟失或不可預知的結果。表示可能導致
2、性能降低、服務不可用??梢詭椭鉀Q某個問題或節(jié)省您的時間。表示正文的附加信息,是對正文的強調(diào)和補充。在本文檔中可能出現(xiàn)下列格式,它們所代表的含義如下:表 0.2 格式含義格式說明宋體表示正文。Courier new表示代碼或者屏幕顯示內(nèi)容。粗體表示命令行中的關鍵字(命令中保持不變、必須照輸?shù)牟糠郑┗蛘哒闹袕娬{(diào)的內(nèi)容。標題、警告、注意、小竅門、說明等內(nèi)容均采用粗體。語法符號中,表示一個語法對象。:=語法符號中,表示定義符,用來定義一個語法對象。定義符左邊為語法對象,右邊為相應的語法描述。|語法符號中,表示或者符,限定的語法選項在實際語句中只能出現(xiàn)一個。 語法符號中,大括號內(nèi)的語法選項在實際的
3、語句中可以出現(xiàn) 0N 次(N 為大于 0 的自然數(shù)),但是大括號本身不能出現(xiàn)在語句中。 語法符號中,中括號內(nèi)的語法選項在實際的語句中可以出現(xiàn) 01 次,但是中括號本身不能出現(xiàn)在語句中。關鍵字關鍵字在 DM_SQL 語言中具有特殊意義,在 SQL 語法描述中,關鍵字以大寫形式出現(xiàn)。但在實際書寫 SQL 語句時,關鍵字既可以大寫也可以小寫。目 錄 HYPERLINK l _bookmark0 概述1 HYPERLINK l _bookmark1 DMSQL 程序簡介1 HYPERLINK l _bookmark2 使用 DMSQL 程序的優(yōu)點1 HYPERLINK l _bookmark3 一個簡
4、單的 DMSQL 程序示例2 HYPERLINK l _bookmark4 DMSQL 程序數(shù)據(jù)類型與操作符4 HYPERLINK l _bookmark5 常規(guī)數(shù)據(jù)類型4 HYPERLINK l _bookmark6 數(shù)值數(shù)據(jù)類型4 HYPERLINK l _bookmark7 字符數(shù)據(jù)類型7 HYPERLINK l _bookmark8 多媒體數(shù)據(jù)類型8 HYPERLINK l _bookmark9 日期時間數(shù)據(jù)類型9 HYPERLINK l _bookmark10 BOOL/BOOLEAN 數(shù)據(jù)類型12 HYPERLINK l _bookmark11 %TYPE 和%ROWTYPE12
5、HYPERLINK l _bookmark12 記錄類型14 HYPERLINK l _bookmark13 數(shù)組類型16 HYPERLINK l _bookmark14 靜態(tài)數(shù)組類型16 HYPERLINK l _bookmark15 動態(tài)數(shù)組類型17 HYPERLINK l _bookmark16 復雜類型數(shù)組19 HYPERLINK l _bookmark17 集合類型21 HYPERLINK l _bookmark18 VARRAY21 HYPERLINK l _bookmark19 索引表22 HYPERLINK l _bookmark20 嵌套表25 HYPERLINK l _bo
6、okmark21 集合類型支持的方法26 HYPERLINK l _bookmark22 類類型30 HYPERLINK l _bookmark23 子類型30 HYPERLINK l _bookmark24 操作符30 HYPERLINK l _bookmark25 DMSQL 程序的定義、調(diào)用與刪除32 HYPERLINK l _bookmark26 存儲過程32 HYPERLINK l _bookmark27 存儲函數(shù)34 HYPERLINK l _bookmark28 客戶端 DMSQL 程序37 HYPERLINK l _bookmark29 3.4 參數(shù)38 HYPERLINK l
7、 _bookmark30 3.5 變量40 HYPERLINK l _bookmark31 使用 OR REPLACE 選項43 HYPERLINK l _bookmark32 調(diào)用權限子句43 HYPERLINK l _bookmark33 調(diào)用、重新編譯與刪除存儲模塊43 HYPERLINK l _bookmark34 調(diào)用存儲模塊43 HYPERLINK l _bookmark35 重新編譯存儲模塊45 HYPERLINK l _bookmark36 刪除存儲模塊45 HYPERLINK l _bookmark37 DMSQL 程序中的各種控制結構47 HYPERLINK l _book
8、mark38 語句塊47 HYPERLINK l _bookmark39 分支結構49 HYPERLINK l _bookmark40 IF 語句49 HYPERLINK l _bookmark41 CASE 語句53 HYPERLINK l _bookmark42 SWITCH 語句55 HYPERLINK l _bookmark43 循環(huán)控制結構56 HYPERLINK l _bookmark44 LOOP 語句56 HYPERLINK l _bookmark45 WHILE 語句57 HYPERLINK l _bookmark46 FOR 語句58 HYPERLINK l _bookma
9、rk47 REPEAT 語句59 HYPERLINK l _bookmark48 FORALL 語句60 HYPERLINK l _bookmark49 EXIT 語句61 HYPERLINK l _bookmark50 CONTINUE 語句64 HYPERLINK l _bookmark51 順序結構66 HYPERLINK l _bookmark52 GOTO 語句66 HYPERLINK l _bookmark53 NULL 語句67 HYPERLINK l _bookmark54 其他語句68 HYPERLINK l _bookmark55 賦值語句68 HYPERLINK l _b
10、ookmark56 調(diào)用語句69 HYPERLINK l _bookmark57 RETURN 語句71 HYPERLINK l _bookmark58 PRINT 語句71 HYPERLINK l _bookmark59 PIPE ROW 語句72 HYPERLINK l _bookmark60 DMSQL 程序中的 SQL 語句74 HYPERLINK l _bookmark61 普通靜態(tài) SQL 語句74 HYPERLINK l _bookmark62 數(shù)據(jù)操縱74 HYPERLINK l _bookmark63 數(shù)據(jù)查詢75 HYPERLINK l _bookmark64 事務控制76
11、 HYPERLINK l _bookmark65 5.2 游標77 HYPERLINK l _bookmark66 靜態(tài)游標77 HYPERLINK l _bookmark67 動態(tài)游標83 HYPERLINK l _bookmark68 游標變量(引用游標)85 HYPERLINK l _bookmark69 使用游標更新、刪除數(shù)據(jù)86 HYPERLINK l _bookmark70 使用游標 FOR 循環(huán)87 HYPERLINK l _bookmark71 動態(tài) SQL89 HYPERLINK l _bookmark72 返回查詢結果集92 HYPERLINK l _bookmark73
12、自治事務93 HYPERLINK l _bookmark74 定義自治事務93 HYPERLINK l _bookmark75 自治事務完整性與死鎖檢測94 HYPERLINK l _bookmark76 自治事務嵌套95 HYPERLINK l _bookmark77 DMSQL 程序異常處理97 HYPERLINK l _bookmark78 異常處理的優(yōu)點97 HYPERLINK l _bookmark79 預定義異常97 HYPERLINK l _bookmark80 用戶自定義異常98 HYPERLINK l _bookmark81 異常的拋出101 HYPERLINK l _boo
13、kmark82 內(nèi)置函數(shù) SQLCODE 和 SQLERRM102 HYPERLINK l _bookmark83 異常處理部分103 HYPERLINK l _bookmark84 基于 C、JAVA 語法的 DMSQL 程序107 HYPERLINK l _bookmark85 C 語法 DMSQL 程序107 HYPERLINK l _bookmark86 JAVA 語法 DMSQL 程序109 HYPERLINK l _bookmark87 DMSQL 程序調(diào)試112 HYPERLINK l _bookmark88 使用命令行工具 DMDBG 調(diào)試 DMSQL 程序112 HYPERL
14、INK l _bookmark89 dmdbg 工具命令簡介112 HYPERLINK l _bookmark90 使用 dmdbg 工具113 HYPERLINK l _bookmark91 使用圖形化客戶端工具 MANAGER 調(diào)試 DMSQL 程序125DM8SQL 程序設計 PAGE 4概述DMSQL 程序簡介DMSQL 程序是達夢數(shù)據(jù)庫對標準 SQL 語言的擴展,是一種過程化 SQL 語言。在DMSQL 程序中,包括一整套數(shù)據(jù)類型、條件結構、循環(huán)結構和異常處理結構等,DMSQL 程序中可以執(zhí)行 SQL 語句,SQL 語句中也可以使用DMSQL 函數(shù)。DMSQL 程序是一種技術,而不是
15、一種獨立的工具,它是和 DM 數(shù)據(jù)庫服務器緊密結合在一起的??梢哉J為這種技術是執(zhí)行 DMSQL 程序的一種機器,它可以接受任何有效的DMSQL 程序,按照語言本身所規(guī)定的語義執(zhí)行,并將結果返回給客戶。DMSQL 程序可以分為存儲模塊和客戶端DMSQL 程序兩類。用戶可以使用DMSQL 程序語言創(chuàng)建過程或函數(shù),稱為存儲過程和存儲函數(shù)。這些過程或函數(shù)像普通的過程或函數(shù)一樣,有輸入、輸出參數(shù)和返回值,它們與表和視圖等數(shù)據(jù)庫對象一樣被存儲在數(shù)據(jù)庫中,供用戶隨時調(diào)用。存儲過程和存儲函數(shù)在功能上相當于客戶端的一段SQL 批處理程序,但是在許多方面有著后者無法比擬的優(yōu)點,它為用戶提供了一種高效率的編程手段,
16、成為現(xiàn)代數(shù)據(jù)庫系統(tǒng)的重要特征。通常,我們將存儲過程和存儲函數(shù)統(tǒng)稱為存儲模塊。客戶端 DMSQL 程序可以實現(xiàn)的功能與存儲模塊一致,不同的是客戶端 DMSQL 程序并不創(chuàng)建一個具體的數(shù)據(jù)庫對象。其處理方法為 DM 數(shù)據(jù)庫服務器在預編譯階段將客戶端DMSQL 程序轉化為虛過程。虛過程不需要存儲,創(chuàng)建后立即執(zhí)行,當執(zhí)行的語句釋放時, 虛過程對象也一同被釋放??蛻舳薉MSQL 程序只從語法上和存儲模塊兼容,完成和存儲模塊一樣的功能,是一種編程手段。使用 DMSQL 程序的優(yōu)點DMSQL 程序具有以下優(yōu)點:與 SQL 語言的完美結合SQL 語言已成為數(shù)據(jù)庫的標準語言,DMSQL 程序支持所有 SQL 數(shù)
17、據(jù)類型和所有 SQL 函數(shù),同時支持所有 DM 對象類型。在DMSQL 程序中可以使用 SELECT、INSERT、DELETE、UPDATE 數(shù)據(jù)操作語句,事務控制語句,游標操縱語句以及通過動態(tài) SQL 執(zhí)行DDL 語句。與 SQL 語言的完美結合使得 DMSQL 程序不僅能實現(xiàn) SQL 的所有功能,且由于其自身的程序設計特性,能提供更加豐富、強大的功能。提供更高的生產(chǎn)率在使用 DMSQL 程序設計應用時,圍繞存儲過程/函數(shù)進行設計,可以避免重復編碼, 提高生產(chǎn)率;在自頂向下設計應用時,不必關心實現(xiàn)的細節(jié);編程方便。從DM7 開始,支持 C 和JAVA 語言語法的DMSQL 程序,這樣在對自
18、定義的 DMSQL 程序語法不熟悉的情況下也可以對數(shù)據(jù)庫進行各種操作,對數(shù)據(jù)庫的操作更加靈活,也更加容易。提供更好的性能DMSQL 存儲模塊在創(chuàng)建時被編譯成偽碼序列,在運行時不需要重新進行編譯和優(yōu)化處理,具有更快的執(zhí)行速度,可以同時被多個用戶調(diào)用,并能夠減少操作錯誤。使用存儲模塊可減少應用對DM 的調(diào)用,降低系統(tǒng)資源浪費,顯著提高性能,尤其是對在網(wǎng)絡上與 DM 通訊的應用更加顯著。便于維護用戶定義的存儲模塊在 DM 數(shù)據(jù)庫中集中存放,用戶可以根據(jù)需要隨時查詢、刪除或重建它們,而調(diào)用這些存儲模塊的應用程序可以不作任何修改,或只做少量調(diào)整。存儲模塊能被其他的DMSQL 程序或 SQL 命令調(diào)用,任
19、何客戶/服務器工具都能訪問存儲模塊,具有很好的可重用性。提供更高的安全性存儲模塊可將用戶與具體的內(nèi)部數(shù)據(jù)操作進行隔離,提高數(shù)據(jù)庫的安全性。如一個存 儲模塊查詢并修改一個表的某幾個列,管理員將這個存儲模塊的執(zhí)行權限授予某用戶,而不必將表的訪問和修改權限授予這個用戶,保證用戶只訪問修改其需要的數(shù)據(jù)??梢允褂肈M 的管理工具管理存儲在數(shù)據(jù)庫中的存儲模塊的安全性,可以授予或撤銷數(shù)據(jù)庫其他用戶執(zhí)行存儲模塊的權限。一個簡單的 DMSQL 程序示例CREATE OR REPLACE PROCEDURE RESOURCES.person_accountAS DECLAREperson_count INT;下面
20、通過一個簡單的例子讓讀者對 DMSQL 程序有一個直觀的了解。BEGINSELECT COUNT(*) INTO person_count FROM RESOURCES.EMPLOYEE;DBMS_OUTPUT.PUT_LINE(公司總人數(shù) | person_count); IF person_count 5 THENRAISE_APPLICATION_ERROR(-20001, 公司總人數(shù)過少!); ELSENULL; END IF;END;/該例子創(chuàng)建一個名為 RESOURCES.person_account 的存儲過程,其中定義了變量, 在執(zhí)行部分執(zhí)行一條 SELECT 語句,打印查詢結
21、果,并對查詢結果進行判斷,如果查詢出的值5,則拋出一個異常,否則不做任何處理。這個例子用到了 DMSQL 程序的定義存儲過程、變量定義、執(zhí)行 DML 語句、控制語句、拋出異常等功能,而 DMSQL 程序的功能遠不止這些,后續(xù)章節(jié)將對 DMSQL 程序的功能一一進行介紹。DMSQL 程序數(shù)據(jù)類型與操作符DMSQL 程序支持所有的 DM SQL 數(shù)據(jù)類型,包括:精確數(shù)值數(shù)據(jù)類型、近似數(shù)值數(shù)據(jù)類型、字符數(shù)據(jù)類型、多媒體數(shù)據(jù)類型、一般日期時間數(shù)據(jù)類型、時間間隔數(shù)據(jù)類型。此外,為了進一步提高 DMSQL 程序的程序設計屬性,DMSQL 程序還擴展支持了%TYPE、%ROWTYPE、記錄類型、數(shù)組類型、集
22、合類型和類類型,用戶還可以定義自己的子類型。常規(guī)數(shù)據(jù)類型數(shù)值數(shù)據(jù)類型NUMERIC 類型語法:NUMERIC( 精度 , 標度)功能:NUMERIC 數(shù)據(jù)類型用于存儲零、正負定點數(shù)。其中:精度是一個無符號整數(shù),定義了總的數(shù)字數(shù),精度范圍是 1 至 38,標度定義了小數(shù)點右邊的數(shù)字位數(shù),定義時如省略精度,則默認是 16。如省略標度,則默認是 0。一個數(shù)的標度不應大于其精度。例如: NUMERIC(4,1)定義了小數(shù)點前面 3 位和小數(shù)點后面 1 位,共 4 位的數(shù)字,范圍在 -999.9 到 999.9。所有 NUMERIC 數(shù)據(jù)類型,如果其值超過精度,達夢數(shù)據(jù)庫返回一個出錯信息,如果超過標度,
23、則多余的位截斷。如果不指定精度和標度,缺省精度為 38。NUMBER 類型語法:NUMBER(精度 , 標度)功能:與 NUMERIC 類型相同。DECIMAL/DEC 類型DM8SQL 程序設計 PAGE 6語法:DECIMAL(精度 , 標度)DEC(精度 , 標度)功能:與 NUMERIC 相似。BIT 類型語法:BIT功能:BIT 類型用于存儲整數(shù)數(shù)據(jù) 1、0 或NULL,可以用來支持 ODBC 和 JDBC 的布爾數(shù)據(jù)類型。DM 的 BIT 類型與 SQL SERVER2000 的BIT 數(shù)據(jù)類型相似。INTEGER/INT 類型語法:INTEGERINT功能:用于存儲有符號整數(shù),精
24、度為 10,標度為 0。取值范圍為:-2147483648(- 231) +2147483647(231-1)。PLS_INTEGER 類型語法:PLS_INTEGER功能:與 INTEGER 相同。BIGINT 類型語法:BIGINT功能:用于存儲有符號整數(shù),精度為 19,標度為 0。取值范圍為:- 9223372036854775808(-263) 9223372036854775807(263-1)。TINYINT 類型語法:TINYINT功能:用于存儲有符號整數(shù),精度為 3,標度為 0。取值范圍為:-128+127。BYTE 類型語法:BYTE功能:與 TINYINT 相似,精度為 3
25、,標度為 0。SMALLINT 類型語法:SMALLINT功能:用于存儲有符號整數(shù),精度為 5,標度為 0。BINARY 類型語法:BINARY(長度 )功能:BINARY 數(shù)據(jù)類型指定定長二進制數(shù)據(jù)。缺省長度為 1 個字節(jié),最大長度由數(shù)據(jù)庫頁面大小決定,具體可參考DM8_SQL 語言使用手冊1.4.1 節(jié)。BINARY 常量以 0 x 開始, 后跟數(shù)據(jù)的十六進制表示,例如 0 x2A3B4058。VARBINARY 類型語法:VARBINARY(長度 )功能:VARBINARY 數(shù)據(jù)類型指定變長二進制數(shù)據(jù),用法類似BINARY 數(shù)據(jù)類型,可以指定一個正整數(shù)作為數(shù)據(jù)長度。缺省長度為 8188
26、個字節(jié),最大長度由數(shù)據(jù)庫頁面大小決定, 具體可參考DM8_SQL 語言使用手冊1.4.1 節(jié)。DM8SQL 程序設計 PAGE 8REAL 類型語法:REAL功能:REAL 是帶二進制的浮點數(shù),但它不能由用戶指定使用的精度,系統(tǒng)指定其二進制精度為 24,十進制精度為 7。取值范圍-3.4E + 38 3.4E + 38。FLOAT 類型語法:FLOAT(精度)功能:FLOAT 是帶二進制精度的浮點數(shù),精度最大不超過 53,如省略精度,則二進制精度為 53,十進制精度為 15。取值范圍為-1.7E + 308 1.7E + 308。DOUBLE 類型語法:DOUBLE(精度)功能:同 FLOAT
27、 相似,精度最大不超過 53。DOUBLE PRECISION 類型語法:DOUBLE PRECISION功能:該類型指明雙精度浮點數(shù),其二進制精度為 53,十進制精度為 15。取值范圍-1.7E+ 308 1.7E + 308。字符數(shù)據(jù)類型CHAR/CHARACTER 類型語法:CHAR(長度)CHARACTER(長度)功能:定長字符串,最大長度由數(shù)據(jù)庫頁面大小決定,具體可參考DM8_SQL 語言使用手冊1.4.1 節(jié)。長度不足時,自動填充空格。VARCHAR 類型語法:VARCHAR(長度)功能:可變長字符串,最大長度由數(shù)據(jù)庫頁面大小決定,具體可參考DM8_SQL 語言使用手冊1.4.1
28、節(jié)。多媒體數(shù)據(jù)類型TEXT/LONGVARCHAR 類型語法:TEXTLONGVARCHAR功能:變長字符串類型,其字符串的長度最大為 2G-1,可用于存儲長的文本串。IMAGE/LONGVARBINARY 類型語法:IMAGELONGVARBINARY功能:可用于存儲多媒體信息中的圖像類型。圖像由不定長的象素點陣組成,長度最大為2G-1 字節(jié)。該類型除了存儲圖像數(shù)據(jù)之外,還可用于存儲任何其它二進制數(shù)據(jù)。BLOB 類型語法:BLOBDM8SQL 程序設計 PAGE 52功能:BLOB 類型用于指明變長的二進制大對象,長度最大為 2G-1 字節(jié)。CLOB 類型語法:CLOB功能:CLOB 類型用
29、于指明變長的字符串,長度最大為 2G-1 字節(jié)。BFILE 類型語法:BFILE功能:BFILE 用于指明存儲在操作系統(tǒng)中的二進制文件,文件存儲在操作系統(tǒng)而非數(shù)據(jù)庫中, 僅能進行只讀訪問。日期時間數(shù)據(jù)類型DMSQL 程序支持的日期時間數(shù)據(jù)類型分為一般日期時間數(shù)據(jù)類型、時區(qū)數(shù)據(jù)類型和時間間隔數(shù)據(jù)類型三類。一般日期時間數(shù)據(jù)類型DATE 類型語法:DATE功能:DATE 類型包括年、月、日信息,定義了-4712-01-01和9999-12-31之間任何一個有效的格里高利日期。TIME 類型語法:TIME(小數(shù)秒精度)功能:TIME 類型包括時、分、秒信息,定義了一個在00:00:00.000000和
30、23:59:59.999999之間的有效時間。TIME 類型的小數(shù)秒精度規(guī)定了秒字段中小數(shù)點后面的位數(shù),取值范圍為 06,如果未定義,缺省精度為 0。TIMESTAMP/DATETIME 類型語法:TIMESTAMP(小數(shù)秒精度)DATETIME(小數(shù)秒精度)功能:TIMESTAMP/DATETIME 類型包括年、月、日、時、分、秒信息,定義了一個在- 4712-01-01 00:00:00.000000和9999-12-31 23:59:59.999999之間的有效格里高利日期時間。小數(shù)秒精度規(guī)定了秒字段中小數(shù)點后面的位數(shù),取值范圍為 06,如果未定義,缺省精度為 6。時區(qū)數(shù)據(jù)類型TIME
31、WITH TIME ZONE 類型語法:TIME(小數(shù)秒精度)WITH TIME ZONE功能:描述一個帶時區(qū)的TIME 值,其定義是在 TIME 類型的后面加上時區(qū)信息。時區(qū)部分的實質(zhì)是INTERVAL HOUR TO MINUTE 類型,取值范圍:-12:59 與+14:00 之間。例如:TIME 09:10:21 +8:00。TIMESTAMP WITH TIME ZONE 類型語法:TIMESTAMP(小數(shù)秒精度)WITH TIME ZONE功能:描述一個帶時區(qū)的TIMESTAMP 值,其定義是在 TIMESTAMP 類型的后面加上時區(qū)信息。時區(qū)部分的實質(zhì)是INTERVAL HOUR
32、TO MINUTE 類型,取值范圍:-12:59 與+14:00 之間。例如:2009-10-11 19:03:05.0000 -02:10。TIMESTAMP WITH LOCAL TIME ZONE 類型語法:TIMESTAMP(小數(shù)秒精度)WITH LOCAL TIME ZONE功能:描述一個本地時區(qū)的 TIMESTAMP 值,能夠?qū)藴蕰r區(qū)類型 TIMESTAMP WITHTIME ZONE 類型轉化為本地時區(qū)類型,如果插入的值沒有指定時區(qū),則默認為本地時區(qū)。時間間隔數(shù)據(jù)類型DM 支持兩類十三種時間間隔類型:兩類是年-月間隔類和日-時間隔類,它們通過時間間隔限定符區(qū)分,前者結合了日期字
33、段年和月,后者結合了時間字段日、時、分、秒。由時間間隔數(shù)據(jù)類型所描述的值總是有符號的。對時間間隔類型的介紹見表 2.1,需要查看更為詳細的信息可參看DM8_SQL 語言使用手冊1.4.3 節(jié)。表 2.1 DMSQL 程序支持的時間間隔數(shù)據(jù)類型類型名類型描述INTERVAL YEAR(P)年間隔,即兩個日期之間的年數(shù)字,P 為時間間隔的首項字段精度(后面簡稱為:首精度)INTERVAL MONTH(P)月間隔,即兩個日期之間的月數(shù)字,P 為時間間隔的首精度INTERVAL DAY(P)日間隔,即為兩個日期/時間之間的日數(shù)字,P 為時間間隔的首精度INTERVA L HOUR(P)時間隔,即為兩個
34、日期/時間之間的時數(shù)字,P 為時間間隔的首精度INTERVAL MINUTE(P)分間隔,即為兩個日期/時間之間的分數(shù)字,P 為時間間隔的首精度INTERVAL SECOND(P,Q)秒間隔,即為兩個日期/時間之間的秒數(shù)字,P 為時間間隔的首精度,Q 為時間間隔秒精度INTERVALYEAR(P)TO MONTH年月間隔,即兩個日期之間的年月數(shù)字,P 為時間間隔的首精度INTERVAL DAY(P) TO HOUR日時間隔,即為兩個日期/時間之間的日時數(shù)字,P 為時間間隔的首精度INTERVAL DAY(P) TO MINUTE日時分間隔,即為兩個日期/時間之間的日時分數(shù)字,P 為時間間隔的首
35、精度INTERVALDAY(P)TO SECOND(Q)日時分秒間隔,即為兩個日期/時間之間的日時分秒數(shù)字,P 為時間間隔的首精度,Q 為時間間隔秒精度INTERVALLHOUR(P) TO MINUTE時分間隔,即為兩個日期/時間之間的時分數(shù)字,P 為時間間隔的首精度INTERVALHOUR(P) TO SECOND(Q)時分秒間隔,即為兩個日期/時間之間的時分秒數(shù)字,P 為時間間隔的首精度,Q 為時間間隔秒精度INTERVAL MINUTE(P) TO SECOND(Q)分秒間隔,即為兩個日期/時間之間的分秒間隔,P 為時間間隔的首精度,Q 為時間間隔秒精度BOOL/BOOLEAN 數(shù)據(jù)類
36、型語法:BOOLBOOLEAN功能:布爾數(shù)據(jù)類型:TRUE 和 FALSE。DMSQL 程序的布爾類型和 INT 類型可以相互轉化。如果變量或方法返回的類型是布爾類型,則返回值為 0 或 1。TRUE 和非 0 值的返回值為1,F(xiàn)ALSE 和 0 值返回為 0。%TYPE 和%ROWTYPEDECLAREV_NAME VARCHAR(30);在許多時候,DMSQL 程序變量被用來處理存儲在數(shù)據(jù)庫表中的數(shù)據(jù)。這種情況下,變量應該擁有與表列相同的類型。例如表T(ID INT, NAME VARCHAR(30)中字段 NAME 類型為 VARCHAR(30)。對應地在 DMSQL 程序中,我們可以聲
37、明一個變量:DECLAREV_NAME VARCHAR(100);但是如果 T 中的NAME 字段定義發(fā)生了變化,比如變?yōu)閂ARCHAR(100)。那么存儲過程中的變量 V_NAME 也要相應修改為:如果用戶應用中有很多的變量以及 DMSQL 程序代碼,這種處理可能是十分耗時和容易出錯的。DECLAREV_NAME T.NAME%TYPE;為了解決上述問題,DMSQL 程序提供了%TYPE 類型。%TYPE 可以將變量同表列的類型進行綁定。例如:通過使用%TYPE,V_NAME 將擁有 T 表的NAME 列所擁有的類型。如果表 T 的 NAME列類型定義發(fā)生變化,V_NAME 的類型也隨之自動
38、發(fā)生變化,而不需要用戶手動修改。例如,使用%TYPE 把變量 v1 的類型和表 PERSON.ADDRESS 的ADDRESS1 列類型進DECLAREv_type PERSON.ADDRESS.ADDRESS1%TYPE; BEGINSELECT ADDRESS1 INTO v_type FROM PERSON.ADDRESS WHERE ADDRESSID=1;PRINT v_type; END;/行綁定。與%TYPE 類似,%ROWTYPE 將返回一個基于表定義的運算類型,它將一個記錄聲明為具有相同類型的數(shù)據(jù)庫行。例如:DECLAREV_TREC T % ROWTYPE;將定義一個記錄,
39、該記錄中的字段與表 T 中的行相對應。V_TREC 變量會擁有這樣的結構:(ID INT, NAME VARCHAR(30)。如果表定義改變了,那么%ROWTYPE 定義的變量也會隨之改變。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 的行相對應。P
40、RINT v_row.ADDRESS1;CLOSE cur; END;在 DMSQL 程序設計中使用%TYPE 和%ROWTYPE 是一種非常好的編程風格,它使得 DMSQL 程序更加靈活,更適應于對數(shù)據(jù)庫的處理。記錄類型記錄類型是由單行多列的標量類型構成復合類型,類似于 C 語言中的結構。記錄類型提供了處理分立但又作為一個整體單元的相關變量的一種機制。例如:DECLARE V_ID INT; V_NAME VARCHAR(30); 這兩個變量在邏輯上是相互關聯(lián)的,因為它們分別對應表 T(ID INT, NAME VARCHAR(30)中的兩個字段。如果為這樣的變量聲明一個記錄類型,那么它們之
41、間的關系就十分明顯了。定義記錄類型的語法如下:TYPE IS RECORD( , ); := | := DEFAULT := := 通過將需要操作的表結構定義成一個記錄,可以方便地對表中的行數(shù)據(jù)進行操作。在DMSQL 程序中使用記錄,需要先定義一個 RECORD 類型,再用該類型聲明變量,也可以使用上一小節(jié)介紹的%ROWTYPE 來創(chuàng)建與表結構匹配的記錄。可以單獨對記錄中的字段賦值,使用點標記引用一個記錄中的字段(記錄名.字段名)。DECLARETYPE sale_person IS RECORD(ID SALES.SALESPERSON.SALESPERSONID%TYPE, SALESTH
42、ISYEAR SALES.SALESPERSON.SALESTHISYEAR%TYPE);例如,下面的例子定義了一個記錄類型sale_person,聲明一個該記錄類型的變量v_rec,使用點標記為 v_rec 的兩個字段賦值,之后使用 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;/也可以將一個記錄直接賦值給另外一個記錄,此時兩個記錄中的
44、字段類型定義必須完全一致。如下面的例子將表中的一行數(shù)據(jù)讀取到一個記錄中。然后,將記錄 v_rec1 賦值給 v_rec2。DECLARETYPE T_REC IS RECORD( ID INT3, NAME VARCHAR(30)3);定義記錄類型時,字段的數(shù)據(jù)類型除了可以是常規(guī)數(shù)據(jù)類型,還可以是常規(guī)數(shù)據(jù)類型后跟著“n”或“n1,n2.”表示一維或多維數(shù)組,如:DMSQL 程序還支持定義包含數(shù)組、集合和其他 RECORD 的RECORD。例如下面是一個在 RECORD 定義中包含其他 RECORD 的例子,關于數(shù)組和集合的介紹請看后續(xù)小節(jié)。); BEGINNULL; END;/- 嵌套記錄 T
45、imeTypetime_of TimeTypeDATE,dayTYPE MeetingType IS RECORD (-定義記錄 TimeTypeDECLARETYPE TimeType IS RECORD (hours INT, minutes INT );數(shù)組類型DMSQL 程序支持數(shù)組數(shù)據(jù)類型,包括靜態(tài)數(shù)組類型和動態(tài)數(shù)組類型。 DM數(shù)組下標的起始值為1。靜態(tài)數(shù)組類型靜態(tài)數(shù)組是在聲明時已經(jīng)確定了數(shù)組大小的數(shù)組,其長度是預先定義好的,在整個程序中,一旦給定大小后就無法改變。array_nameIS定義靜態(tài)數(shù)組類型的語法圖例如下:TYPEdatatypeconst_exp;,ARRAY定義了靜
46、態(tài)數(shù)組類型后需要用這個類型申明一個數(shù)組變量然后進行操作。理論上 DM 支持靜態(tài)數(shù)組的每一個維度的最大長度為 65534,但是靜態(tài)數(shù)組最大長度同時受系統(tǒng)內(nèi)部堆??臻g大小的限制,如果超出堆棧的空間限制,系統(tǒng)會報錯。-TYPE 定義一維數(shù)組類型DECLARETYPE Arr IS ARRAY VARCHAR3;下面是一個使用靜態(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ù)組類型-聲明一維數(shù)組a Arr;動態(tài)數(shù)組類型與靜態(tài)數(shù)組不同,動態(tài)數(shù)組可以隨程序需要而重新指定大小,其內(nèi)存空間是從堆(HEAP)上分配(即動態(tài)分配)的,通過執(zhí)行代碼而為其分配存儲空間,并由 DM 自動釋放內(nèi)存。TYPEdatatype;,ARRAYarray_nameIS動態(tài)數(shù)組與靜態(tài)數(shù)組的定義方法類似,區(qū)別只在于動態(tài)數(shù)組沒有指定下標,需要動態(tài)分配空間。定義動態(tài)數(shù)組類型的語法圖例如下:數(shù)組變量名 := NEW 數(shù)據(jù)類型常量表達式,;定義了動態(tài)數(shù)組類型后需
48、要用這個類型申明一個數(shù)組變量,之后在 DMSQL 程序的執(zhí)行部分需要為這個數(shù)組變量動態(tài)分配空間。動態(tài)分配空間語句如下所示:數(shù)組變量名 := NEW 數(shù)據(jù)類型常量表達式;或者可以使用如下語句對多維數(shù)組的某一維度進行空間分配:下面給出了一個使用動態(tài)數(shù)組的例子:DECLARETYPE Arr IS ARRAY VARCHAR;a Arr; BEGINa := NEW VARCHAR4;-動態(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;-動態(tài)分配第一維空間FOR I IN 1.2 LOOPbI := NEW VARCHAR4;-動態(tài)分配第二維空間FOR J IN 1.4 LOOPbIJ = I*10+J;PRINT bIJ; END LOOP;END LOOP;END;/對于多維動態(tài)數(shù)組,可以單獨為每個維度動態(tài)分配空間,如下面的例子所示:也可以一次性為多維動態(tài)數(shù)組分配空間,則上面的例子可以寫為: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 支持動態(tài)數(shù)組的每一個維度的最大長度為 2147483646,但是數(shù)組最大長度同時受系統(tǒng)內(nèi)部堆空間大小的限制,如果超出堆的空間限制,系統(tǒng)會報錯。復雜類型數(shù)組除了普通數(shù)據(jù)類型的數(shù)組,DM 還支持自定義類型、記錄類型和集合類型的數(shù)組。在下面的例子中,定義了一個自定義類型(OBJECT 類型)的靜態(tài)數(shù)組,存放圖書的DECLARETYPE ARR_COMPLEX IS ARRAY SYSDBA.COMPLEX3; arr ARR_COMPLEX;);/VARCHAR(100)IPARTI
51、NT,RPARTCREATE OR REPLACE TYPE COMPLEX AS OBJECT(序號和名稱。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;/也可以將上例中的對象類型改為記錄類型,則 DMSQL 程序可寫為:下面的例子定義了
53、一個集合類型(以 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 *工號|I|*; FOR J IN 1.3 LOOPPRINT arrIJ; END LOOP;END LOOP;END;/集合類
54、型DMSQL 程序支持三種集合類型:VARRAY 類型、索引表類型和嵌套表類型。VARRAYVARRAY 是一種具有可伸縮性的數(shù)組,數(shù)組中的每個元素具有相同的數(shù)據(jù)類型。VARRAY 在定義時由用戶指定一個最大容量,其元素索引是從 1 開始的有序數(shù)字。定義VARRAY 的語法格式為:TYPE IS VARRAY() OF ;表示數(shù)組的最大容量。是 VARRAY 中元素的數(shù)據(jù)類型,可以是常規(guī)數(shù)據(jù)類型,也可以是其他自定義類型或?qū)ο?、記錄、其?VARRAY 類型等,使得構造復雜的結構成為可能。TYPE my_array_type IS VARRAY(10) OF INTEGER;v MY_ARRAY
55、_TYPE;在定義了一個VARRAY 數(shù)組類型后,再聲明一個該數(shù)組類型的變量,就可以對這個數(shù)組變量進行操作了。如下面的代碼片段所示:使用v.COUNT()方法可以得到數(shù)組 v 當前的實際大小,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;/下面給出一個VARRAY 的簡單使用示例,查詢?nèi)藛T姓名并將其存入一個 VARRAY 變量中。VARRAY 最初的實際大小為 0,使用 EXCTEND()方法可擴展 VARRAY 元素個數(shù),具體在 2.5.4 節(jié)中介紹。索引表索引表提供了一種快速、方便地管理一組相關數(shù)
57、據(jù)的方法。索引表是一組數(shù)據(jù)的集合, 它將數(shù)據(jù)按照一定規(guī)則組織起來,形成一個可操作的整體,是對大量數(shù)據(jù)進行有效組織和管理的手段之一,通過函數(shù)可以對大量性質(zhì)相同的數(shù)據(jù)進行存儲、排序、插入及刪除等操作,從而可以有效地提高程序開發(fā)效率及改善程序的編寫方式。索引表不需要用戶指定大小,其大小根據(jù)用戶的操作自動增長。定義索引表的語法格式為: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ù)類型”指索引表存放的數(shù)據(jù)的類型,這個數(shù)據(jù)類型可以是常規(guī)數(shù)據(jù)類型,也可以是其他自定義類型或是對象、記錄、靜態(tài)數(shù)組,但不能是動態(tài)數(shù)組;“索引數(shù)據(jù)類型”則是索引表中元素索引的數(shù)據(jù)類型,DM 目前僅支持 INTEGER/INT 和VARCHAR 兩種類型, 分別代表整數(shù)索引和字符串索引。對于 VARCHAR 類型,長度不能超過 1024。用戶可使用“索引-數(shù)據(jù)”對向索引表插入數(shù)據(jù),之后可通過“索引”修改和查詢這個數(shù)據(jù),而不需要知道數(shù)據(jù)在索引表中實際的位置。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;/下面給出了一個非常簡單的索引表的使用示例。索引表還可以用來管理記錄,下面的例子索引表中存放的數(shù)據(jù)類型為RECORD,展示了如何存入和遍歷輸出索引表的記錄類型數(shù)據(jù)。-遍歷結果集,把每行的值都存放入索引表中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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- CDK4-6-HDAC-IN-1-生命科學試劑-MCE
- 公司企業(yè)咨詢服務合同
- it公司保密合同書集合
- 工廠廠房租賃合同
- 家長會學生代表的發(fā)言稿
- 法律法規(guī)符合性審查流程
- 智取生辰綱故事解析:小學語文名著導讀教案
- 新能源技術應用實踐操作指南
- 環(huán)形走廊放線施工方案
- 高中地理《世界地理概覽》主題活動教案
- 【安排表】2024-2025學年下學期學校升旗儀式安排表 主題班會安排表
- 2025年度老舊小區(qū)改造施工委托合同范本
- 2024黑龍江公務員考試【A類、B類、省直、筆試】四套真題及答案
- 2025年安徽中醫(yī)藥高等??茖W校高職單招職業(yè)適應性測試近5年??及鎱⒖碱}庫含答案解析
- 《智能網(wǎng)聯(lián)汽車 自動駕駛系統(tǒng)要求及測試方法 第1部分:高速公路及城市快速路》
- 2024年濟南護理職業(yè)學院高職單招語文歷年參考題庫含答案解析
- 2025廣東省國家稅務局系統(tǒng)事業(yè)單位招聘400人歷年高頻重點提升(共500題)附帶答案詳解
- 投行競爭格局-洞察分析
- 《GNSS接收機矢量跟蹤算法研究》
- DB14-T 1123-2024 紅小豆、玉米間作技術規(guī)程
- 考研學習筆記 《國際貿(mào)易實務》(第6版)筆記和課后習題(含考研真題)詳解-1-200
評論
0/150
提交評論