第8章數(shù)據(jù)庫編程簡介_第1頁
第8章數(shù)據(jù)庫編程簡介_第2頁
第8章數(shù)據(jù)庫編程簡介_第3頁
第8章數(shù)據(jù)庫編程簡介_第4頁
第8章數(shù)據(jù)庫編程簡介_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論An Introduction to Database System 第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1 嵌入式嵌入式SQL8.2 存儲(chǔ)過程存儲(chǔ)過程8.3 ODBC編程編程8.1 嵌入式嵌入式SQLvSQL語言提供了兩種不同的使用方式: 交互式 嵌入式v這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語句要做某些必要的擴(kuò)充8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過程的處理過程8.1.2 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信8.1.3 不使用游標(biāo)的不使用游標(biāo)的SQL語句語句8.1

2、.4 使用游標(biāo)的使用游標(biāo)的SQL語句語句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQL8.1.6 小結(jié)小結(jié)8.1.1 嵌入式嵌入式SQL的處理過程的處理過程v主語言 嵌入式SQL是將SQL語句嵌入程序設(shè)計(jì)語言中,被嵌入的程序設(shè)計(jì)語言,如C、C+、Java,稱為宿主語言,簡稱主語言。v處理過程 預(yù)編譯方法嵌入式嵌入式SQL的處理過程(續(xù))的處理過程(續(xù)) 主語言程序 含ESQL語句RDBMS的的預(yù)處理程序預(yù)處理程序ESQL語句轉(zhuǎn)換為函數(shù)調(diào)用主語言編譯程序目標(biāo)語言程序ESQL基本處理過程嵌入式嵌入式SQL的處理過程(續(xù))的處理過程(續(xù)) v為了區(qū)分SQL語句與主語言語句, 所有SQL語句必須加前綴EXEC SQL,以

3、(;)結(jié)束: EXEC SQL ;8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過程的處理過程8.1.2 嵌入式嵌入式SQL與主語言的通信與主語言的通信8.1.3 不使用游標(biāo)的不使用游標(biāo)的SQL語句語句8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語句語句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQL8.1.6 小結(jié)小結(jié)8.1.2 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信v 將SQL嵌入到高級(jí)語言中混合編程,程序中會(huì)含有兩種不同計(jì)算模型的語句nSQL語句 描述性的面向集合的語句 負(fù)責(zé)操縱數(shù)據(jù)庫n高級(jí)語言語句 過程性的面向記錄的語句 負(fù)責(zé)控制程序流程n它們之間應(yīng)該如何通信?嵌入式嵌入式

4、SQL語句與主語言之間的通信語句與主語言之間的通信(續(xù))(續(xù)) v數(shù)據(jù)庫工作單元與源程序工作單元之間的通信:n1. SQL通信區(qū)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息使主語言能夠據(jù)此控制程序流程n2. 主變量主語言向SQL語句提供參數(shù)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進(jìn)一步處理n3. 游標(biāo)解決集合性操作語言與過程性操作語言的不匹配一、一、SQL通信區(qū)通信區(qū)vSQLCA: SQL Communication AreanSQLCA是一個(gè)數(shù)據(jù)結(jié)構(gòu)vSQLCA的用途nSQL語句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息 描述系統(tǒng)當(dāng)前工作狀態(tài) 描述運(yùn)行環(huán)境n這些信息將送到SQL通信區(qū)SQLCA中n應(yīng)用程序從S

