數(shù)據(jù)庫(kù)系統(tǒng)概論:第8章 數(shù)據(jù)庫(kù)編程_第1頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)概論:第8章 數(shù)據(jù)庫(kù)編程_第2頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)概論:第8章 數(shù)據(jù)庫(kù)編程_第3頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)概論:第8章 數(shù)據(jù)庫(kù)編程_第4頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)概論:第8章 數(shù)據(jù)庫(kù)編程_第5頁(yè)
已閱讀5頁(yè),還剩134頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、An Introduction to Database System數(shù)據(jù)庫(kù)系統(tǒng)概論An Introduction to Database System第八章第八章 數(shù)據(jù)庫(kù)編程數(shù)據(jù)庫(kù)編程An Introduction to Database System第八章第八章 數(shù)據(jù)庫(kù)編程數(shù)據(jù)庫(kù)編程8.1 嵌入式嵌入式SQL8.2 過(guò)程化過(guò)程化SQL8.3 存儲(chǔ)過(guò)程和函數(shù)存儲(chǔ)過(guò)程和函數(shù)8.4 ODBC編程編程*8.5 OLE DB*8.6 JDBC編程編程8.7 小結(jié)小結(jié)An Introduction to Database System8.1 嵌入式嵌入式SQLvSQL語(yǔ)言提供了兩種不同的使用方式語(yǔ)言提供

2、了兩種不同的使用方式n交互式交互式n嵌入式嵌入式v為什么要引入嵌入式為什么要引入嵌入式SQLnSQL語(yǔ)言是非過(guò)程性語(yǔ)言語(yǔ)言是非過(guò)程性語(yǔ)言n事務(wù)處理應(yīng)用需要高級(jí)語(yǔ)言事務(wù)處理應(yīng)用需要高級(jí)語(yǔ)言v這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語(yǔ)句要做某些必要的擴(kuò)充語(yǔ)句要做某些必要的擴(kuò)充An Introduction to Database System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過(guò)程的處理過(guò)程8.1.2 嵌入式嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不用游標(biāo)的不用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.4

3、 使用游標(biāo)的使用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLAn Introduction to Database System8.1.1 嵌入式嵌入式SQL的處理過(guò)程的處理過(guò)程v主語(yǔ)言主語(yǔ)言n嵌入式嵌入式SQL是將是將SQL語(yǔ)句嵌入程序設(shè)計(jì)語(yǔ)言中,被嵌入語(yǔ)句嵌入程序設(shè)計(jì)語(yǔ)言中,被嵌入的程序設(shè)計(jì)語(yǔ)言,如的程序設(shè)計(jì)語(yǔ)言,如C、C+、Java,稱為宿主語(yǔ)言,稱為宿主語(yǔ)言,簡(jiǎn)稱主語(yǔ)言。簡(jiǎn)稱主語(yǔ)言。v處理過(guò)程處理過(guò)程n預(yù)編譯方法預(yù)編譯方法An Introduction to Database System嵌入式嵌入式SQL的處理過(guò)程(續(xù))的處理過(guò)程(續(xù)) 關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)預(yù)處關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)預(yù)處

4、理程序轉(zhuǎn)換嵌入式理程序轉(zhuǎn)換嵌入式SQL語(yǔ)語(yǔ)句為函數(shù)調(diào)用句為函數(shù)調(diào)用含嵌入式含嵌入式SQL語(yǔ)句語(yǔ)句的主語(yǔ)言程序的主語(yǔ)言程序轉(zhuǎn)換后的轉(zhuǎn)換后的主語(yǔ)言程序主語(yǔ)言程序主語(yǔ)言編譯程序主語(yǔ)言編譯程序編譯處理編譯處理目標(biāo)語(yǔ)言程序目標(biāo)語(yǔ)言程序An Introduction to Database System嵌入式嵌入式SQL的處理過(guò)程(續(xù))的處理過(guò)程(續(xù)) v為了區(qū)分為了區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句,所有語(yǔ)句與主語(yǔ)言語(yǔ)句,所有SQL語(yǔ)句語(yǔ)句必須加前綴必須加前綴EXEC SQL, 主語(yǔ)言為主語(yǔ)言為C語(yǔ)言時(shí),語(yǔ)句格式:語(yǔ)言時(shí),語(yǔ)句格式:nEXEC SQL ;An Introduction to Database S

5、ystem8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過(guò)程的處理過(guò)程8.1.2 嵌入式嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不用游標(biāo)的不用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLAn Introduction to Database System8.1.2 嵌入式嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信語(yǔ)句與主語(yǔ)言之間的通信v將將SQL嵌入到高級(jí)語(yǔ)言中混合編程,程序中會(huì)含嵌入到高級(jí)語(yǔ)言中混合編程,程序中會(huì)含有兩種不同計(jì)算模型的語(yǔ)句有兩種不同計(jì)算模型的語(yǔ)句nSQL語(yǔ)句語(yǔ)句l 描述性的面向集合的語(yǔ)句描述性

6、的面向集合的語(yǔ)句l 負(fù)責(zé)操縱數(shù)據(jù)庫(kù)負(fù)責(zé)操縱數(shù)據(jù)庫(kù)n高級(jí)語(yǔ)言語(yǔ)句高級(jí)語(yǔ)言語(yǔ)句l 過(guò)程性的面向記錄的語(yǔ)句過(guò)程性的面向記錄的語(yǔ)句l 負(fù)責(zé)控制邏輯流程負(fù)責(zé)控制邏輯流程n它們之間應(yīng)該如何通信?它們之間應(yīng)該如何通信?An Introduction to Database System嵌入式嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信(續(xù))語(yǔ)句與主語(yǔ)言之間的通信(續(xù)) v數(shù)據(jù)庫(kù)工作單元與源程序工作單元之間的通信數(shù)據(jù)庫(kù)工作單元與源程序工作單元之間的通信(1)向主語(yǔ)言傳遞)向主語(yǔ)言傳遞SQL語(yǔ)句的執(zhí)行狀態(tài)信息,使主語(yǔ)言語(yǔ)句的執(zhí)行狀態(tài)信息,使主語(yǔ)言能夠據(jù)此控制程序流程,主要用能夠據(jù)此控制程序流程,主要用SQL通信區(qū)實(shí)現(xiàn)通信

