達夢數據庫DM8 SQL程序設計_第1頁
達夢數據庫DM8 SQL程序設計_第2頁
達夢數據庫DM8 SQL程序設計_第3頁
達夢數據庫DM8 SQL程序設計_第4頁
達夢數據庫DM8 SQL程序設計_第5頁
已閱讀5頁,還剩131頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、DM8SQL 程序設計Service manual of DM8_Sql_ProgramDM8SQL 程序設計 PAGE * ROMAN VI前言概述DMSQL 程序是 DM 提供的一種過程化 SQL 語言。本文檔介紹了 DMSQL 程序支持的各種語法、功能及其使用方法,并提供了大量示例。讀者在閱讀完本文檔后可以自行設計較為復雜的DMSQL 程序以實現復雜應用邏輯。讀者對象本文檔主要適用于DM 數據庫的:開發工程師測試工程師技術支持工程師數據庫管理員通用約定在本文檔中可能出現下列標志,它們所代表的含義如下:表 0.1 標志含義標志說明表示可能導致系統損壞、數據丟失或不可預知的結果。表示可能導致

2、性能降低、服務不可用。可以幫助您解決某個問題或節省您的時間。表示正文的附加信息,是對正文的強調和補充。在本文檔中可能出現下列格式,它們所代表的含義如下:表 0.2 格式含義格式說明宋體表示正文。Courier new表示代碼或者屏幕顯示內容。粗體表示命令行中的關鍵字(命令中保持不變、必須照輸的部分)或者正文中強調的內容。標題、警告、注意、小竅門、說明等內容均采用粗體。語法符號中,表示一個語法對象。:=語法符號中,表示定義符,用來定義一個語法對象。定義符左邊為語法對象,右邊為相應的語法描述。|語法符號中,表示或者符,限定的語法選項在實際語句中只能出現一個。 語法符號中,大括號內的語法選項在實際的

3、語句中可以出現 0N 次(N 為大于 0 的自然數),但是大括號本身不能出現在語句中。 語法符號中,中括號內的語法選項在實際的語句中可以出現 01 次,但是中括號本身不能出現在語句中。關鍵字關鍵字在 DM_SQL 語言中具有特殊意義,在 SQL 語法描述中,關鍵字以大寫形式出現。但在實際書寫 SQL 語句時,關鍵字既可以大寫也可以小寫。目 錄 HYPERLINK l _bookmark0 概述1 HYPERLINK l _bookmark1 DMSQL 程序簡介1 HYPERLINK l _bookmark2 使用 DMSQL 程序的優點1 HYPERLINK l _bookmark3 一個簡

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

5、HYPERLINK l _bookmark12 記錄類型14 HYPERLINK l _bookmark13 數組類型16 HYPERLINK l _bookmark14 靜態數組類型16 HYPERLINK l _bookmark15 動態數組類型17 HYPERLINK l _bookmark16 復雜類型數組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 程序的定義、調用與刪除32 HYPERLINK l _bookmark26 存儲過程32 HYPERLINK l _bookmark27 存儲函數34 HYPERLINK l _bookmark28 客戶端 DMSQL 程序37 HYPERLINK l _bookmark29 3.4 參數38 HYPERLINK l

7、 _bookmark30 3.5 變量40 HYPERLINK l _bookmark31 使用 OR REPLACE 選項43 HYPERLINK l _bookmark32 調用權限子句43 HYPERLINK l _bookmark33 調用、重新編譯與刪除存儲模塊43 HYPERLINK l _bookmark34 調用存儲模塊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 循環控制結構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 調用語句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 普通靜態 SQL 語句74 HYPERLINK l _bookmark62 數據操縱74 HYPERLINK l _bookmark63 數據查詢75 HYPERLINK l _bookmark64 事務控制76