5、QLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句SQL通信區(qū)通信區(qū)vSQLCA使用方法: 定義SQLCA 用EXEC SQL INCLUDE SQLCA定義 使用SQLCASQLCA中有一個(gè)存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯(cuò)應(yīng)用程序每執(zhí)行完一條SQL 語句之后都應(yīng)該測試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理二、主變量二、主變量 v主變量 嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù) 在SQL語句中使用的主語言程序變量簡稱為主變量(Host Variab

6、le)主變量(續(xù))主變量(續(xù)) v主變量的類型 輸入主變量:主語言(賦值) SQL(引用) 輸出主變量:SQL (賦值) 主語言(引用) 一個(gè)主變量有可能既是輸入主變量又是輸出主變量主變量(續(xù))主變量(續(xù)) v指示變量: 一個(gè)主變量可以附帶一個(gè)指示變量(Indicator Variable) 什么是指示變量 一個(gè)整型變量,用來指示所指主變量的值或條件 指示變量的用途 可以指示輸入主變量是否為空值,可以檢測輸出主變量是否為空值,值是否被截?cái)嗟戎髯兞浚ɡm(xù))主變量(續(xù)) v在SQL語句中使用主變量和指示變量的方法 1) 說明主變量和指示變量BEGIN DECLARE SECTION. . (說明主變

7、量和指示變量).END DECLARE SECTION主變量(續(xù))主變量(續(xù)) 2) 使用主變量說明之后的主變量可以在SQL語句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn)為了與數(shù)據(jù)庫對(duì)象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(hào)(:)作為標(biāo)志 3) 使用指示變量 指示變量前也必須加冒號(hào)標(biāo)志 必須緊跟在所指主變量之后主語言語句中直接引用,不必加冒號(hào)三、游標(biāo)(三、游標(biāo)(cursor)v為什么要使用游標(biāo) SQL語言與主語言具有不同數(shù)據(jù)處理方式 SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄 主語言是面向記錄的,一組主變量一次只能存放一條記錄 嵌入式SQL引入了游標(biāo)的

8、概念,用來協(xié)調(diào)這兩種不同的處理方式 游標(biāo)(續(xù))游標(biāo)(續(xù))v游標(biāo) 游標(biāo)是系統(tǒng)為用戶開設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果 每個(gè)游標(biāo)區(qū)都有一個(gè)名字 用戶可以從游標(biāo)中逐一獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理四、建立和關(guān)閉數(shù)據(jù)庫連接四、建立和關(guān)閉數(shù)據(jù)庫連接v建立數(shù)據(jù)庫連接 EXEC SQL CONNECT TO target AS connection-name USER user-name; target是要連接的數(shù)據(jù)庫服務(wù)器: 常見的服務(wù)器標(biāo)識(shí)串,如: connect-name是可選的連接名,連接必須是一個(gè)有效標(biāo)識(shí)符 在整個(gè)程序內(nèi)只有一個(gè)連接時(shí)可以不指定連接名v關(guān)閉數(shù)據(jù)庫連接 EX

9、EC SQL DISCONNECT connection-name;8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過程的處理過程8.1.2 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信8.1.3 不使用游標(biāo)的不使用游標(biāo)的SQL語句語句8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語句語句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQL8.1.6 小結(jié)小結(jié)8.1.3 不用游標(biāo)的不用游標(biāo)的SQL語句語句v不用游標(biāo)的SQL語句的種類 說明性語句 數(shù)據(jù)定義語句 數(shù)據(jù)控制語句 查詢結(jié)果為單記錄的SELECT語句 非CURRENT形式的增刪改語句 只使用主變量只使用主變量就可以完成就可以完成SQL與與

10、主語言之間的數(shù)據(jù)傳遞主語言之間的數(shù)據(jù)傳遞不存在不存在SQL與與主語言之間的數(shù)據(jù)傳遞主語言之間的數(shù)據(jù)傳遞不用游標(biāo)的不用游標(biāo)的SQL語句(續(xù))語句(續(xù))v一、查詢結(jié)果為單記錄的SELECT語句 v二、非CURRENT形式的增刪改語句一、查詢結(jié)果為單記錄的一、查詢結(jié)果為單記錄的SELECT語句語句v這類語句不需要使用游標(biāo),只需要用INTO子句指定存放查詢結(jié)果的主變量 例2 根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。假設(shè)已經(jīng)把要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno。EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO :Hsno, : Hname ,:Hsex,:Hag

11、e,:Hdept FROM Student WHERE Sno=:givensno;能夠確定能夠確定查詢的結(jié)果為單記錄查詢的結(jié)果為單記錄查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語句(續(xù))語句(續(xù)) INTO子句、WHERE子句和HAVING短語的條件表達(dá)式中均可以使用主變量(1)查詢返回的記錄中,可能某些列為空值NULL,怎么識(shí)別? 答:使用主變量的指示變量標(biāo)識(shí)主變量取得空值(2) 如果查詢結(jié)果實(shí)際上并不是單條記錄,而是多條記錄會(huì)怎樣? 答:程序出錯(cuò),RDBMS會(huì)在SQLCA中返回錯(cuò)誤信息 思考兩個(gè)問題:思考兩個(gè)問題:查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語句(續(xù))語句(續(xù))

12、例3 查詢某個(gè)學(xué)生選修某門課程的成績。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno,將課程號(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é)生成績?yōu)榭罩怠6?、非二、非CURRENT形式的增刪形式的增刪改改語句語句v 在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使