7、區(qū)實(shí)現(xiàn)(2)主語(yǔ)言向)主語(yǔ)言向SQL語(yǔ)句提供參數(shù),主要用主變量實(shí)現(xiàn)語(yǔ)句提供參數(shù),主要用主變量實(shí)現(xiàn)(3)將)將SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)的結(jié)果交主語(yǔ)言處理,主要語(yǔ)句查詢數(shù)據(jù)庫(kù)的結(jié)果交主語(yǔ)言處理,主要用主變量和游標(biāo)實(shí)現(xiàn)用主變量和游標(biāo)實(shí)現(xiàn)An Introduction to Database System1. SQL通信區(qū)通信區(qū)vSQLCA: SQL Communication AreanSQLCA是一個(gè)數(shù)據(jù)結(jié)構(gòu)是一個(gè)數(shù)據(jù)結(jié)構(gòu)vSQLCA的用途的用途nSQL語(yǔ)句執(zhí)行后,系統(tǒng)反饋給應(yīng)用程序信息語(yǔ)句執(zhí)行后,系統(tǒng)反饋給應(yīng)用程序信息l 描述系統(tǒng)當(dāng)前工作狀態(tài)描述系統(tǒng)當(dāng)前工作狀態(tài)l 描述運(yùn)行環(huán)境描述運(yùn)行環(huán)境n這些信息

8、將送到這些信息將送到SQL通信區(qū)中通信區(qū)中n應(yīng)用程序從應(yīng)用程序從SQL通信區(qū)中取出這些狀態(tài)信息,據(jù)此決通信區(qū)中取出這些狀態(tài)信息,據(jù)此決定接下來(lái)執(zhí)行的語(yǔ)句定接下來(lái)執(zhí)行的語(yǔ)句An Introduction to Database SystemSQL通信區(qū)(續(xù))通信區(qū)(續(xù))vSQLCA使用方法使用方法n定義定義SQLCAl 用用EXEC SQL INCLUDE SQLCA定義定義n使用使用SQLCAlSQLCA中有一個(gè)存放每次執(zhí)行中有一個(gè)存放每次執(zhí)行SQL語(yǔ)句后返回代碼的變語(yǔ)句后返回代碼的變量量SQLCODEl如果如果SQLCODE等于預(yù)定義的常量等于預(yù)定義的常量SUCCESS,則表示,則表示SQL

9、語(yǔ)句成功,否則表示出錯(cuò)語(yǔ)句成功,否則表示出錯(cuò)l應(yīng)用程序每執(zhí)行完一條應(yīng)用程序每執(zhí)行完一條SQL 語(yǔ)句之后都應(yīng)該測(cè)試一下語(yǔ)句之后都應(yīng)該測(cè)試一下SQLCODE的值,以了解該的值,以了解該SQL語(yǔ)句執(zhí)行情況并做相應(yīng)語(yǔ)句執(zhí)行情況并做相應(yīng)處理處理An Introduction to Database System2. 主變量主變量 v主變量主變量n嵌入式嵌入式SQL語(yǔ)句中可以使用主語(yǔ)言的程序變量來(lái)輸入語(yǔ)句中可以使用主語(yǔ)言的程序變量來(lái)輸入或輸出數(shù)據(jù)或輸出數(shù)據(jù)n在在SQL語(yǔ)句中使用的主語(yǔ)言程序變量簡(jiǎn)稱為主變量語(yǔ)句中使用的主語(yǔ)言程序變量簡(jiǎn)稱為主變量(Host Variable)An Introduction t

10、o Database System主變量(續(xù))主變量(續(xù)) v主變量的類型主變量的類型n輸入主變量輸入主變量l由應(yīng)用程序?qū)ζ滟x值,由應(yīng)用程序?qū)ζ滟x值,SQL語(yǔ)句引用語(yǔ)句引用n輸出主變量輸出主變量l由由SQL語(yǔ)句對(duì)其賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序語(yǔ)句對(duì)其賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序An Introduction to Database System主變量(續(xù))主變量(續(xù)) v指示變量指示變量n是一個(gè)整型變量,用來(lái)是一個(gè)整型變量,用來(lái)“指示指示”所指主變量的值或條件所指主變量的值或條件n一個(gè)主變量可以附帶一個(gè)指示變量(一個(gè)主變量可以附帶一個(gè)指示變量(Indicator Variable)

11、n指示變量的用途指示變量的用途l指示輸入主變量是否為空值指示輸入主變量是否為空值l檢測(cè)輸出變量是否為空值,值是否被截?cái)鄼z測(cè)輸出變量是否為空值,值是否被截?cái)郃n Introduction to Database System主變量(續(xù))主變量(續(xù)) v在在SQL語(yǔ)句中使用主變量和指示變量的方法語(yǔ)句中使用主變量和指示變量的方法n說(shuō)明主變量和指示變量說(shuō)明主變量和指示變量BEGIN DECLARE SECTION. (說(shuō)明主變量和指示變量)(說(shuō)明主變量和指示變量).END DECLARE SECTIONAn Introduction to Database System主變量(續(xù))主變量(續(xù)) v在在

12、SQL語(yǔ)句中使用主變量和指示變量的方法(續(xù))語(yǔ)句中使用主變量和指示變量的方法(續(xù))n使用主變量使用主變量l說(shuō)明之后的主變量可以在說(shuō)明之后的主變量可以在SQL語(yǔ)句中任何一個(gè)能夠使用表語(yǔ)句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn)達(dá)式的地方出現(xiàn)l為了與數(shù)據(jù)庫(kù)對(duì)象名(表名、視圖名、列名等)區(qū)別,為了與數(shù)據(jù)庫(kù)對(duì)象名(表名、視圖名、列名等)區(qū)別,SQL語(yǔ)句中的主變量名前要加冒號(hào)(語(yǔ)句中的主變量名前要加冒號(hào)(:)作為標(biāo)志)作為標(biāo)志n使用指示變量使用指示變量l 指示變量前也必須加冒號(hào)標(biāo)志指示變量前也必須加冒號(hào)標(biāo)志l 必須緊跟在所指主變量之后必須緊跟在所指主變量之后An Introduction to Databas

13、e System主變量(續(xù))主變量(續(xù)) v在在SQL語(yǔ)句之外(主語(yǔ)言語(yǔ)句中)使用主變量和語(yǔ)句之外(主語(yǔ)言語(yǔ)句中)使用主變量和指示變量的方法指示變量的方法n可以直接引用,不必加冒號(hào)可以直接引用,不必加冒號(hào)An Introduction to Database System3. 游標(biāo)游標(biāo)v為什么要使用游標(biāo)為什么要使用游標(biāo)nSQL語(yǔ)言與主語(yǔ)言具有不同數(shù)據(jù)處理方式語(yǔ)言與主語(yǔ)言具有不同數(shù)據(jù)處理方式nSQL語(yǔ)言是面向集合的,一條語(yǔ)言是面向集合的,一條SQL語(yǔ)句原則上可以產(chǎn)語(yǔ)句原則上可以產(chǎn)生或處理多條記錄生或處理多條記錄n主語(yǔ)言是面向記錄的,一組主變量一次只能存放一條主語(yǔ)言是面向記錄的,一組主變量一次只能

