DB08數(shù)據(jù)庫(kù)教學(xué)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第1頁(yè)
DB08數(shù)據(jù)庫(kù)教學(xué)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第2頁(yè)
DB08數(shù)據(jù)庫(kù)教學(xué)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第3頁(yè)
DB08數(shù)據(jù)庫(kù)教學(xué)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第4頁(yè)
DB08數(shù)據(jù)庫(kù)教學(xué)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第8章 數(shù)據(jù)庫(kù)編程嵌入式SQL存放過程ODBC編程第1頁(yè)8.1 嵌入式SQLSQL語(yǔ)言提供了兩種不一樣使用方式:交互式嵌入式為何要引入嵌入式SQLSQL語(yǔ)言是非過程性語(yǔ)言事務(wù)處理應(yīng)用需要高級(jí)語(yǔ)言這兩種方式細(xì)節(jié)上有差異,在程序設(shè)計(jì)環(huán)境下,SQL語(yǔ)句要做一些必要擴(kuò)充第2頁(yè)8.1.1 嵌入式SQL處理過程主語(yǔ)言嵌入式SQL是將SQL語(yǔ)句嵌入程序設(shè)計(jì)語(yǔ)言中,被嵌入程序設(shè)計(jì)語(yǔ)言,如C、C+、Java,稱為宿主語(yǔ)言,簡(jiǎn)稱主語(yǔ)言。處理過程預(yù)編譯方法第3頁(yè)主語(yǔ)言程序 含ESQL語(yǔ)句RDBMS預(yù)處理程序ESQL語(yǔ)句轉(zhuǎn)換為函數(shù)調(diào)用主語(yǔ)言編譯程序目口號(hào)言程序ESQL基本處理過程8.1.1 嵌入式SQL處理過程第4頁(yè)

2、為了區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句, 全部SQL語(yǔ)句必須加前綴EXEC SQL,以(;)結(jié)束: EXEC SQL ;8.1.1 嵌入式SQL處理過程第5頁(yè)8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信將SQL嵌入到高級(jí)語(yǔ)言中混合編程,程序中會(huì)含有兩種不一樣計(jì)算模型語(yǔ)句SQL語(yǔ)句描述性面向集合語(yǔ)句負(fù)責(zé)操縱數(shù)據(jù)庫(kù)高級(jí)語(yǔ)言語(yǔ)句過程性面向統(tǒng)計(jì)語(yǔ)句負(fù)責(zé)控制程序流程它們之間應(yīng)該怎樣通信?第6頁(yè)數(shù)據(jù)庫(kù)工作單元與源程序工作單元之間通信:1. SQL通信區(qū)向主語(yǔ)言傳遞SQL語(yǔ)句執(zhí)行狀態(tài)信息使主語(yǔ)言能夠據(jù)此控制程序流程2. 主變量主語(yǔ)言向SQL語(yǔ)句提供參數(shù)將SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)結(jié)果交主語(yǔ)言深入處理3. 游標(biāo)處理集合性操

3、作語(yǔ)言與過程性操作語(yǔ)言不匹配8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第7頁(yè)一、SQL通信區(qū)8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信SQLCA: SQL Communication AreaSQLCA是一個(gè)數(shù)據(jù)結(jié)構(gòu)SQLCA用途SQL語(yǔ)句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息描述系統(tǒng)當(dāng)前工作狀態(tài)描述運(yùn)行環(huán)境這些信息將送到SQL通信區(qū)SQLCA中應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行語(yǔ)句第8頁(yè)SQLCA使用方法:定義SQLCA用EXEC SQL INCLUDE SQLCA定義使用SQLCASQLCA中有一個(gè)存放每次執(zhí)行SQL語(yǔ)句后返回代碼變量SQLCODE假如SQLCOD