13、用指示變量 例4 修改某個(gè)學(xué)生選修給定課程號(hào)課程的成績。 newgrade = 90; EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成績已賦給主變量*/ WHERE Sno=:givensno; /*學(xué)號(hào)賦給主變量givensno*/ 非非CURRENT形式的增刪改語句(續(xù))形式的增刪改語句(續(xù))例5 將計(jì)算機(jī)系全體學(xué)生年齡置NULL值。 Sageid=-1; EXEC SQL UPDATE Student SET Sage=:Raise :Sageid WHERE Sdept= CS; 將指示變量Sageid賦一個(gè)負(fù)值后,無論主變量Raise為何值

14、,RDBMS都會(huì)將CS系所有學(xué)生的年齡置空值 。等價(jià)于:(純等價(jià)于:(純SQL) EXEC SQL UPDATE Student SET Sage=NULL WHERE Sdept= CS;非非CURRENT形式的增形式的增刪刪改語句(續(xù))改語句(續(xù))例6 某個(gè)學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已賦給主變量stdname。 EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname=:stdname); 非非CURRENT形式的形式的增增刪改語句(續(xù))刪改語句(續(xù))例7 某個(gè)學(xué)生新選

15、修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號(hào)已賦給主變量stdno,課程號(hào)已賦給主變量couno。由于該學(xué)生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負(fù)值 gradeid=-1; /*用作指示變量,賦為負(fù)值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); 8.1 嵌入式嵌入式SQLv8.1.1 嵌入式嵌入式SQL的處理過程的處理過程v8.1.2 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信v8.1.3 不使用游標(biāo)的不使用游標(biāo)的SQL語句語句v8.1.4 使用游標(biāo)的

16、使用游標(biāo)的SQL語句語句v8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLv8.1.6 小結(jié)小結(jié)8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語句語句v必須使用游標(biāo)的SQL語句查詢結(jié)果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句使用游標(biāo)的使用游標(biāo)的SQL語句(續(xù))語句(續(xù))v一、 查詢結(jié)果為多條記錄的SELECT語句v二、CURRENT形式的UPDATE和DELETE語句游游 標(biāo)標(biāo)v使用游標(biāo)的步驟1. 說明游標(biāo)2. 打開游標(biāo)3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄 4. 關(guān)閉游標(biāo)1. 說明游標(biāo)說明游標(biāo)v使用DECLARE語句v語句格式EXEC SQL DECLARE CURSOR

17、 FOR ;v功能 是一條說明性語句說明性語句,這時(shí)DBMS并不執(zhí)行SELECT指定的查詢操作。2. 打開游標(biāo)打開游標(biāo)v使用OPEN語句v語句格式 EXEC SQL OPEN ;v功能 打開游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中 這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中第一條記錄3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄推進(jìn)游標(biāo)指針并取當(dāng)前記錄 v使用FETCH語句v語句格式 EXEC SQL FETCH INTO ,.;v功能 將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理,并推動(dòng)游標(biāo)指針前進(jìn)一條記錄4. 關(guān)閉游標(biāo)關(guān)閉游標(biāo)v使用CLOSE語句v語句格

18、式 EXEC SQL CLOSE ;v功能 關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源v說明 游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系 被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果相聯(lián)系二、二、CURRENT形式的形式的UPDATE語句和語句和DELETE語句語句vCURRENT形式用途 SQL中UPDATE語句和DELETE語句都是面向集合面向集合的操作 嵌入式的SQL要怎樣做?用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄從中進(jìn)一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語句和DELETE語句修改或刪除UPDATE語句和DELETE語句中的子句: WHERE CURRE

19、NT OF 表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄 一次修改或刪除所有滿足條件的記錄程序?qū)嵗绦驅(qū)嵗?依次檢查某個(gè)系的學(xué)生記錄,交互式更新某些學(xué)生年齡。EXEC SQL BEGIN DEC LARE SECTION; /*主變量說明開始*/ char deptname64;char HSno64;char HSname64; char HSsex64;int HSage;intNEWAGE;EXEC SQL END DECLARE SECTION; /*主變量說明結(jié)束*/EXEC SQL INCLUDE sqlca; /*定義SQL通信區(qū)*/體會(huì):主語言與體會(huì):主語言與S