14、存放一條記錄記錄n僅使用主變量并不能完全滿足僅使用主變量并不能完全滿足SQL語(yǔ)句向應(yīng)用程序輸語(yǔ)句向應(yīng)用程序輸出數(shù)據(jù)的要求出數(shù)據(jù)的要求n嵌入式嵌入式SQL引入了游標(biāo)的概念,用來(lái)協(xié)調(diào)這兩種不同引入了游標(biāo)的概念,用來(lái)協(xié)調(diào)這兩種不同的處理方式的處理方式An Introduction to Database System 游標(biāo)(續(xù))游標(biāo)(續(xù))v游標(biāo)游標(biāo)n游標(biāo)是系統(tǒng)為用戶開(kāi)設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放游標(biāo)是系統(tǒng)為用戶開(kāi)設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語(yǔ)句的執(zhí)行結(jié)果語(yǔ)句的執(zhí)行結(jié)果n每個(gè)游標(biāo)區(qū)都有一個(gè)名字每個(gè)游標(biāo)區(qū)都有一個(gè)名字n用戶可以用用戶可以用SQL語(yǔ)句逐一從游標(biāo)中獲取記錄,并賦給語(yǔ)句逐一從游標(biāo)中獲取記錄,并賦

15、給主變量,交由主語(yǔ)言進(jìn)一步處理主變量,交由主語(yǔ)言進(jìn)一步處理An Introduction to Database System4. 建立和關(guān)閉數(shù)據(jù)庫(kù)連接建立和關(guān)閉數(shù)據(jù)庫(kù)連接(1)建立數(shù)據(jù)庫(kù)連接)建立數(shù)據(jù)庫(kù)連接 EXEC SQL CONNECT TO targetAS connection-nameUSER user-name; ntarget是要連接的數(shù)據(jù)庫(kù)服務(wù)器是要連接的數(shù)據(jù)庫(kù)服務(wù)器l常見(jiàn)的服務(wù)器標(biāo)識(shí)串,如常見(jiàn)的服務(wù)器標(biāo)識(shí)串,如: l包含服務(wù)器標(biāo)識(shí)的包含服務(wù)器標(biāo)識(shí)的SQL串常量串常量 lDEFAULT An Introduction to Database System建立和關(guān)閉數(shù)據(jù)庫(kù)連接(

16、續(xù))建立和關(guān)閉數(shù)據(jù)庫(kù)連接(續(xù))nconnect-name是可選的連接名,連接名必須是一個(gè)是可選的連接名,連接名必須是一個(gè)有效的標(biāo)識(shí)符有效的標(biāo)識(shí)符 n在整個(gè)程序內(nèi)只有一個(gè)連接時(shí)可以不指定連接名在整個(gè)程序內(nèi)只有一個(gè)連接時(shí)可以不指定連接名n程序運(yùn)行過(guò)程中可以修改當(dāng)前連接程序運(yùn)行過(guò)程中可以修改當(dāng)前連接 EXEC SQL SET CONNECTION connection-name |DEFAULT;An Introduction to Database System建立和關(guān)閉數(shù)據(jù)庫(kù)連接(續(xù))建立和關(guān)閉數(shù)據(jù)庫(kù)連接(續(xù))(2)關(guān)閉數(shù)據(jù)庫(kù)連接)關(guān)閉數(shù)據(jù)庫(kù)連接 EXEC SQL DISCONNECT conn

17、ection;An Introduction to Database System5. 程序?qū)嵗绦驅(qū)嵗齰例例8.1 依次檢查某個(gè)系的學(xué)生記錄,交互式更新依次檢查某個(gè)系的學(xué)生記錄,交互式更新某些學(xué)生年齡。某些學(xué)生年齡。EXEC SQL BEGIN DECLARE SECTION; /*主變量說(shuō)明開(kāi)始主變量說(shuō)明開(kāi)始*/ char Deptname20;char Hsno9;char Hsname20; char Hssex2;int HSage;int NEWAGE;EXEC SQL END DECLARE SECTION; /*主變量說(shuō)明結(jié)束主變量說(shuō)明結(jié)束*/long SQLCODE;EXEC

18、 SQL INCLUDE SQLCA; /*定義定義SQL通信區(qū)通信區(qū)*/An Introduction to Database System程序?qū)嵗ɡm(xù))程序?qū)嵗ɡm(xù))int main(void) /*C語(yǔ)言主程序開(kāi)始語(yǔ)言主程序開(kāi)始*/int count = 0;char yn; /*變量變量yn代表代表yes或或no*/printf(Please choose the department name(CS/MA/IS): ); scanf(%s,deptname); /*為主變量為主變量deptname賦值賦值*/EXEC SQL CONNECT TO TESTlocalhost:5432

19、1 USER SYSTEM/MANAGER; /*連接數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)TEST*/EXEC SQL DECLARE SX CURSOR FOR /*定義游標(biāo)定義游標(biāo)SX*/SELECT Sno,Sname,Ssex,Sage /*SX對(duì)應(yīng)的語(yǔ)句對(duì)應(yīng)的語(yǔ)句*/FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; /*打開(kāi)游標(biāo)打開(kāi)游標(biāo)SX,指向查詢結(jié)果的第一行,指向查詢結(jié)果的第一行*/An Introduction to Database System程序?qū)嵗ɡm(xù))程序?qū)嵗ɡm(xù))for ( ; ; ) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄用循環(huán)

20、結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/ EXEC SQL FETCH SX INTO :HSno,:Hsname,:HSsex,:HSage; /*推進(jìn)游標(biāo),將當(dāng)前數(shù)據(jù)放入主變量推進(jìn)游標(biāo),將當(dāng)前數(shù)據(jù)放入主變量*/if (SQLCA.SQLCODE!= 0) /*SQLCODE != 0,表示操作不成功,表示操作不成功*/break; /*利用利用SQLCA中的狀態(tài)信息決定何時(shí)退出循環(huán)中的狀態(tài)信息決定何時(shí)退出循環(huán)*/if(count+ = 0) /*如果是第一行的話,先打出行頭如果是第一行的話,先打出行頭*/ printf(n%-10s %-20s %-10s %-10sn, Sno“,Sname“,S

21、sex, Sage);printf(%-10s %-20s %-10s %-10dn“, HSno,Hsname,Hssex,HSage); /*打印查詢結(jié)果打印查詢結(jié)果*/ printf(“UPDATE AGE(y/n)?”); /*詢問(wèn)用戶是否要更新該學(xué)生的年齡詢問(wèn)用戶是否要更新該學(xué)生的年齡*/ doscanf(%c,&yn); while(yn != N & yn != n & yn != Y & yn != y);An Introduction to Database System程序?qū)嵗ɡm(xù))程序?qū)嵗ɡm(xù)) if (yn = y | yn = Y) /