4、E等于預(yù)定義常量SUCCESS,則表示SQL語(yǔ)句成功,不然表示犯錯(cuò)應(yīng)用程序每執(zhí)行完一條SQL 語(yǔ)句之后都應(yīng)該測(cè)試一下SQLCODE值,以了解該SQL語(yǔ)句執(zhí)行情況并做對(duì)應(yīng)處理8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第9頁(yè)二、主變量 8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信主變量嵌入式SQL語(yǔ)句中能夠使用主語(yǔ)言程序變量來輸入或輸出數(shù)據(jù)在SQL語(yǔ)句中使用主語(yǔ)言程序變量簡(jiǎn)稱為主變量(Host Variable)第10頁(yè)主變量類型輸入主變量輸出主變量一個(gè)主變量有可能既是輸入主變量又是輸出主變量8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第11頁(yè)指示變量:一個(gè)主變量能夠附帶一個(gè)指示變量(Indic

5、ator Variable)什么是指示變量指示變量用途8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第12頁(yè)在SQL語(yǔ)句中使用主變量和指示變量方法1) 說明主變量和指示變量BEGIN DECLARE SECTION. . (說明主變量和指示變量).END DECLARE SECTION8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第13頁(yè)2) 使用主變量說明之后主變量能夠在SQL語(yǔ)句中任何一個(gè)能夠使用表示式地方出現(xiàn)為了與數(shù)據(jù)庫(kù)對(duì)象名(表名、視圖名、列名等)區(qū)分,SQL語(yǔ)句中主變量名前要加冒號(hào)(:)作為標(biāo)志3) 使用指示變量 指示變量前也必須加冒號(hào)標(biāo)志 必須緊跟在所指主變量之后8.1.2 嵌入式SQ

6、L語(yǔ)句與主語(yǔ)言之間通信第14頁(yè)三、游標(biāo)(cursor)8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信為何要使用游標(biāo)SQL語(yǔ)言與主語(yǔ)言含有不一樣數(shù)據(jù)處理方式SQL語(yǔ)言是面向集合,一條SQL語(yǔ)句標(biāo)準(zhǔn)上能夠產(chǎn)生或處理多條統(tǒng)計(jì)主語(yǔ)言是面向統(tǒng)計(jì),一組主變量一次只能存放一條統(tǒng)計(jì)僅使用主變量并不能完全滿足SQL語(yǔ)句向應(yīng)用程序輸出數(shù)據(jù)要求嵌入式SQL引入了游標(biāo)概念,用來協(xié)調(diào)這兩種不一樣處理方式第15頁(yè)游標(biāo)游標(biāo)是系統(tǒng)為用戶開設(shè)一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語(yǔ)句執(zhí)行結(jié)果每個(gè)游標(biāo)區(qū)都有一個(gè)名字用戶能夠用SQL語(yǔ)句逐一從游標(biāo)中獲取統(tǒng)計(jì),并賦給主變量,交由主語(yǔ)言深入處理8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第16頁(yè)四、

7、建立和關(guān)閉數(shù)據(jù)庫(kù)連接8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信建立數(shù)據(jù)庫(kù)連接 EXEC SQL CONNECT TO target AS connection-name USER user-name; target是要連接數(shù)據(jù)庫(kù)服務(wù)器:常見服務(wù)器標(biāo)識(shí)串,如: 包含服務(wù)器標(biāo)識(shí)SQL串常量 DEFAULT connect-name是可選連接名,連接必須是一個(gè)有效標(biāo)識(shí)符,在整個(gè)程序內(nèi)只有一個(gè)連接時(shí)能夠不指定連接名關(guān)閉數(shù)據(jù)庫(kù)連接 EXEC SQL DISCONNECT connection;程序運(yùn)行過程中能夠修改當(dāng)前連接 :EXEC SQL SET CONNECTION connection-nam

8、e | DEFAULT;第17頁(yè)五、程序?qū)嵗?依次檢驗(yàn)?zāi)硞€(gè)系學(xué)生統(tǒng)計(jì),交互式更新一些學(xué)生年紀(jì)。EXEC SQL BEGIN DECLARE SECTION; /*主變量說明開始*/ char deptname64;char HSno64;char HSname64; char HSsex64;int HSage;intNEWAGE;EXEC SQL END DECLARE SECTION; /*主變量說明結(jié)束*/long SQLCODE;EXEC SQL INCLUDE sqlca; /*定義SQL通信區(qū)*/8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第18頁(yè)int main(void) /