20、QL各自特點(diǎn)各自特點(diǎn)主語言:控制程序流程,與用戶交互友好SQL:與數(shù)據(jù)庫打交道程序?qū)嵗ɡm(xù))程序?qū)嵗ɡm(xù))int main(void) /*C語言主程序開始*/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:54321 USER SYSTEM /MANAGER; /*連接數(shù)據(jù)庫TEST*/EXEC SQL

21、DECLARE SX CURSOR FOR /*定義游標(biāo)*/SELECT Sno, Sname, Ssex, Sage /*SX對(duì)應(yīng)語句的執(zhí)行結(jié)果*/FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; /*打開游標(biāo)SX便指向查詢結(jié)果的第一行*/程序?qū)嵗ɡm(xù))程序?qū)嵗ɡm(xù))for ( ; ; ) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/ EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage; /*推進(jìn)游標(biāo),將當(dāng)前數(shù)據(jù)放入主變量*/if (sqlca.sqlcode != 0) /* sql

22、code != 0,表示操作不成功*/break; /*利用SQLCA中的狀態(tài)信息決定何時(shí)退出循環(huán)*/if(count+ = 0) /*如果是第一行的話,先打出行頭*/ printf(n%-10s %-20s %-10s %-10sn, Sno, Sname, Ssex, Sage); printf(%-10s %-20s %-10s %-10dn, HSno, HSname, HSsex, HSage); /*打印查詢結(jié)果*/ printf(UPDATE AGE(y/n)?); /*詢問用戶是否要更新該學(xué)生的年齡*/ do scanf(%c,&yn); while(yn != N &

23、amp; yn != n & yn != Y & yn != y);程序?qū)嵗ɡm(xù))程序?qū)嵗ɡm(xù))if (yn = y | yn = Y) /*如果選擇更新操作*/ printf(INPUT NEW AGE:); scanf(%d,&NEWAGE); /*用戶輸入新年齡到主變量中*/ EXEC SQL UPDATE Student /*嵌入式SQL*/SET Sage = :NEWAGEWHERE CURRENT OF SX ; /*對(duì)當(dāng)前游標(biāo)指向的學(xué)生年齡進(jìn)行更新*/ EXEC SQL CLOSE SX; /*關(guān)閉游標(biāo)SX不再和查詢結(jié)果對(duì)應(yīng)*/EXEC SQL COMM

24、IT WORK; /*提交更新*/EXEC SQL DISCONNECT TEST; /*斷開數(shù)據(jù)庫連接*/嵌嵌 入入 式式 SQLv8.1.1 嵌入式嵌入式SQL的處理過程的處理過程v8.1.2 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信v8.1.3 不使用游標(biāo)的不使用游標(biāo)的SQL語句語句v8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語句語句v8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLv8.1.6 小結(jié)小結(jié) 8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQLv 靜態(tài)嵌入式SQL 靜態(tài)嵌入式SQL語句能夠滿足一般要求 無法滿足要到執(zhí)行時(shí)才能夠確定要提交的SQL語句 v 動(dòng)態(tài)嵌入式SQL 允許在程序運(yùn)行過程中臨時(shí)“組裝組