22、*如果選擇更新操作如果選擇更新操作*/ printf(INPUT NEW AGE:); scanf(%d,&NEWAGE); /*用戶輸入新年齡到主變量中用戶輸入新年齡到主變量中*/ EXEC SQL UPDATE Student /*嵌入式嵌入式SQL更新語(yǔ)句更新語(yǔ)句*/ SET Sage = :NEWAGE WHERE CURRENT OF SX; /*對(duì)當(dāng)前游標(biāo)指向的學(xué)生年齡進(jìn)行更新對(duì)當(dāng)前游標(biāo)指向的學(xué)生年齡進(jìn)行更新*/ EXEC SQL CLOSE SX; /*關(guān)閉游標(biāo)關(guān)閉游標(biāo)SX,不再和查詢結(jié)果對(duì)應(yīng),不再和查詢結(jié)果對(duì)應(yīng)*/ EXEC SQL COMMIT WORK; /*提交更

23、新提交更新*/ EXEC SQL DISCONNECT TEST; /*斷開(kāi)數(shù)據(jù)庫(kù)連接斷開(kāi)數(shù)據(jù)庫(kù)連接*/An Introduction to Database System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過(guò)程的處理過(guò)程8.1.2 嵌入式嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不用游標(biāo)的不用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLAn Introduction to Database System8.1.3 不用游標(biāo)的不用游標(biāo)的SQL語(yǔ)句語(yǔ)句v不用游標(biāo)的不用游標(biāo)的SQL語(yǔ)句的種類語(yǔ)句的種

24、類n 說(shuō)明性語(yǔ)句說(shuō)明性語(yǔ)句n 數(shù)據(jù)定義語(yǔ)句數(shù)據(jù)定義語(yǔ)句n 數(shù)據(jù)控制語(yǔ)句數(shù)據(jù)控制語(yǔ)句n 查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語(yǔ)句語(yǔ)句n 非非CURRENT形式的增刪改語(yǔ)句形式的增刪改語(yǔ)句 An Introduction to Database System不用游標(biāo)的不用游標(biāo)的SQL語(yǔ)句(續(xù))語(yǔ)句(續(xù))1. 查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語(yǔ)句語(yǔ)句 2. 非非CURRENT形式的增刪改語(yǔ)句形式的增刪改語(yǔ)句An Introduction to Database System1. 查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語(yǔ)句語(yǔ)句v這類語(yǔ)句不需要使用游標(biāo),只需用這類語(yǔ)

25、句不需要使用游標(biāo),只需用INTO子句指定子句指定存放查詢結(jié)果的主變量。存放查詢結(jié)果的主變量。 v例例8.2 根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno; /*把要查詢的學(xué)生的學(xué)號(hào)賦給為了主變量把要查詢的學(xué)生的學(xué)號(hào)賦給為了主變量givensno*/An Introduction to Database System查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語(yǔ)句(續(xù)

26、)語(yǔ)句(續(xù))v INTO子句、子句、WHERE子句和子句和HAVING短語(yǔ)的條件短語(yǔ)的條件表達(dá)式中均可以使用主變量表達(dá)式中均可以使用主變量v 查詢返回的記錄中,可能某些列為空值查詢返回的記錄中,可能某些列為空值NULLv 如果查詢結(jié)果實(shí)際上并不是單條記錄,而是多如果查詢結(jié)果實(shí)際上并不是單條記錄,而是多條記錄,則程序出錯(cuò),關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)會(huì)在條記錄,則程序出錯(cuò),關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)會(huì)在SQLCA中返回錯(cuò)誤信息中返回錯(cuò)誤信息 An Introduction to Database System查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語(yǔ)句(續(xù))語(yǔ)句(續(xù))v例例8.3 查詢某個(gè)學(xué)生選修某門(mén)課程

27、的成績(jī)。假設(shè)查詢某個(gè)學(xué)生選修某門(mén)課程的成績(jī)。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量已經(jīng)把將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno,將課程號(hào)賦給了主變量,將課程號(hào)賦給了主變量givencno。EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid /*指示變量指示變量Gradeid*/ FROM SC WHERE Sno=:givensno AND Cno=:givencno;如果如果Gradeid 0,不論,不論Hgrade為何值,均認(rèn)為該學(xué)生成為何值,均認(rèn)為該學(xué)生成績(jī)?yōu)榭罩????jī)?yōu)榭罩?。An Introducti

28、on to Database System2. 非非CURRENT形式的增刪改語(yǔ)句形式的增刪改語(yǔ)句v在在UPDATE的的SET子句和子句和WHERE子句中可以使用子句中可以使用主變量,主變量,SET子句還可以使用指示變量子句還可以使用指示變量 v例例8.4 修改某個(gè)學(xué)生選修修改某個(gè)學(xué)生選修1號(hào)課程的成績(jī)。號(hào)課程的成績(jī)。EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成績(jī)已賦給主變量:修改的成績(jī)已賦給主變量:newgrade*/ WHERE Sno=:givensno;/*學(xué)號(hào)賦給主變量:學(xué)號(hào)賦給主變量:givensno*/An Introduction

29、to Database System非非CURRENT形式的增刪改語(yǔ)句(續(xù))形式的增刪改語(yǔ)句(續(xù))v例例8.5 某個(gè)學(xué)生新選修了某門(mén)課程,將有關(guān)記錄某個(gè)學(xué)生新選修了某門(mén)課程,將有關(guān)記錄插入插入SC表中。假設(shè)插入的學(xué)號(hào)已賦給主變量表中。假設(shè)插入的學(xué)號(hào)已賦給主變量stdno,課程號(hào)已賦給主變量,課程號(hào)已賦給主變量couno。gradeid=-1; /*gradeid為指示變量,賦為負(fù)值為指示變量,賦為負(fù)值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); /*:stdno,:couno,:gr為主

30、變量為主變量*/ 由于該學(xué)生剛選修課程,成績(jī)應(yīng)為空,所以要把指示變量由于該學(xué)生剛選修課程,成績(jī)應(yīng)為空,所以要把指示變量賦為負(fù)值賦為負(fù)值A(chǔ)n Introduction to Database System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過(guò)程的處理過(guò)程8.1.2 嵌入式嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不用游標(biāo)的不用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLAn Introduction to Database System8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語(yǔ)句語(yǔ)句v必須使用游標(biāo)的