9、*C語(yǔ)言主程序開始*/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ù)庫(kù)TEST*/EXEC SQL DECLARE SX CURSOR FOR /*定義游標(biāo)*/SELECT Sno, Sname, Ssex, Sage /*SX對(duì)應(yīng)語(yǔ)句執(zhí)行結(jié)果

10、*/FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; /*打開游標(biāo)SX便指向查詢結(jié)果第一行*/8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第19頁(yè)for ( ; ; ) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中統(tǒng)計(jì)*/ EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage; /*推進(jìn)游標(biāo),將當(dāng)前數(shù)據(jù)放入主變量*/if (sqlca.sqlcode != 0) /* sqlcode != 0,表示操作不成功*/break; /*利用SQLCA中狀態(tài)信息決定何時(shí)退出循環(huán)*/if(count+ = 0

11、) /*假如是第一行話,先打出行頭*/ 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é)生年紀(jì)*/ do scanf(%c,&yn); while(yn != N & yn != n & yn != Y & yn != y);8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通信第20頁(yè)if (yn = y | y

12、n = Y) /*假如選擇更新操作*/ printf(INPUT NEW AGE:); scanf(%d,&NEWAGE); /*用戶輸入新年紀(jì)到主變量中*/ EXEC SQL UPDATE Student /*嵌入式SQL*/SET Sage = :NEWAGEWHERE CURRENT OF SX ; /*對(duì)當(dāng)前游標(biāo)指向?qū)W生年紀(jì)進(jìn)行更新*/ EXEC SQL CLOSE SX; /*關(guān)閉游標(biāo)SX不再和查詢結(jié)果對(duì)應(yīng)*/EXEC SQL COMMIT WORK; /*提交更新*/EXEC SQL DISCONNECT TEST; /*斷開數(shù)據(jù)庫(kù)連接*/8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間通

13、信第21頁(yè)8.1.3 不用游標(biāo)SQL語(yǔ)句不用游標(biāo)SQL語(yǔ)句種類 說明性語(yǔ)句 數(shù)據(jù)定義語(yǔ)句 數(shù)據(jù)控制語(yǔ)句 查詢結(jié)果為單統(tǒng)計(jì)SELECT語(yǔ)句 非CURRENT形式增刪改語(yǔ)句 第22頁(yè)一、查詢結(jié)果為單統(tǒng)計(jì)SELECT語(yǔ)句8.1.3 不用游標(biāo)SQL語(yǔ)句這類語(yǔ)句不需要使用游標(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,:Hage,:Hdept FROM Student WHERE

14、Sno=:givensno;第23頁(yè)(1) INTO子句、WHERE子句和HAVING短語(yǔ)條件表示式中均能夠使用主變量(2)查詢返回統(tǒng)計(jì)中,可能一些列為空值NULL。(3) 假如查詢結(jié)果實(shí)際上并不是單條統(tǒng)計(jì),而是多條統(tǒng)計(jì),則程序犯錯(cuò),RDBMS會(huì)在SQLCA中返回錯(cuò)誤信息 8.1.3 不用游標(biāo)SQL語(yǔ)句第24頁(yè)例3 查詢某個(gè)學(xué)生選修某門課程成績(jī)。假設(shè)已經(jīng)把將要查詢學(xué)生學(xué)號(hào)賦給了主變量givensno,將課程號(hào)賦給了主變量givencno。 EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid /*指示變量Gradeid*/

15、 FROM SC WHERE Sno=:givensno AND Cno=:givencno;假如Gradeid 0,不論Hgrade為何值,均認(rèn)為該學(xué)生成績(jī)?yōu)榭罩怠?.1.3 不用游標(biāo)SQL語(yǔ)句第25頁(yè)二、非CURRENT形式增刪改語(yǔ)句8.1.3 不用游標(biāo)SQL語(yǔ)句在UPDATESET子句和WHERE子句中能夠使用主變量,SET子句還能夠使用指示變量 例4 修改某個(gè)學(xué)生選修1號(hào)課程成績(jī)。EXEC SQL UPDATE SC SET Grade=:newgrade /*修改成績(jī)已賦給主變量*/ WHERE Sno=:givensno; /*學(xué)號(hào)賦給主變量givensno*/ 第26頁(yè)例5 將計(jì)