11、 HYPERLINK l _bookmark65 5.2 游標77 HYPERLINK l _bookmark66 靜態游標77 HYPERLINK l _bookmark67 動態游標83 HYPERLINK l _bookmark68 游標變量(引用游標)85 HYPERLINK l _bookmark69 使用游標更新、刪除數據86 HYPERLINK l _bookmark70 使用游標 FOR 循環87 HYPERLINK l _bookmark71 動態 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 異常處理的優點97 HYPERLINK l _bookmark79 預定義異常97 HYPERLINK l _bookmark80 用戶自定義異常98 HYPERLINK l _bookmark81 異常的拋出101 HYPERLINK l _boo

13、kmark82 內置函數 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 程序調試112 HYPERLINK l _bookmark88 使用命令行工具 DMDBG 調試 DMSQL 程序112 HYPERL

14、INK l _bookmark89 dmdbg 工具命令簡介112 HYPERLINK l _bookmark90 使用 dmdbg 工具113 HYPERLINK l _bookmark91 使用圖形化客戶端工具 MANAGER 調試 DMSQL 程序125DM8SQL 程序設計 PAGE 4概述DMSQL 程序簡介DMSQL 程序是達夢數據庫對標準 SQL 語言的擴展,是一種過程化 SQL 語言。在DMSQL 程序中,包括一整套數據類型、條件結構、循環結構和異常處理結構等,DMSQL 程序中可以執行 SQL 語句,SQL 語句中也可以使用DMSQL 函數。DMSQL 程序是一種技術,而不是

15、一種獨立的工具,它是和 DM 數據庫服務器緊密結合在一起的。可以認為這種技術是執行 DMSQL 程序的一種機器,它可以接受任何有效的DMSQL 程序,按照語言本身所規定的語義執行,并將結果返回給客戶。DMSQL 程序可以分為存儲模塊和客戶端DMSQL 程序兩類。用戶可以使用DMSQL 程序語言創建過程或函數,稱為存儲過程和存儲函數。這些過程或函數像普通的過程或函數一樣,有輸入、輸出參數和返回值,它們與表和視圖等數據庫對象一樣被存儲在數據庫中,供用戶隨時調用。存儲過程和存儲函數在功能上相當于客戶端的一段SQL 批處理程序,但是在許多方面有著后者無法比擬的優點,它為用戶提供了一種高效率的編程手段,

16、成為現代數據庫系統的重要特征。通常,我們將存儲過程和存儲函數統稱為存儲模塊。客戶端 DMSQL 程序可以實現的功能與存儲模塊一致,不同的是客戶端 DMSQL 程序并不創建一個具體的數據庫對象。其處理方法為 DM 數據庫服務器在預編譯階段將客戶端DMSQL 程序轉化為虛過程。虛過程不需要存儲,創建后立即執行,當執行的語句釋放時, 虛過程對象也一同被釋放。客戶端DMSQL 程序只從語法上和存儲模塊兼容,完成和存儲模塊一樣的功能,是一種編程手段。使用 DMSQL 程序的優點DMSQL 程序具有以下優點:與 SQL 語言的完美結合SQL 語言已成為數據庫的標準語言,DMSQL 程序支持所有 SQL 數

17、據類型和所有 SQL 函數,同時支持所有 DM 對象類型。在DMSQL 程序中可以使用 SELECT、INSERT、DELETE、UPDATE 數據操作語句,事務控制語句,游標操縱語句以及通過動態 SQL 執行DDL 語句。與 SQL 語言的完美結合使得 DMSQL 程序不僅能實現 SQL 的所有功能,且由于其自身的程序設計特性,能提供更加豐富、強大的功能。提供更高的生產率在使用 DMSQL 程序設計應用時,圍繞存儲過程/函數進行設計,可以避免重復編碼, 提高生產率;在自頂向下設計應用時,不必關心實現的細節;編程方便。從DM7 開始,支持 C 和JAVA 語言語法的DMSQL 程序,這樣在對自

18、定義的 DMSQL 程序語法不熟悉的情況下也可以對數據庫進行各種操作,對數據庫的操作更加靈活,也更加容易。提供更好的性能DMSQL 存儲模塊在創建時被編譯成偽碼序列,在運行時不需要重新進行編譯和優化處理,具有更快的執行速度,可以同時被多個用戶調用,并能夠減少操作錯誤。使用存儲模塊可減少應用對DM 的調用,降低系統資源浪費,顯著提高性能,尤其是對在網絡上與 DM 通訊的應用更加顯著。便于維護用戶定義的存儲模塊在 DM 數據庫中集中存放,用戶可以根據需要隨時查詢、刪除或重建它們,而調用這些存儲模塊的應用程序可以不作任何修改,或只做少量調整。存儲模塊能被其他的DMSQL 程序或 SQL 命令調用,任