31、必須使用游標(biāo)的SQL語(yǔ)句語(yǔ)句n查詢結(jié)果為多條記錄的查詢結(jié)果為多條記錄的SELECT語(yǔ)句語(yǔ)句nCURRENT形式的形式的UPDATE語(yǔ)句語(yǔ)句nCURRENT形式的形式的DELETE語(yǔ)句語(yǔ)句An Introduction to Database System使用游標(biāo)的使用游標(biāo)的SQL語(yǔ)句(續(xù))語(yǔ)句(續(xù))1. 查詢結(jié)果為多條記錄的查詢結(jié)果為多條記錄的SELECT語(yǔ)句語(yǔ)句2. CURRENT形式的形式的UPDATE和和DELETE語(yǔ)句語(yǔ)句An Introduction to Database System1. 查詢結(jié)果為多條記錄的查詢結(jié)果為多條記錄的SELECT語(yǔ)句語(yǔ)句v使用游標(biāo)的步驟使用游標(biāo)的步驟(

32、1)說(shuō)明游標(biāo))說(shuō)明游標(biāo)(2)打開(kāi)游標(biāo))打開(kāi)游標(biāo)(3)推進(jìn)游標(biāo)指針并取當(dāng)前記錄)推進(jìn)游標(biāo)指針并取當(dāng)前記錄 (4)關(guān)閉游標(biāo))關(guān)閉游標(biāo)An Introduction to Database System(1)說(shuō)明游標(biāo))說(shuō)明游標(biāo)v使用使用DECLARE語(yǔ)句語(yǔ)句v語(yǔ)句格式語(yǔ)句格式EXEC SQL DECLARE CURSOR FOR ;v功能功能n是一條說(shuō)明性語(yǔ)句,這時(shí)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)并不執(zhí)行是一條說(shuō)明性語(yǔ)句,這時(shí)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)并不執(zhí)行SELECT語(yǔ)句語(yǔ)句An Introduction to Database System(2)打開(kāi)游標(biāo))打開(kāi)游標(biāo)v使用使用OPEN語(yǔ)句語(yǔ)句v語(yǔ)句格式語(yǔ)句格式 EXE

33、C SQL OPEN ;v功能功能n打開(kāi)游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的打開(kāi)游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語(yǔ)句,把查詢結(jié)語(yǔ)句,把查詢結(jié)果取到緩沖區(qū)中果取到緩沖區(qū)中n這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中的第一這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中的第一條記錄條記錄An Introduction to Database System(3)推進(jìn)游標(biāo)指針并取當(dāng)前記錄)推進(jìn)游標(biāo)指針并取當(dāng)前記錄 v使用使用FETCH語(yǔ)句語(yǔ)句v語(yǔ)句格式語(yǔ)句格式 EXEC SQL FETCH INTO ,.;v功能功能n指定方向推動(dòng)游標(biāo)指針,同時(shí)將緩沖區(qū)中的當(dāng)前記錄取指定方向推動(dòng)游標(biāo)指針,同時(shí)將緩沖區(qū)中的當(dāng)前記錄取出來(lái)送

34、至主變量供主語(yǔ)言進(jìn)一步處理出來(lái)送至主變量供主語(yǔ)言進(jìn)一步處理An Introduction to Database System(4)關(guān)閉游標(biāo))關(guān)閉游標(biāo)v使用使用CLOSE語(yǔ)句語(yǔ)句v語(yǔ)句格式語(yǔ)句格式 EXEC SQL CLOSE ;v功能功能n關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源v說(shuō)明說(shuō)明n游標(biāo)被關(guān)閉后,就不再和原來(lái)的查詢結(jié)果集相聯(lián)系游標(biāo)被關(guān)閉后,就不再和原來(lái)的查詢結(jié)果集相聯(lián)系n被關(guān)閉的游標(biāo)可以再次被打開(kāi),與新的查詢結(jié)果相聯(lián)系被關(guān)閉的游標(biāo)可以再次被打開(kāi),與新的查詢結(jié)果相聯(lián)系A(chǔ)n Introduction to Database System2. C

35、URRENT形式的形式的UPDATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句語(yǔ)句vCURRENT形式的形式的UPDATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句語(yǔ)句的用途的用途n非非CURRENT形式的形式的UPDATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句語(yǔ)句l面向集合的操作面向集合的操作l一次修改或刪除所有滿足條件的記錄一次修改或刪除所有滿足條件的記錄An Introduction to Database SystemCURRENT形式的形式的UPDATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句(續(xù))語(yǔ)句(續(xù))vCURRENT形式的形式的UPDATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句語(yǔ)句的用途(續(xù))的用途(續(xù))n如果只想修改或刪除其中某個(gè)記

36、錄如果只想修改或刪除其中某個(gè)記錄l用帶游標(biāo)的用帶游標(biāo)的SELECT語(yǔ)句查出所有滿足條件的記錄語(yǔ)句查出所有滿足條件的記錄l從中進(jìn)一步找出要修改或刪除的記錄從中進(jìn)一步找出要修改或刪除的記錄l用用CURRENT形式的形式的UPDATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句修改語(yǔ)句修改或刪除之或刪除之lUPDATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句中要用子句語(yǔ)句中要用子句WHERE CURRENT OF 表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄指向的記錄 An Introduction to Database SystemCURRENT形式的形式的UP

37、DATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句(續(xù))語(yǔ)句(續(xù))v不能使用不能使用CURRENT形式的形式的UPDATE語(yǔ)句和語(yǔ)句和DELETE語(yǔ)句語(yǔ)句n當(dāng)游標(biāo)定義中的當(dāng)游標(biāo)定義中的SELECT語(yǔ)句帶有語(yǔ)句帶有UNION或或ORDER BY子句子句 n該該SELECT語(yǔ)句相當(dāng)于定義了一個(gè)不可更新的視圖語(yǔ)句相當(dāng)于定義了一個(gè)不可更新的視圖 An Introduction to Database System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過(guò)程的處理過(guò)程8.1.2 嵌入式嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不用游標(biāo)的不用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.4

38、 使用游標(biāo)的使用游標(biāo)的SQL語(yǔ)句語(yǔ)句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLAn Introduction to Database System 8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLv靜態(tài)嵌入式靜態(tài)嵌入式SQLn靜態(tài)嵌入式靜態(tài)嵌入式SQL語(yǔ)句能夠滿足一般要求語(yǔ)句能夠滿足一般要求 n無(wú)法滿足要到執(zhí)行時(shí)才能夠確定要提交的無(wú)法滿足要到執(zhí)行時(shí)才能夠確定要提交的SQL語(yǔ)句、語(yǔ)句、查詢的條件查詢的條件 v動(dòng)態(tài)嵌入式動(dòng)態(tài)嵌入式SQLn允許在程序運(yùn)行過(guò)程中臨時(shí)允許在程序運(yùn)行過(guò)程中臨時(shí)“組裝組裝”SQL語(yǔ)句語(yǔ)句n支持動(dòng)態(tài)組裝支持動(dòng)態(tài)組裝SQL語(yǔ)句和動(dòng)態(tài)參數(shù)兩種形式語(yǔ)句和動(dòng)態(tài)參數(shù)兩種形式 An Introduction to Datab