16、算機(jī)系全體學(xué)生年紀(jì)置NULL值。 Sageid=-1; EXEC SQL UPDATE Student SET Sage=:Raise :Sageid WHERE Sdept= CS ; 將指示變量Sageid賦一個(gè)負(fù)值后,不論主變量Raise為何值,RDBMS都會(huì)將CS系全部學(xué)生年紀(jì)置空值 。等價(jià)于: EXEC SQL UPDATE Student SET Sage=NULL WHERE Sdept= CS;8.1.3 不用游標(biāo)SQL語(yǔ)句第27頁(yè)例6 某個(gè)學(xué)生退學(xué)了,現(xiàn)要將相關(guān)他全部選課統(tǒng)計(jì)刪除掉。假設(shè)該學(xué)生姓名已賦給主變量stdname。 EXEC SQL DELETE FROM SC W

17、HERE Sno= (SELECT Sno FROM Student WHERE Sname=:stdname); 8.1.3 不用游標(biāo)SQL語(yǔ)句第28頁(yè)例7 某個(gè)學(xué)生新選修了某門課程,將相關(guān)統(tǒng)計(jì)插入SC表中。假設(shè)插入學(xué)號(hào)已賦給主變量stdno,課程號(hào)已賦給主變量couno。 gradeid=-1; /*用作指示變量,賦為負(fù)值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); 因?yàn)樵搶W(xué)生剛選修課程,成績(jī)應(yīng)為空,所以要把指示變量賦為負(fù)值 8.1.3 不用游標(biāo)SQL語(yǔ)句第29頁(yè)8.1.4 使用游標(biāo)

18、SQL語(yǔ)句必須使用游標(biāo)SQL語(yǔ)句查詢結(jié)果為多條統(tǒng)計(jì)SELECT語(yǔ)句CURRENT形式UPDATE語(yǔ)句CURRENT形式DELETE語(yǔ)句第30頁(yè)一、 查詢結(jié)果為多條統(tǒng)計(jì)SELECT語(yǔ)句8.1.4 使用游標(biāo)SQL語(yǔ)句使用游標(biāo)步驟1. 說明游標(biāo)2. 打開游標(biāo)3.推進(jìn)游標(biāo)指針并取當(dāng)前統(tǒng)計(jì) 4. 關(guān)閉游標(biāo)第31頁(yè)1. 說明游標(biāo)8.1.4 使用游標(biāo)SQL語(yǔ)句使用DECLARE語(yǔ)句語(yǔ)句格式EXEC SQL DECLARE CURSOR FOR ;功效是一條說明性語(yǔ)句,這時(shí)DBMS并不執(zhí)行SELECT指定查詢操作。第32頁(yè)使用OPEN語(yǔ)句語(yǔ)句格式 EXEC SQL OPEN ;功效打開游標(biāo)實(shí)際上是執(zhí)行對(duì)應(yīng)SE

19、LECT語(yǔ)句,把全部滿足查詢條件統(tǒng)計(jì)從指定表取到緩沖區(qū)中這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中第一條統(tǒng)計(jì)8.1.4 使用游標(biāo)SQL語(yǔ)句第33頁(yè)3.推進(jìn)游標(biāo)指針并取當(dāng)前統(tǒng)計(jì) 使用FETCH語(yǔ)句語(yǔ)句格式 EXEC SQL FETCH INTO ,.;8.1.4 使用游標(biāo)SQL語(yǔ)句功能指定方向推進(jìn)游標(biāo)指針,然后將緩沖區(qū)中當(dāng)前記錄用出來送至主變量供主語(yǔ)言深入處理第34頁(yè)4. 關(guān)閉游標(biāo)使用CLOSE語(yǔ)句語(yǔ)句格式 EXEC SQL CLOSE ;功效關(guān)閉游標(biāo),釋放結(jié)果集占用緩沖區(qū)及其它資源說明游標(biāo)被關(guān)閉后,就不再和原來查詢結(jié)果集相聯(lián)絡(luò)被關(guān)閉游標(biāo)能夠再次被打開,與新查詢結(jié)果相聯(lián)絡(luò)8.1.4 使用游標(biāo)SQ

20、L語(yǔ)句第35頁(yè)二、CURRENT形式UPDATE語(yǔ)句和DELETE語(yǔ)句CURRENT形式UPDATE語(yǔ)句和DELETE語(yǔ)句用途 面向集合操作 一次修改或刪除全部滿足條件統(tǒng)計(jì)8.1.4 使用游標(biāo)SQL語(yǔ)句第36頁(yè)假如只想修改或刪除其中某個(gè)統(tǒng)計(jì)用帶游標(biāo)SELECT語(yǔ)句查出全部滿足條件統(tǒng)計(jì)從中深入找出要修改或刪除統(tǒng)計(jì)用CURRENT形式UPDATE語(yǔ)句和DELETE語(yǔ)句修改或刪除之UPDATE語(yǔ)句和DELETE語(yǔ)句中子句: WHERE CURRENT OF 表示修改或刪除是最近一次取出統(tǒng)計(jì),即游標(biāo)指針指向統(tǒng)計(jì) 8.1.4 使用游標(biāo)SQL語(yǔ)句第37頁(yè)不能使用CURRENT形式UPDATE語(yǔ)句和DELE

21、TE語(yǔ)句 :當(dāng)游標(biāo)定義中SELECT語(yǔ)句帶有UNION或ORDER BY子句 該SELECT語(yǔ)句相當(dāng)于定義了一個(gè)不可更新視圖 8.1.4 使用游標(biāo)SQL語(yǔ)句第38頁(yè) 8.1.5 動(dòng)態(tài)SQL靜態(tài)嵌入式SQL靜態(tài)嵌入式SQL語(yǔ)句能夠滿足普通要求 無(wú)法滿足要到執(zhí)行時(shí)才能夠確定要提交SQL語(yǔ)句 動(dòng)態(tài)嵌入式SQL允許在程序運(yùn)行過程中暫時(shí)“組裝”SQL語(yǔ)句支持動(dòng)態(tài)組裝SQL語(yǔ)句和動(dòng)態(tài)參數(shù)兩種形式 第39頁(yè)一、使用SQL語(yǔ)句主變量SQL語(yǔ)句主變量:程序主變量包含內(nèi)容是SQL語(yǔ)句內(nèi)容,而不是原來保留數(shù)據(jù)輸入或輸出變量SQL語(yǔ)句主變量在程序執(zhí)行期間能夠設(shè)定不一樣SQL語(yǔ)句,然后馬上執(zhí)行 8.1.5 動(dòng)態(tài)SQL第

22、40頁(yè)例9 創(chuàng)建基本表TESTEXEC SQL BEGIN DECLARE SECTION;const char *stmt = CREATE TABLE test(a int); /* SQL語(yǔ)句主變量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL EXECUTE IMMEDIATE :stmt; /* 執(zhí)行語(yǔ)句 */ 8.1.5 動(dòng)態(tài)SQL第41頁(yè)二、動(dòng)態(tài)參數(shù)動(dòng)態(tài)參數(shù)SQL語(yǔ)句中可變?cè)厥褂脜?shù)符號(hào)(?)表示該位置數(shù)據(jù)在運(yùn)行時(shí)設(shè)定和主變量區(qū)分動(dòng)態(tài)參數(shù)輸入不是編譯時(shí)完成綁定而是經(jīng)過 (prepare)語(yǔ)句準(zhǔn)備主變量和執(zhí)行(execute)時(shí)綁定數(shù)據(jù)或主