19、何客戶/服務器工具都能訪問存儲模塊,具有很好的可重用性。提供更高的安全性存儲模塊可將用戶與具體的內部數據操作進行隔離,提高數據庫的安全性。如一個存 儲模塊查詢并修改一個表的某幾個列,管理員將這個存儲模塊的執行權限授予某用戶,而不必將表的訪問和修改權限授予這個用戶,保證用戶只訪問修改其需要的數據。可以使用DM 的管理工具管理存儲在數據庫中的存儲模塊的安全性,可以授予或撤銷數據庫其他用戶執行存儲模塊的權限。一個簡單的 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(公司總人數 | person_count); IF person_count 5 THENRAISE_APPLICATION_ERROR(-20001, 公司總人數過少!); ELSENULL; END IF;END;/該例子創建一個名為 RESOURCES.person_account 的存儲過程,其中定義了變量, 在執行部分執行一條 SELECT 語句,打印查詢結

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

22、合類型和類類型,用戶還可以定義自己的子類型。常規數據類型數值數據類型NUMERIC 類型語法:NUMERIC( 精度 , 標度)功能:NUMERIC 數據類型用于存儲零、正負定點數。其中:精度是一個無符號整數,定義了總的數字數,精度范圍是 1 至 38,標度定義了小數點右邊的數字位數,定義時如省略精度,則默認是 16。如省略標度,則默認是 0。一個數的標度不應大于其精度。例如: NUMERIC(4,1)定義了小數點前面 3 位和小數點后面 1 位,共 4 位的數字,范圍在 -999.9 到 999.9。所有 NUMERIC 數據類型,如果其值超過精度,達夢數據庫返回一個出錯信息,如果超過標度,

23、則多余的位截斷。如果不指定精度和標度,缺省精度為 38。NUMBER 類型語法:NUMBER(精度 , 標度)功能:與 NUMERIC 類型相同。DECIMAL/DEC 類型DM8SQL 程序設計 PAGE 6語法:DECIMAL(精度 , 標度)DEC(精度 , 標度)功能:與 NUMERIC 相似。BIT 類型語法:BIT功能:BIT 類型用于存儲整數數據 1、0 或NULL,可以用來支持 ODBC 和 JDBC 的布爾數據類型。DM 的 BIT 類型與 SQL SERVER2000 的BIT 數據類型相似。INTEGER/INT 類型語法:INTEGERINT功能:用于存儲有符號整數,精

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

25、,標度為 0。SMALLINT 類型語法:SMALLINT功能:用于存儲有符號整數,精度為 5,標度為 0。BINARY 類型語法:BINARY(長度 )功能:BINARY 數據類型指定定長二進制數據。缺省長度為 1 個字節,最大長度由數據庫頁面大小決定,具體可參考DM8_SQL 語言使用手冊1.4.1 節。BINARY 常量以 0 x 開始, 后跟數據的十六進制表示,例如 0 x2A3B4058。VARBINARY 類型語法:VARBINARY(長度 )功能:VARBINARY 數據類型指定變長二進制數據,用法類似BINARY 數據類型,可以指定一個正整數作為數據長度。缺省長度為 8188

26、個字節,最大長度由數據庫頁面大小決定, 具體可參考DM8_SQL 語言使用手冊1.4.1 節。DM8SQL 程序設計 PAGE 8REAL 類型語法:REAL功能:REAL 是帶二進制的浮點數,但它不能由用戶指定使用的精度,系統指定其二進制精度為 24,十進制精度為 7。取值范圍-3.4E + 38 3.4E + 38。FLOAT 類型語法:FLOAT(精度)功能:FLOAT 是帶二進制精度的浮點數,精度最大不超過 53,如省略精度,則二進制精度為 53,十進制精度為 15。取值范圍為-1.7E + 308 1.7E + 308。DOUBLE 類型語法:DOUBLE(精度)功能:同 FLOAT