39、ase System動(dòng)態(tài)動(dòng)態(tài)SQL(續(xù))(續(xù))1. 使用使用SQL語(yǔ)句主變量語(yǔ)句主變量 2. 動(dòng)態(tài)參數(shù)動(dòng)態(tài)參數(shù)3. 執(zhí)行準(zhǔn)備好的語(yǔ)句(執(zhí)行準(zhǔn)備好的語(yǔ)句(EXECUTE)An Introduction to Database System1. 使用使用SQL語(yǔ)句主變量語(yǔ)句主變量vSQL語(yǔ)句主變量語(yǔ)句主變量n程序主變量包含的內(nèi)容是程序主變量包含的內(nèi)容是SQL語(yǔ)句的內(nèi)容,而不是原語(yǔ)句的內(nèi)容,而不是原來(lái)保存數(shù)據(jù)的輸入或輸出變量來(lái)保存數(shù)據(jù)的輸入或輸出變量nSQL語(yǔ)句主變量在程序執(zhí)行期間可以設(shè)定不同的語(yǔ)句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語(yǔ)句,然后立即執(zhí)行語(yǔ)句,然后立即執(zhí)行 An Introduct

40、ion to Database System使用使用SQL語(yǔ)句主變量(續(xù))語(yǔ)句主變量(續(xù))v例例8.6 創(chuàng)建基本表創(chuàng)建基本表TEST。EXEC SQL BEGIN DECLARE SECTION; const char *stmt=CREATE TABLE test(a int); /*SQL語(yǔ)句主變量,內(nèi)容是創(chuàng)建表的語(yǔ)句主變量,內(nèi)容是創(chuàng)建表的SQL語(yǔ)句語(yǔ)句*/EXEC SQL END DECLARE SECTION; . EXEC SQL EXECUTE IMMEDIATE :stmt; /*執(zhí)行動(dòng)態(tài)執(zhí)行動(dòng)態(tài)SQL語(yǔ)句語(yǔ)句*/An Introduction to Database Syste

41、m2. 動(dòng)態(tài)參數(shù)動(dòng)態(tài)參數(shù)v動(dòng)態(tài)參數(shù)動(dòng)態(tài)參數(shù)nSQL語(yǔ)句中的可變?cè)卣Z(yǔ)句中的可變?cè)豱使用參數(shù)符號(hào)(使用參數(shù)符號(hào)(?)表示該位置的數(shù)據(jù)在運(yùn)行時(shí)設(shè)定)表示該位置的數(shù)據(jù)在運(yùn)行時(shí)設(shè)定v和主變量的區(qū)別和主變量的區(qū)別n動(dòng)態(tài)參數(shù)的輸入不是編譯時(shí)完成綁定動(dòng)態(tài)參數(shù)的輸入不是編譯時(shí)完成綁定n而是通過(guò)而是通過(guò) PREPARE語(yǔ)句準(zhǔn)備主變量和執(zhí)行語(yǔ)句語(yǔ)句準(zhǔn)備主變量和執(zhí)行語(yǔ)句EXECUTE綁定數(shù)據(jù)或主變量來(lái)完成綁定數(shù)據(jù)或主變量來(lái)完成 An Introduction to Database System動(dòng)態(tài)參數(shù)(續(xù))動(dòng)態(tài)參數(shù)(續(xù))v使用動(dòng)態(tài)參數(shù)的步驟使用動(dòng)態(tài)參數(shù)的步驟(1)聲明)聲明SQL語(yǔ)句主變量語(yǔ)句主變量(2)準(zhǔn)備)

42、準(zhǔn)備SQL語(yǔ)句(語(yǔ)句(PREPARE)EXEC SQL PREPARE FROM ;An Introduction to Database System3. 執(zhí)行準(zhǔn)備好的語(yǔ)句(執(zhí)行準(zhǔn)備好的語(yǔ)句(EXECUTE)vEXEC SQL EXECUTE INTO USING ;An Introduction to Database System執(zhí)行準(zhǔn)備好的語(yǔ)句(執(zhí)行準(zhǔn)備好的語(yǔ)句(EXECUTE)(續(xù))(續(xù))v例例8.7 向向TEST中插入元組。中插入元組。EXEC SQL BEGIN DECLARE SECTION;const char *stmt = INSERT INTO test VALUES(

43、?); /*聲明聲明SQL主變量?jī)?nèi)容是主變量?jī)?nèi)容是INSERT語(yǔ)句語(yǔ)句 */EXEC SQL END DECLARE SECTION;. EXEC SQL PREPARE mystmt FROM :stmt; /*準(zhǔn)備語(yǔ)句準(zhǔn)備語(yǔ)句*/. EXEC SQL EXECUTE mystmt USING 100; /*執(zhí)行語(yǔ)句,設(shè)定執(zhí)行語(yǔ)句,設(shè)定INSERT語(yǔ)句插入值語(yǔ)句插入值100 */EXEC SQL EXECUTE mystmt USING 200; /* 執(zhí)行語(yǔ)句,設(shè)定執(zhí)行語(yǔ)句,設(shè)定INSERT語(yǔ)句插入值語(yǔ)句插入值200 */An Introduction to Database System

44、第八章第八章 數(shù)據(jù)庫(kù)編程數(shù)據(jù)庫(kù)編程8.1 嵌入式嵌入式SQL8.2 過(guò)程化過(guò)程化SQL8.3 存儲(chǔ)過(guò)程和函數(shù)存儲(chǔ)過(guò)程和函數(shù)8.4 ODBC編程編程*8.5 OLE DB*8.6 JDBC編程編程8.7 小結(jié)小結(jié)An Introduction to Database System8.2 過(guò)程化過(guò)程化SQL8.2.1 過(guò)程化過(guò)程化SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)8.2.2 變量和常量的定義變量和常量的定義8.2.3 流程控制流程控制An Introduction to Database System8.2.1 過(guò)程化過(guò)程化SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)v過(guò)程化過(guò)程化SQL nSQL的擴(kuò)展的擴(kuò)展 n增加了過(guò)程化語(yǔ)句功

45、能增加了過(guò)程化語(yǔ)句功能 n基本結(jié)構(gòu)是塊基本結(jié)構(gòu)是塊l塊之間可以互相嵌套塊之間可以互相嵌套 l每個(gè)塊完成一個(gè)邏輯操作每個(gè)塊完成一個(gè)邏輯操作 An Introduction to Database System過(guò)程化過(guò)程化SQL的塊結(jié)構(gòu)(續(xù))的塊結(jié)構(gòu)(續(xù))v過(guò)程化過(guò)程化SQL塊的基本結(jié)構(gòu)塊的基本結(jié)構(gòu)1. 定義部分定義部分 DECLARE 變量、常量、游標(biāo)、異常等變量、常量、游標(biāo)、異常等 l定義的變量、常量等只能在該基本塊中使用定義的變量、常量等只能在該基本塊中使用l當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在An Introduction to Database Syste

46、m過(guò)程化過(guò)程化SQL的塊結(jié)構(gòu)(續(xù))的塊結(jié)構(gòu)(續(xù))v過(guò)程化過(guò)程化SQL塊的基本結(jié)構(gòu)(續(xù))塊的基本結(jié)構(gòu)(續(xù))2. 執(zhí)行部分執(zhí)行部分 BEGIN SQL語(yǔ)句、過(guò)程化語(yǔ)句、過(guò)程化SQL的流程控制語(yǔ)句的流程控制語(yǔ)句 EXCEPTION 異常處理部分異常處理部分 END;An Introduction to Database System8.2 過(guò)程化過(guò)程化SQL8.2.1 過(guò)程化過(guò)程化SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)8.2.2 變量和常量的定義變量和常量的定義8.2.3 流程控制流程控制An Introduction to Database System8.2.2 變量和常量的定義變量和常量的定義1. 變量定義變