23、變量來完成 8.1.5 動(dòng)態(tài)SQL第42頁(yè)使用動(dòng)態(tài)參數(shù)步驟:1.申明SQL語(yǔ)句主變量。2.準(zhǔn)備SQL語(yǔ)句(PREPARE)。 EXEC SQL PREPARE FROM ; 3.執(zhí)行準(zhǔn)備好語(yǔ)句(EXECUTE)EXEC SQL EXECUTE INTO USING ; 8.1.5 動(dòng)態(tài)SQL第43頁(yè)例10向TEST中插入元組。EXEC SQL BEGIN DECLARE SECTION;const char *stmt = INSERT INTO test VALUES(?); /*申明SQL主變量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL PREP

24、ARE mystmt FROM :stmt; /* 準(zhǔn)備語(yǔ)句 */. .EXEC SQL EXECUTE mystmt USING 100; /* 執(zhí)行語(yǔ)句 */EXEC SQL EXECUTE mystmt USING 200; /* 執(zhí)行語(yǔ)句 */ 8.1.5 動(dòng)態(tài)SQL第44頁(yè)8.2 存放過程PL/SQL塊結(jié)構(gòu)變量常量定義控制結(jié)構(gòu)存放過程小結(jié)第45頁(yè)8.2.1 PL/SQL塊結(jié)構(gòu)PL/SQL :SQL擴(kuò)展 增加了過程化語(yǔ)句功效 基本結(jié)構(gòu)是塊塊之間能夠相互嵌套 每個(gè)塊完成一個(gè)邏輯操作 第46頁(yè)P(yáng)L/SOL塊基本結(jié)構(gòu): 1.定義部分 DECLARE -變量、常量、游標(biāo)、異常等 定義變量、常量