25、裝”SQL語句 支持動(dòng)態(tài)組裝SQL語句和動(dòng)態(tài)參數(shù)兩種形式 動(dòng)態(tài)動(dòng)態(tài)SQL簡介(續(xù))簡介(續(xù))v一、使用SQL語句主變量 v二、動(dòng)態(tài)參數(shù)一、使用一、使用SQL語句主變量語句主變量vSQL語句主變量: 程序主變量包含的內(nèi)容是主變量包含的內(nèi)容是SQL語句語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量 使用SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行 使用使用SQL語句主變量(續(xù))語句主變量(續(xù))例9 創(chuàng)建基本表TESTEXEC SQL BEGIN DECLARE SECTION;const char *stmt = “CREATE TABLE test(num INT(4);

26、 /* SQL語句主變量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL EXECUTE IMMEDIATE :stmt; /* 執(zhí)行語句 */二、動(dòng)態(tài)參數(shù)二、動(dòng)態(tài)參數(shù)v動(dòng)態(tài)參數(shù) SQL語句中的可變?cè)?使用參數(shù)符號(hào)(?)表示該?位置的數(shù)據(jù)在運(yùn)行時(shí)設(shè)定v和主變量的區(qū)別 動(dòng)態(tài)參數(shù)的輸入不是編譯時(shí)完成綁定 而是通過 (prepare)語句準(zhǔn)備主變量準(zhǔn)備主變量和執(zhí)行(execute)時(shí)綁定數(shù)據(jù)或主變量綁定數(shù)據(jù)或主變量來完成 動(dòng)態(tài)參數(shù)(續(xù))動(dòng)態(tài)參數(shù)(續(xù))v使用動(dòng)態(tài)參數(shù)的步驟:1.聲明SQL語句主變量。2.準(zhǔn)備SQL語句(PREPARE)。EXEC SQL PREP

27、ARE FROM ; 3.執(zhí)行準(zhǔn)備好的語句(EXECUTE) EXEC SQL EXECUTE USING ;動(dòng)態(tài)參數(shù)(續(xù))動(dòng)態(tài)參數(shù)(續(xù))例10向TEST中插入元組。EXEC SQL BEGIN DECLARE SECTION;const char *stmt = INSERT INTO test VALUES(?); /*聲明SQL主變量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL PREPARE mystmt FROM :stmt; /* 準(zhǔn)備語句 */. .EXEC SQL EXECUTE mystmt USING 001; /* 執(zhí)行語句 */

28、EXEC SQL EXECUTE mystmt USING 002; /* 執(zhí)行語句 */8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的處理過程的處理過程8.1.2 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信8.1.3 不使用游標(biāo)的不使用游標(biāo)的SQL語句語句8.1.4 使用游標(biāo)的使用游標(biāo)的SQL語句語句8.1.5 動(dòng)態(tài)動(dòng)態(tài)SQL8.1.6 小結(jié)小結(jié)8.1.6 小小 結(jié)結(jié)v在嵌入式SQL中,SQL語句與主語言語句分工非常明確 SQL語句直接與數(shù)據(jù)庫打交道,取出數(shù)據(jù)庫中的數(shù)據(jù)。 主語言語句控制程序流程對(duì)取出的數(shù)據(jù)做進(jìn)一步加工處理小結(jié)(續(xù))小結(jié)(續(xù))v SQL語言是面

29、向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄v 主語言是面向記錄的,一組主變量一次只能存放一條記錄 僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求 嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1 嵌入式嵌入式SQL8.2 存儲(chǔ)過程存儲(chǔ)過程8.3 ODBC編程編程8.2 存儲(chǔ)過程存儲(chǔ)過程8.2.1 PL/SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)8.2.2 變量常量的定義變量常量的定義8.2.3 控制結(jié)構(gòu)控制結(jié)構(gòu)8.2.4 存儲(chǔ)過程存儲(chǔ)過程8.2.5 小結(jié)小結(jié)8.2.1 PL/SQLvPL/SQL :(Procedural Language)