47、量定義n變量名變量名 數(shù)據(jù)類型數(shù)據(jù)類型 NOT NULL:=初值表達(dá)式初值表達(dá)式或或n變量名變量名 數(shù)據(jù)類型數(shù)據(jù)類型 NOT NULL 初值表達(dá)式初值表達(dá)式2. 常量定義常量定義n常量名常量名 數(shù)據(jù)類型數(shù)據(jù)類型 CONSTANT :=常量表達(dá)式常量表達(dá)式n常量必須要給一個(gè)值,并且該值在存在期間或常量的常量必須要給一個(gè)值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,過(guò)程化作用域內(nèi)不能改變。如果試圖修改它,過(guò)程化SQL將將返回一個(gè)異常返回一個(gè)異常3. 賦值語(yǔ)句賦值語(yǔ)句n變量名稱變量名稱 :=表達(dá)式表達(dá)式An Introduction to Database System8.2 過(guò)程

48、化過(guò)程化SQL8.2.1 過(guò)程化過(guò)程化SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)8.2.2 變量和常量的定義變量和常量的定義8.2.3 流程控制流程控制An Introduction to Database System8.2.3 流程控制流程控制v過(guò)程化過(guò)程化SQL功能功能1. 條件控制語(yǔ)句條件控制語(yǔ)句2. 循環(huán)控制語(yǔ)句循環(huán)控制語(yǔ)句 3. 錯(cuò)誤處理錯(cuò)誤處理 An Introduction to Database System流程控制(續(xù))流程控制(續(xù))1. 條件控制語(yǔ)句條件控制語(yǔ)句 IF-THEN,IF-THEN-ELSE和嵌套的和嵌套的IF語(yǔ)句語(yǔ)句 (1)IF condition THEN Sequence_

49、of_statements; END IF; (2)IF condition THEN Sequence_of_statements1; ELSE Sequence_of_statements2; END IF;(3)在)在THEN和和ELSE子句中還可以再包含子句中還可以再包含IF語(yǔ)句,即語(yǔ)句,即IF語(yǔ)句可以嵌套語(yǔ)句可以嵌套 An Introduction to Database System流程控制(續(xù))流程控制(續(xù))2. 循環(huán)控制語(yǔ)句循環(huán)控制語(yǔ)句 LOOP,WHILE-LOOP和和FOR-LOOP (1)簡(jiǎn)單的循環(huán)語(yǔ)句)簡(jiǎn)單的循環(huán)語(yǔ)句LOOP LOOP Sequence_of_state

50、ments; END LOOP; 多數(shù)數(shù)據(jù)庫(kù)服務(wù)器的過(guò)程化多數(shù)數(shù)據(jù)庫(kù)服務(wù)器的過(guò)程化SQL都提供都提供EXIT、BREAK或或 LEAVE等循環(huán)結(jié)束語(yǔ)句,保證等循環(huán)結(jié)束語(yǔ)句,保證LOOP語(yǔ)句塊能夠結(jié)束語(yǔ)句塊能夠結(jié)束An Introduction to Database System流程控制(續(xù))流程控制(續(xù))2. 循環(huán)控制語(yǔ)句(續(xù))循環(huán)控制語(yǔ)句(續(xù))(2)WHILE-LOOP WHILE condition LOOP Sequence_of_statements; END LOOP;l每次執(zhí)行循環(huán)體語(yǔ)句之前,首先對(duì)條件進(jìn)行求值每次執(zhí)行循環(huán)體語(yǔ)句之前,首先對(duì)條件進(jìn)行求值l如果條件為真,則執(zhí)行循環(huán)體

51、內(nèi)的語(yǔ)句序列如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語(yǔ)句序列l(wèi)如果條件為假,則跳過(guò)循環(huán)并把控制傳遞給下一個(gè)語(yǔ)句如果條件為假,則跳過(guò)循環(huán)并把控制傳遞給下一個(gè)語(yǔ)句 An Introduction to Database System流程控制(續(xù))流程控制(續(xù))2. 循環(huán)控制語(yǔ)句(續(xù))循環(huán)控制語(yǔ)句(續(xù))(3)FOR-LOOP FOR count IN REVERSE bound1 bound2 LOOP Sequence_of_statements; END LOOP;An Introduction to Database System流程控制(續(xù))流程控制(續(xù))3. 錯(cuò)誤處理錯(cuò)誤處理n如果過(guò)程化如果過(guò)程化S

52、QL在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語(yǔ)句處停下來(lái),根據(jù)異常的類型去執(zhí)行異產(chǎn)生異常的語(yǔ)句處停下來(lái),根據(jù)異常的類型去執(zhí)行異常處理語(yǔ)句常處理語(yǔ)句 nSQL標(biāo)準(zhǔn)對(duì)數(shù)據(jù)庫(kù)服務(wù)器提供什么樣的異常處理做出標(biāo)準(zhǔn)對(duì)數(shù)據(jù)庫(kù)服務(wù)器提供什么樣的異常處理做出了建議,要求過(guò)程化了建議,要求過(guò)程化SQL管理器提供完善的異常處理管理器提供完善的異常處理機(jī)制機(jī)制 An Introduction to Database System第八章第八章 數(shù)據(jù)庫(kù)編程數(shù)據(jù)庫(kù)編程8.1 嵌入式嵌入式SQL8.2 過(guò)程化過(guò)程化SQL8.3 存儲(chǔ)過(guò)程和函數(shù)存儲(chǔ)過(guò)程和函數(shù)8.4 ODBC編程編程*8.5 O

53、LE DB*8.6 JDBC編程編程8.7 小結(jié)小結(jié)An Introduction to Database System8.3 存儲(chǔ)過(guò)程和函數(shù)存儲(chǔ)過(guò)程和函數(shù)8.3.1 存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程8.3.2 函數(shù)函數(shù)*8.3.3 過(guò)程化過(guò)程化SQL中的游標(biāo)中的游標(biāo)An Introduction to Database System8.3.1 存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程v過(guò)程化過(guò)程化SQL塊類型塊類型n命名塊命名塊l編譯后保存在數(shù)據(jù)庫(kù)中,可以被反復(fù)調(diào)用,運(yùn)行速度較編譯后保存在數(shù)據(jù)庫(kù)中,可以被反復(fù)調(diào)用,運(yùn)行速度較快,過(guò)程和函數(shù)是命名塊快,過(guò)程和函數(shù)是命名塊 n匿名塊匿名塊l每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存儲(chǔ)到數(shù)據(jù)庫(kù)中