27、 相似,精度最大不超過 53。DOUBLE PRECISION 類型語法:DOUBLE PRECISION功能:該類型指明雙精度浮點數,其二進制精度為 53,十進制精度為 15。取值范圍-1.7E+ 308 1.7E + 308。字符數據類型CHAR/CHARACTER 類型語法:CHAR(長度)CHARACTER(長度)功能:定長字符串,最大長度由數據庫頁面大小決定,具體可參考DM8_SQL 語言使用手冊1.4.1 節。長度不足時,自動填充空格。VARCHAR 類型語法:VARCHAR(長度)功能:可變長字符串,最大長度由數據庫頁面大小決定,具體可參考DM8_SQL 語言使用手冊1.4.1

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

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

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

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

32、TO MINUTE 類型,取值范圍:-12:59 與+14:00 之間。例如:2009-10-11 19:03:05.0000 -02:10。TIMESTAMP WITH LOCAL TIME ZONE 類型語法:TIMESTAMP(小數秒精度)WITH LOCAL TIME ZONE功能:描述一個本地時區的 TIMESTAMP 值,能夠將標準時區類型 TIMESTAMP WITHTIME ZONE 類型轉化為本地時區類型,如果插入的值沒有指定時區,則默認為本地時區。時間間隔數據類型DM 支持兩類十三種時間間隔類型:兩類是年-月間隔類和日-時間隔類,它們通過時間間隔限定符區分,前者結合了日期字

33、段年和月,后者結合了時間字段日、時、分、秒。由時間間隔數據類型所描述的值總是有符號的。對時間間隔類型的介紹見表 2.1,需要查看更為詳細的信息可參看DM8_SQL 語言使用手冊1.4.3 節。表 2.1 DMSQL 程序支持的時間間隔數據類型類型名類型描述INTERVAL YEAR(P)年間隔,即兩個日期之間的年數字,P 為時間間隔的首項字段精度(后面簡稱為:首精度)INTERVAL MONTH(P)月間隔,即兩個日期之間的月數字,P 為時間間隔的首精度INTERVAL DAY(P)日間隔,即為兩個日期/時間之間的日數字,P 為時間間隔的首精度INTERVA L HOUR(P)時間隔,即為兩個

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

35、精度INTERVALDAY(P)TO SECOND(Q)日時分秒間隔,即為兩個日期/時間之間的日時分秒數字,P 為時間間隔的首精度,Q 為時間間隔秒精度INTERVALLHOUR(P) TO MINUTE時分間隔,即為兩個日期/時間之間的時分數字,P 為時間間隔的首精度INTERVALHOUR(P) TO SECOND(Q)時分秒間隔,即為兩個日期/時間之間的時分秒數字,P 為時間間隔的首精度,Q 為時間間隔秒精度INTERVAL MINUTE(P) TO SECOND(Q)分秒間隔,即為兩個日期/時間之間的分秒間隔,P 為時間間隔的首精度,Q 為時間間隔秒精度BOOL/BOOLEAN 數據類