25、等只能在該基本塊中使用當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在8.2.1 PL/SQL塊結(jié)構(gòu)第47頁(yè)2.執(zhí)行部分 BEGIN -SQL語(yǔ)句、PL/SQL流程控制語(yǔ)句 EXCEPTION -異常處理部分 END;8.2.1 PL/SQL塊結(jié)構(gòu)第48頁(yè)8.2.2 變量常量定義1. PL/SQL中定義變量語(yǔ)法形式是: 變量名 數(shù)據(jù)類型 NOT NULL:=初值表示式或 變量名 數(shù)據(jù)類型 NOT NULL初值表示式2. 常量定義類似于變量定義: 常量名 數(shù)據(jù)類型 CONSTANT :=常量表示式 常量必須要給一個(gè)值,而且該值在存在期間或常量作用域內(nèi)不能改變。假如試圖修改它,PL/SQL將返回一個(gè)異常。3.

26、賦值語(yǔ)句 變量名稱:=表示式第49頁(yè)8.2.3 控制結(jié)構(gòu) PL/SQL 功效:一、條件控制語(yǔ)句二、循環(huán)控制語(yǔ)句 三、錯(cuò)誤處理 第50頁(yè)一、 條件控制語(yǔ)句 IF-THEN, IF-THEN-ELSE和嵌套IF語(yǔ)句 1. IF condition THEN Sequence_of_statements; END IF 2. IF condition THEN Sequence_of_statements1; ELSE Sequence_of_statements2; END IF;3. 在THEN和ELSE子句中還能夠再包含IF語(yǔ)句,即IF語(yǔ)句能夠嵌套 8.2.3 控制結(jié)構(gòu) 第51頁(yè)二、循環(huán)控制語(yǔ)

27、句 LOOP, WHILE-LOOP和FOR-LOOP 1.最簡(jiǎn)單循環(huán)語(yǔ)句LOOP LOOP Sequence_of_statements; END LOOP; 多數(shù)數(shù)據(jù)庫(kù)服務(wù)器PL/SQL都提供EXIT、BREAK或LEAVE等循環(huán)結(jié)束語(yǔ)句,確保LOOP語(yǔ)句塊能夠結(jié)束。8.2.3 控制結(jié)構(gòu) 第52頁(yè)2. WHILE-LOOP WHILE condition LOOP Sequence_of_statements;END LOOP;每次執(zhí)行循環(huán)體語(yǔ)句之前,首先對(duì)條件進(jìn)行求值假如條件為真,則執(zhí)行循環(huán)體內(nèi)語(yǔ)句序列。假如條件為假,則跳過循環(huán)并把控制傳遞給下一個(gè)語(yǔ)句 3. FOR-LOOP FOR c