54、,每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存儲(chǔ)到數(shù)據(jù)庫(kù)中,也不能在其他過(guò)程化也不能在其他過(guò)程化SQL塊中調(diào)用塊中調(diào)用 An Introduction to Database System存儲(chǔ)過(guò)程(續(xù))存儲(chǔ)過(guò)程(續(xù))1. 存儲(chǔ)過(guò)程的優(yōu)點(diǎn)存儲(chǔ)過(guò)程的優(yōu)點(diǎn) 2. 存儲(chǔ)過(guò)程的用戶接口存儲(chǔ)過(guò)程的用戶接口 An Introduction to Database System存儲(chǔ)過(guò)程(續(xù))存儲(chǔ)過(guò)程(續(xù))v存儲(chǔ)過(guò)程:由過(guò)程化存儲(chǔ)過(guò)程:由過(guò)程化SQL語(yǔ)句書(shū)寫(xiě)的過(guò)程,經(jīng)編語(yǔ)句書(shū)寫(xiě)的過(guò)程,經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,使用時(shí)只要譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,使用時(shí)只要調(diào)用即可。調(diào)用即可。v存儲(chǔ)過(guò)程的優(yōu)點(diǎn)存儲(chǔ)過(guò)程的優(yōu)點(diǎn)

55、(1)運(yùn)行效率高)運(yùn)行效率高(2)降低了客戶機(jī)和服務(wù)器之間的通信量)降低了客戶機(jī)和服務(wù)器之間的通信量(3)方便實(shí)施企業(yè)規(guī)則)方便實(shí)施企業(yè)規(guī)則An Introduction to Database System存儲(chǔ)過(guò)程(續(xù))存儲(chǔ)過(guò)程(續(xù))v存儲(chǔ)過(guò)程的用戶接口存儲(chǔ)過(guò)程的用戶接口(1)創(chuàng)建存儲(chǔ)過(guò)程)創(chuàng)建存儲(chǔ)過(guò)程 (2)執(zhí)行存儲(chǔ)過(guò)程)執(zhí)行存儲(chǔ)過(guò)程 (3)修改存儲(chǔ)過(guò)程)修改存儲(chǔ)過(guò)程(4)刪除存儲(chǔ)過(guò)程)刪除存儲(chǔ)過(guò)程 An Introduction to Database System2. 存儲(chǔ)過(guò)程的用戶接口存儲(chǔ)過(guò)程的用戶接口(1)創(chuàng)建存儲(chǔ)過(guò)程)創(chuàng)建存儲(chǔ)過(guò)程CREATE OR REPLACE PROCEDU

56、RE 過(guò)程名過(guò)程名(參數(shù)參數(shù)1,參數(shù)參數(shù)2,.) AS ;n過(guò)程名:數(shù)據(jù)庫(kù)服務(wù)器合法的對(duì)象標(biāo)識(shí)過(guò)程名:數(shù)據(jù)庫(kù)服務(wù)器合法的對(duì)象標(biāo)識(shí)n參數(shù)列表:用名字來(lái)標(biāo)識(shí)調(diào)用時(shí)給出的參數(shù)值,必須參數(shù)列表:用名字來(lái)標(biāo)識(shí)調(diào)用時(shí)給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入?yún)?shù)或輸入/輸出參數(shù),默認(rèn)為輸入?yún)?shù)輸出參數(shù),默認(rèn)為輸入?yún)?shù)n過(guò)程體:是一個(gè)過(guò)程體:是一個(gè),包括聲明部分和可,包括聲明部分和可執(zhí)行語(yǔ)句部分執(zhí)行語(yǔ)句部分 An Introduction to Database System存儲(chǔ)過(guò)程的用戶接口(續(xù))存儲(chǔ)過(guò)程的用戶接口(續(xù))v 例例

57、8.8 利用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)下面的應(yīng)用:從賬戶利用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)下面的應(yīng)用:從賬戶1轉(zhuǎn)指定數(shù)轉(zhuǎn)指定數(shù)額的款項(xiàng)到賬戶額的款項(xiàng)到賬戶2中。中。CREATE OR REPLACE PROCEDURE TRANSFER(inAccount INT,outAccount INT,amount FLOAT) /*定義存儲(chǔ)過(guò)程定義存儲(chǔ)過(guò)程TRANSFER,其參數(shù)為轉(zhuǎn)入賬戶、轉(zhuǎn)出賬戶、轉(zhuǎn)賬額度,其參數(shù)為轉(zhuǎn)入賬戶、轉(zhuǎn)出賬戶、轉(zhuǎn)賬額度*/AS DECLARE/*定義變量定義變量*/ totalDepositOut Float; totalDepositIn Float;inAccountnum INT;An Int

58、roduction to Database System存儲(chǔ)過(guò)程的用戶接口(續(xù))存儲(chǔ)過(guò)程的用戶接口(續(xù)) BEGIN /*檢查轉(zhuǎn)出賬戶的余額檢查轉(zhuǎn)出賬戶的余額 */ SELECT Total INTO totalDepositOut FROM Accout WHERE accountnum=outAccount; IF totalDepositOut IS NULL THEN /*如果轉(zhuǎn)出賬戶不存在或賬戶中沒(méi)有存款如果轉(zhuǎn)出賬戶不存在或賬戶中沒(méi)有存款*/ ROLLBACK; /*回滾事務(wù)回滾事務(wù)*/ RETURN; END IF; An Introduction to Database Syst

59、em存儲(chǔ)過(guò)程的用戶接口(續(xù))存儲(chǔ)過(guò)程的用戶接口(續(xù))IF totalDeposit Out amount THEN /*如果賬戶存款不足如果賬戶存款不足*/ROLLBACK; /*回滾事務(wù)回滾事務(wù)*/RETURN;END IF;SELECT Accountnum INTO inAccountnum FROM AccountWHERE accountnum=inAccount;IF inAccount IS NULL THEN /*如果轉(zhuǎn)入賬戶不存在如果轉(zhuǎn)入賬戶不存在*/ ROLLBACK; /*回滾事務(wù)回滾事務(wù)*/RETURN;ENDIF;An Introduction to Database

60、 System存儲(chǔ)過(guò)程的用戶接口(續(xù))存儲(chǔ)過(guò)程的用戶接口(續(xù))UPDATE Account SET total=total-amount WHERE accountnum=outAccount; /* 修改轉(zhuǎn)出賬戶余額,減去轉(zhuǎn)出額修改轉(zhuǎn)出賬戶余額,減去轉(zhuǎn)出額 */UPDATE Account SET total=total + amount WHERE accountnum=inAccount; /* 修改轉(zhuǎn)入賬戶余額,增加轉(zhuǎn)入額修改轉(zhuǎn)入賬戶余額,增加轉(zhuǎn)入額 */COMMIT; /* 提交轉(zhuǎn)賬事務(wù)提交轉(zhuǎn)賬事務(wù) */END;An Introduction to Database System存儲(chǔ)過(guò)程的用戶接口(續(xù))存儲(chǔ)過(guò)程的用戶接

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論