36、型語法:BOOLBOOLEAN功能:布爾數據類型:TRUE 和 FALSE。DMSQL 程序的布爾類型和 INT 類型可以相互轉化。如果變量或方法返回的類型是布爾類型,則返回值為 0 或 1。TRUE 和非 0 值的返回值為1,FALSE 和 0 值返回為 0。%TYPE 和%ROWTYPEDECLAREV_NAME VARCHAR(30);在許多時候,DMSQL 程序變量被用來處理存儲在數據庫表中的數據。這種情況下,變量應該擁有與表列相同的類型。例如表T(ID INT, NAME VARCHAR(30)中字段 NAME 類型為 VARCHAR(30)。對應地在 DMSQL 程序中,我們可以聲

37、明一個變量:DECLAREV_NAME VARCHAR(100);但是如果 T 中的NAME 字段定義發生了變化,比如變為VARCHAR(100)。那么存儲過程中的變量 V_NAME 也要相應修改為:如果用戶應用中有很多的變量以及 DMSQL 程序代碼,這種處理可能是十分耗時和容易出錯的。DECLAREV_NAME T.NAME%TYPE;為了解決上述問題,DMSQL 程序提供了%TYPE 類型。%TYPE 可以將變量同表列的類型進行綁定。例如:通過使用%TYPE,V_NAME 將擁有 T 表的NAME 列所擁有的類型。如果表 T 的 NAME列類型定義發生變化,V_NAME 的類型也隨之自動

38、發生變化,而不需要用戶手動修改。例如,使用%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 將返回一個基于表定義的運算類型,它將一個記錄聲明為具有相同類型的數據庫行。例如: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 程序更加靈活,更適應于對數據庫的處理。記錄類型記錄類型是由單行多列的標量類型構成復合類型,類似于 C 語言中的結構。記錄類型提供了處理分立但又作為一個整體單元的相關變量的一種機制。例如:DECLARE V_ID INT; V_NAME VARCHAR(30); 這兩個變量在邏輯上是相互關聯的,因為它們分別對應表 T(ID INT, NAME VARCHAR(30)中的兩個字段。如果為這樣的變量聲明一個記錄類型,那么它們之

41、間的關系就十分明顯了。定義記錄類型的語法如下:TYPE IS RECORD( , ); := | := DEFAULT := := 通過將需要操作的表結構定義成一個記錄,可以方便地對表中的行數據進行操作。在DMSQL 程序中使用記錄,需要先定義一個 RECORD 類型,再用該類型聲明變量,也可以使用上一小節介紹的%ROWTYPE 來創建與表結構匹配的記錄。可以單獨對記錄中的字段賦值,使用點標記引用一個記錄中的字段(記錄名.字段名)。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 更新表的一行數據。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、字段類型定義必須完全一致。如下面的例子將表中的一行數據讀取到一個記錄中。然后,將記錄 v_rec1 賦值給 v_rec2。DECLARETYPE T_REC IS RECORD( ID INT3, NAME VARCHAR(30)3);定義記錄類型時,字段的數據類型除了可以是常規數據類型,還可以是常規數據類型后跟著“n”或“n1,n2.”表示一維或多維數組,如:DMSQL 程序還支持定義包含數組、集合和其他 RECORD 的RECORD。例如下面是一個在 RECORD 定義中包含其他 RECORD 的例子,關于數組和集合的介紹請看后續小節。); BEGINNULL; END;/- 嵌套記錄 T

45、imeTypetime_of TimeTypeDATE,dayTYPE MeetingType IS RECORD (-定義記錄 TimeTypeDECLARETYPE TimeType IS RECORD (hours INT, minutes INT );數組類型DMSQL 程序支持數組數據類型,包括靜態數組類型和動態數組類型。 DM數組下標的起始值為1。靜態數組類型靜態數組是在聲明時已經確定了數組大小的數組,其長度是預先定義好的,在整個程序中,一旦給定大小后就無法改變。array_nameIS定義靜態數組類型的語法圖例如下:TYPEdatatypeconst_exp;,ARRAY定義了靜

46、態數組類型后需要用這個類型申明一個數組變量然后進行操作。理論上 DM 支持靜態數組的每一個維度的最大長度為 65534,但是靜態數組最大長度同時受系統內部堆棧空間大小的限制,如果超出堆棧的空間限制,系統會報錯。-TYPE 定義一維數組類型DECLARETYPE Arr IS ARRAY VARCHAR3;下面是一個使用靜態數組的例子: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;/-聲明二維數組b Arr1;TYPE Arr1 IS ARRAY VARCHAR2,4; -TYPE 定義二維數組類型-聲明一維數組a Arr;動態數組類型與靜態數組不同,動態數組可以隨程序需要而重新指定大小,其內存空間是從堆(HEAP)上分配(即動態分配)的,通過執行代碼而為其分配存儲空間,并由 DM 自動釋放內存。TYPEdatatype;,ARRAYarray_nameIS動態數組與靜態數組的定義方法類似,區別只在于動態數組沒有指定下標,需要動態分配空間。定義動態數組類型的語法圖例如下:數組變量名 := NEW 數據類型常量表達式,;定義了動態數組類型后需

48、要用這個類型申明一個數組變量,之后在 DMSQL 程序的執行部分需要為這個數組變量動態分配空間。動態分配空間語句如下所示:數組變量名 := NEW 數據類型常量表達式;或者可以使用如下語句對多維數組的某一維度進行空間分配:下面給出了一個使用動態數組的例子:DECLARETYPE Arr IS ARRAY VARCHAR;a Arr; BEGINa := NEW VARCHAR4;-動態分配空間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;-動態分配第一維空間FOR I IN 1.2 LOOPbI := NEW VARCHAR4;-動態分配第二維空間FOR J IN 1.4 LOOPbIJ = I*10+J;PRINT bIJ; END LOOP;END LOOP;END;/對于多維動態數組,可以單獨為每個維度動態分配空間,如下面的例子所示:也可以一次性為多維動態數組分配空間,則上面的例子可以寫為: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 支持動態數組的每一個維度的最大長度為 2147483646,但是數組最大長度同時受系統內部堆空間大小的限制,如果超出堆的空間限制,系統會報錯。復雜類型數組除了普通數據類型的數組,DM 還支持自定義類型、記錄類型和集合類型的數組。在下面的例子中,定義了一個自定義類型(OBJECT 類型)的靜態數組,存放圖書的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 為例)的數組,將員工的姓名、性別和職位信息存放到數組變量中。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 是一種具有可伸縮性的數組,數組中的每個元素具有相同的數據類型。VARRAY 在定義時由用戶指定一個最大容量,其元素索引是從 1 開始的有序數字。定義VARRAY 的語法格式為:TYPE IS VARRAY() OF ;表示數組的最大容量。是 VARRAY 中元素的數據類型,可以是常規數據類型,也可以是其他自定義類型或對象、記錄、其他 VARRAY 類型等,使得構造復雜的結構成為可能。TYPE my_array_type IS VARRAY(10) OF INTEGER;v MY_ARRAY

55、_TYPE;在定義了一個VARRAY 數組類型后,再聲明一個該數組類型的變量,就可以對這個數組變量進行操作了。如下面的代碼片段所示:使用v.COUNT()方法可以得到數組 v 當前的實際大小,v.LIMIT()則可獲得數組 v的最大容量。需要注意的是,VARRAY 的元素索引總是連續的。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 的簡單使用示例,查詢人員姓名并將其存入一個 VARRAY 變量中。VARRAY 最初的實際大小為 0,使用 EXCTEND()方法可擴展 VARRAY 元素個數,具體在 2.5.4 節中介紹。索引表索引表提供了一種快速、方便地管理一組相關數

57、據的方法。索引表是一組數據的集合, 它將數據按照一定規則組織起來,形成一個可操作的整體,是對大量數據進行有效組織和管理的手段之一,通過函數可以對大量性質相同的數據進行存儲、排序、插入及刪除等操作,從而可以有效地提高程序開發效率及改善程序的編寫方式。索引表不需要用戶指定大小,其大小根據用戶的操作自動增長。定義索引表的語法格式為: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 ;“數據類型”指索引表存放的數據的類型,這個數據類型可以是常規數據類型,也可以是其他自定義類型或是對象、記錄、靜態數組,但不能是動態數組;“索引數據類型”則是索引表中元素索引的數據類型,DM 目前僅支持 INTEGER/INT 和VARCHAR 兩種類型, 分別代表整數索引和字符串索引。對于 VARCHAR 類型,長度不能超過 1024。用戶可使用“索引-數據”對向索引表插入數據,之后可通過“索引”修改和查詢這個數據,而不需要知道數據在索引表中實際的位置。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;/下面給出了一個非常簡單的索引表的使用示例。索引表還可以用來管理記錄,下面的例子索引表中存放的數據類型為RECORD,展示了如何存入和遍歷輸出索引表的記錄類型數據。-遍歷結果集,把每行的值都存放入索引表中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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論