28、ount IN REVERSEbound1 bound2 LOOP Sequence_of_statements;END LOOP;8.2.3 控制結(jié)構(gòu) 第53頁(yè)三、錯(cuò)誤處理:假如PL/SQL在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常語(yǔ)句處停下來,依據(jù)異常類型去執(zhí)行異常處理語(yǔ)句 SQL標(biāo)準(zhǔn)對(duì)數(shù)據(jù)庫(kù)服務(wù)器提供什么樣異常處理做出了提議,要求PL/SQL管理器提供完善異常處理機(jī)制 8.2.3 控制結(jié)構(gòu) 第54頁(yè)8.2.4 存放過程PL/SQL塊類型:命名塊:編譯后保留在數(shù)據(jù)庫(kù)中,能夠被重復(fù)調(diào)用,運(yùn)行速度較快。存放過程和函數(shù)是命名塊 匿名塊:每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存放到數(shù)據(jù)庫(kù)中,也不能在其它P

29、L/SQL塊中調(diào)用 第55頁(yè)存放過程:由PL/SQL語(yǔ)句書寫過程,經(jīng)編譯和優(yōu)化后存放在數(shù)據(jù)庫(kù)服務(wù)器中,使用時(shí)只要調(diào)用即可。 一、存放過程優(yōu)點(diǎn):1. 運(yùn)行效率高2. 降低了客戶機(jī)和服務(wù)器之間通信量 3. 方便實(shí)施企業(yè)規(guī)則8.2.4 存放過程第56頁(yè)二、 存放過程用戶接口:1. 創(chuàng)建存放過程 2. 執(zhí)行存放過程 3. 刪除存放過程 8.2.4 存放過程第57頁(yè)1. 創(chuàng)建存放過程:CREATE Procedure 過程名(參數(shù)1,參數(shù)2,.) AS;過程名:數(shù)據(jù)庫(kù)服務(wù)器正當(dāng)對(duì)象標(biāo)識(shí)參數(shù)列表:用名字來標(biāo)識(shí)調(diào)用時(shí)給出參數(shù)值,必須指定值數(shù)據(jù)類型。參數(shù)也能夠定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù)。默認(rèn)為輸入

30、參數(shù)。過程體:是一個(gè)。包含申明部分和可執(zhí)行語(yǔ)句部分 8.2.4 存放過程第58頁(yè)例11 利用存放過程來實(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 /* 檢驗(yàn)轉(zhuǎn)出賬戶余額 */ SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM=outAccount; IF totalDeposit IS NULL

31、THEN /* 賬戶不存在或賬戶中沒有存款 */ ROLLBACK; RETURN; END IF; 8.2.4 存放過程第59頁(yè) 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=total + amount WHERE ACCOUNTNUM=inAccount; /* 修改轉(zhuǎn)入賬戶,增加

32、轉(zhuǎn)出額 */COMMIT; /* 提交轉(zhuǎn)賬事務(wù) */END;8.2.4 存放過程第60頁(yè)2. 執(zhí)行存放過程: CALL/PERFORM Procedure 過程名(參數(shù)1,參數(shù)2,.);使用CALL或者PERFORM等方式激活存放過程執(zhí)行。在PL/SQL中,數(shù)據(jù)庫(kù)服務(wù)器支持在過程體中調(diào)用其它存放過程例11 從賬戶01003815868轉(zhuǎn)一萬(wàn)元到01003813828賬戶中。 CALL Procedure TRANSFER(01003813828,01003815868,10000); 8.2.4 存放過程第61頁(yè)3. 刪除存放過程 DROP PROCEDURE 過程名();8.2.4 存放過程

33、第62頁(yè)CREATE OR REPLACE PROCEDURE RAISE_SALARY1(emp_id INTEGER,INCREASE REAL)IS CURRENT_SALARY REAL;BEGIN SELECT SAL INTO CURRENT_SALARY FROM EMP WHERE empno =emp_id; UPDATE EMP SET SAL=SAL+INCREASE WHERE empno=emp_id;EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(emp_id |無(wú)此編號(hào));END;8.2.4 存放過程第63頁(yè)三、游 標(biāo) 在PL/SQL中,假如SELECT語(yǔ)句只返回一條統(tǒng)計(jì),能夠?qū)⒃摻Y(jié)果存放到變量中。當(dāng)查詢返回多條統(tǒng)計(jì)時(shí),就要使用游標(biāo)對(duì)結(jié)果集進(jìn)行處理一個(gè)游標(biāo)與一個(gè)SQL語(yǔ)句相關(guān)聯(lián)。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論