30、 SQL的擴(kuò)展 增加了過程化語句功能 基本結(jié)構(gòu)是塊塊之間可以互相嵌套 每個(gè)塊完成一個(gè)邏輯操作 PL/SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)vPL/SOL塊的基本結(jié)構(gòu):塊的基本結(jié)構(gòu): 1.定義部分定義部分 DECLARE -變量、常量、游標(biāo)、異常等 n定義的變量、常量等只能在該基本塊中使用 當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在PL/SQL的塊結(jié)構(gòu)(續(xù))的塊結(jié)構(gòu)(續(xù))vPL/SOL塊的基本結(jié)構(gòu):塊的基本結(jié)構(gòu): 2.執(zhí)行部分執(zhí)行部分 BEGIN -SQL語句、PL/SQL的流程控制語句 EXCEPTION -異常處理部分 END;8.2 存儲(chǔ)過程存儲(chǔ)過程8.2.1 PL/SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)8.2.2 變量常量的定

31、義變量常量的定義8.2.3 控制結(jié)構(gòu)控制結(jié)構(gòu)8.2.4 存儲(chǔ)過程存儲(chǔ)過程8.2.5 小結(jié)小結(jié)8.2.2 變量常量的定義變量常量的定義1. PL/SQL中定義變量的語法形式是中定義變量的語法形式是: 變量名 數(shù)據(jù)類型 NOT NULL:=初值表達(dá)式或 變量名 數(shù)據(jù)類型 NOT NULL初值表達(dá)式2. 常量的定義類似于變量的定義常量的定義類似于變量的定義: 常量名 數(shù)據(jù)類型 CONSTANT :=常量表達(dá)式 常量必須要給一個(gè)值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,PL/SQL將返回一個(gè)異常。3. 賦值語句賦值語句 變量名稱:=表達(dá)式8.2 存儲(chǔ)過程存儲(chǔ)過程8.2.1 PL/

32、SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)8.2.2 變量常量的定義變量常量的定義8.2.3 控制結(jié)構(gòu)控制結(jié)構(gòu)8.2.4 存儲(chǔ)過程存儲(chǔ)過程8.2.5 小結(jié)小結(jié)8.2.3 控制結(jié)構(gòu)控制結(jié)構(gòu) vPL/SQL 功能:功能:一、條件控制語句二、循環(huán)控制語句 三、錯(cuò)誤處理 控制結(jié)構(gòu)(續(xù))控制結(jié)構(gòu)(續(xù))v一、一、 條件控制語句條件控制語句 IF-THEN, IF-THEN-ELSE和嵌套的和嵌套的IF語句語句 1. IF condition THEN Sequence_of_statements; END IF 2. IF condition THEN Sequence_of_statements1; ELSE Sequen

33、ce_of_statements2; END IF;3. 在THEN和ELSE子句中還可以再包括IF語句,即IF語句可以嵌套語句可以嵌套 控制結(jié)構(gòu)(續(xù))控制結(jié)構(gòu)(續(xù))二、循環(huán)控制語句二、循環(huán)控制語句 LOOP, WHILE-LOOP和和FOR-LOOP 1.最簡單的循環(huán)語句最簡單的循環(huán)語句LOOP LOOP Sequence_of_statements; END LOOP; 多數(shù)數(shù)據(jù)庫服務(wù)器的PL/SQL都提供EXIT、BREAK或LEAVE等循環(huán)結(jié)束語句,保證LOOP語句塊能夠結(jié)束??刂平Y(jié)構(gòu)(續(xù))控制結(jié)構(gòu)(續(xù))二、循環(huán)控制語句(續(xù))二、循環(huán)控制語句(續(xù))2. WHILE-LOOP WHILE

34、 condition LOOP Sequence_of_statements;END LOOP;n每次執(zhí)行循環(huán)體語句之前,首先對(duì)條件進(jìn)行求值n如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語句序列。n如果條件為假,則跳過循環(huán)并把控制傳遞給下一個(gè)語句 3. FOR-LOOP FOR count IN REVERSEbound1 bound2 LOOP Sequence_of_statements;END LOOP;控制結(jié)構(gòu)(續(xù))控制結(jié)構(gòu)(續(xù))v三、錯(cuò)誤處理: 如果PL/SQL在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句 SQL標(biāo)準(zhǔn)對(duì)數(shù)據(jù)庫服務(wù)器提供什么樣的異常處理做出

35、了建議,要求PL/SQL管理器提供完善的異常處理機(jī)制 8.2 存儲(chǔ)過程存儲(chǔ)過程v8.2.1 PL/SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)v8.2.2 變量常量的定義變量常量的定義v8.2.3 控制結(jié)構(gòu)控制結(jié)構(gòu)v8.2.4 存儲(chǔ)過程存儲(chǔ)過程v8.2.5 小結(jié)小結(jié)8.2.4 存儲(chǔ)過程存儲(chǔ)過程v補(bǔ)充:PL/SQL塊類型 匿名塊:每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存儲(chǔ)到數(shù)據(jù)庫中,也不能在其他的PL/SQL塊中調(diào)用 命名塊:編譯后保存在數(shù)據(jù)庫中,可以被反復(fù)調(diào)用,運(yùn)行速度較快。存儲(chǔ)過程就是命名塊存儲(chǔ)過程就是命名塊 存儲(chǔ)過程(續(xù))存儲(chǔ)過程(續(xù))v一、 存儲(chǔ)過程的優(yōu)點(diǎn) v二、 存儲(chǔ)過程的用戶接口 v三、 游標(biāo) 存儲(chǔ)過程(續(xù))存

36、儲(chǔ)過程(續(xù))v 存儲(chǔ)過程:由PL/SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫服務(wù)器中,使用時(shí)只要調(diào)用即可。 v 一、存儲(chǔ)過程的優(yōu)點(diǎn):1. 運(yùn)行效率高 對(duì)比SQL,語法分析和優(yōu)化已經(jīng)做好,可以快速執(zhí)行2. 降低了客戶機(jī)和服務(wù)器之間的通信量 客戶機(jī)只要發(fā)送存儲(chǔ)過程名字和參數(shù)就可以讓服務(wù)器執(zhí)行復(fù)雜的SQL語句 3. 方便集中控制,實(shí)施企業(yè)規(guī)則二、二、 存儲(chǔ)過程的用戶接口存儲(chǔ)過程的用戶接口v1. 創(chuàng)建存儲(chǔ)過程:創(chuàng)建存儲(chǔ)過程:CREATE Procedure 過程名(參數(shù)1,參數(shù)2,.) AS;n過程名:數(shù)據(jù)庫服務(wù)器合法的對(duì)象標(biāo)識(shí)n參數(shù)列表:用名字來標(biāo)識(shí)調(diào)用時(shí)給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參

37、數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù)。默認(rèn)為輸入?yún)?shù)。n過程體:是一個(gè)。包括聲明部分和可執(zhí)行語句部分 存儲(chǔ)過程的用戶接口(續(xù))存儲(chǔ)過程的用戶接口(續(xù))例11 利用存儲(chǔ)過程來實(shí)現(xiàn)下面的應(yīng)用: 從一個(gè)賬戶轉(zhuǎn)指定數(shù)額的款項(xiàng)到另一個(gè)賬戶中。 CREATE PROCEDURE TRANSFER(inAccount INT, outAccount INT, amount FLOAT) AS DECLARE totalDeposit FLOAT; BEGIN /* 檢查轉(zhuǎn)出賬戶的余額 */ SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCO

38、UNTNUM=outAccount; IF totalDeposit IS NULL THEN /* 賬戶不存在或賬戶中沒有存款 */ ROLLBACK; RETURN; END IF; 存儲(chǔ)過程的用戶接口(續(xù))存儲(chǔ)過程的用戶接口(續(xù)) IF totalDeposit amount THEN /* 賬戶賬戶存款不足 */ ROLLBACK; RETURN;END IF; UPDATE account SET total=total-amount WHERE ACCOUNTNUM=outAccount; /* 修改轉(zhuǎn)出賬戶,減去轉(zhuǎn)出額 */ UPDATE account SET total=to

39、tal + amount WHERE ACCOUNTNUM=inAccount; /* 修改轉(zhuǎn)入賬戶,增加轉(zhuǎn)出額 */COMMIT; /* 提交轉(zhuǎn)賬事務(wù) */END;存儲(chǔ)過程的用戶接口(續(xù))存儲(chǔ)過程的用戶接口(續(xù))v重命名存儲(chǔ)過程 ALTER Procedure 過程名1 RENAME TO 過程名2;存儲(chǔ)過程的用戶接口(續(xù))存儲(chǔ)過程的用戶接口(續(xù))v2. 執(zhí)行存儲(chǔ)過程:執(zhí)行存儲(chǔ)過程: CALL/PERFORM Procedure 過程名(參數(shù)1,參數(shù)2,.);n使用CALL或者PERFORM等方式激活存儲(chǔ)過程的執(zhí)行。n在PL/SQL中,數(shù)據(jù)庫服務(wù)器支持在過程體中調(diào)用其他存儲(chǔ)過程例12從賬戶0

40、1003815868轉(zhuǎn)一萬元到01003813828賬戶中。 CALL Procedure TRANSFER(01003813828,01003815868,10000); 存儲(chǔ)過程的用戶接口(續(xù))存儲(chǔ)過程的用戶接口(續(xù))3. 刪除存儲(chǔ)過程 DROP PROCEDURE 過程名();三、游三、游 標(biāo)標(biāo) v 在PL/SQL中,如果SELECT語句只返回一條記錄,可以將該結(jié)果存放到變量中。v 當(dāng)查詢返回多條記錄時(shí),就要使用游標(biāo)對(duì)結(jié)果集進(jìn)行處理v 一個(gè)游標(biāo)與一個(gè)SQL語句相關(guān)聯(lián)。8.2 存儲(chǔ)過程存儲(chǔ)過程v8.2.1 PL/SQL的塊結(jié)構(gòu)的塊結(jié)構(gòu)v8.2.2 變量常量的定義變量常量的定義v8.2.3

41、控制結(jié)構(gòu)控制結(jié)構(gòu)v8.2.4 存儲(chǔ)過程存儲(chǔ)過程v8.2.5 小結(jié)小結(jié)8.2.5 小小 結(jié)結(jié)v存儲(chǔ)過程的優(yōu)點(diǎn) 經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫服務(wù)器中,運(yùn)行效率高 降低客戶機(jī)和服務(wù)器之間的通信量 有利于集中控制,方便維護(hù) 第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1 嵌入式嵌入式SQL8.2 存儲(chǔ)過程存儲(chǔ)過程8.3 ODBC編程編程8.3 ODBC編程編程vODBC (Open Database Connectivity)優(yōu)點(diǎn): 移植性好 能同時(shí)訪問不同的數(shù)據(jù)庫 共享多個(gè)數(shù)據(jù)資源 8.3 ODBC編程編程v8.3.1 數(shù)據(jù)庫互連概述數(shù)據(jù)庫互連概述v8.3.2 ODBC工作原理概述工作原理概述 v8.3.3 ODBC API 基礎(chǔ)基礎(chǔ) v8.3.4 ODBC的工作流程的工作流程v8.3.5 小結(jié)小結(jié)8.3.1 數(shù)據(jù)庫互連概述數(shù)據(jù)庫互連概述vODBC產(chǎn)生的原因:產(chǎn)生的原因: 由于不同的數(shù)據(jù)庫管理系統(tǒng)的存在,在某個(gè)RDBMS下編寫的應(yīng)用程序就不能在另一個(gè)RDBMS下運(yùn)行 許多應(yīng)用程序需要共享多個(gè)部門的數(shù)據(jù)資源,訪問不同的RDBMS 數(shù)據(jù)庫互連概述(續(xù))數(shù)據(jù)庫互連概述(續(xù))vODBC: 是微軟公司開放服務(wù)體系(Windows Open Services Architecture,WOSA)中有關(guān)數(shù)據(jù)庫的一個(gè)組成部分 提供了一組訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)API (App

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論