chap8 數(shù)據(jù)庫編程.ppt_第1頁
chap8 數(shù)據(jù)庫編程.ppt_第2頁
chap8 數(shù)據(jù)庫編程.ppt_第3頁
chap8 數(shù)據(jù)庫編程.ppt_第4頁
chap8 數(shù)據(jù)庫編程.ppt_第5頁
已閱讀5頁,還剩129頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第八章 數(shù)據(jù)庫編程,8.1 嵌入式SQL 8.2 存儲過程 8.3 ODBC編程,8.1 嵌入式SQL,SQL語言提供了兩種不同的使用方式: 交互式 嵌入式 為什么要引入嵌入式SQL SQL語言是非過程性語言 事務(wù)處理應(yīng)用需要高級語言 這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計的環(huán)境下,SQL語句要做某些必要的擴充,8.1 嵌入式SQL(ESQL),8.1.1 嵌入式SQL的處理過程 8.1.2 嵌入式SQL語句與主語言之間的通信 8.1.3 不使用游標(biāo)的SQL語句 8.1.4 使用游標(biāo)的SQL語句 8.1.5 動態(tài)SQL 8.1.6 小結(jié),8.1.1 嵌入式SQL的處理過程,主語言 嵌入式SQL是將

2、SQL語句嵌入程序設(shè)計語言中,被嵌入的程序設(shè)計語言,如C、C+、Java,C#稱為宿主語言,簡稱主語言。 處理過程 預(yù)編譯方法,嵌入式SQL的處理過程(續(xù)),嵌入式SQL的處理過程(續(xù)),為了區(qū)分SQL語句與主語言語句, 所有SQL語句必須加前綴EXEC SQL,以(;)結(jié)束: EXEC SQL ;,8.1 嵌入式SQL,8.1.1 嵌入式SQL的處理過程 8.1.2 嵌入式SQL與主語言的通信 8.1.3 不使用游標(biāo)的SQL語句 8.1.4 使用游標(biāo)的SQL語句 8.1.5 動態(tài)SQL 8.1.6 小結(jié),8.1.2 嵌入式SQL語句與主語言之間的通信,將SQL嵌入到高級語言中混合編程,程序中

3、會含有兩種不同計算模型的語句 SQL語句 描述性的面向集合的語句 負(fù)責(zé)操縱數(shù)據(jù)庫 高級語言語句 過程性的面向記錄的語句 負(fù)責(zé)控制程序流程 它們之間應(yīng)該如何通信?,嵌入式SQL語句與主語言之間的通信(續(xù)),數(shù)據(jù)庫工作單元與源程序工作單元之間的通信: 1. SQL通信區(qū)(SQLCA) 向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息 使主語言能夠據(jù)此控制程序流程 2. 主變量 主語言向SQL語句提供參數(shù) 將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進一步處理 3. 游標(biāo) 解決集合性操作語言與過程性操作語言的不匹配,一、SQL通信區(qū),SQLCA: SQL Communication Area SQLCA是一個數(shù)據(jù)結(jié)構(gòu)

4、SQLCA的用途 SQL語句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息 描述系統(tǒng)當(dāng)前工作狀態(tài) 描述運行環(huán)境 這些信息將送到SQL通信區(qū)SQLCA中 應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句,SQL通信區(qū),SQLCA使用方法: 定義SQLCA 用EXEC SQL INCLUDE SQLCA定義 使用SQLCA SQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE 如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯 應(yīng)用程序每執(zhí)行完一條SQL 語句之后都應(yīng)該測試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理,二、

5、主變量,主變量 嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù) 在SQL語句中使用的主語言程序變量簡稱為主變量(Host Variable),主變量(續(xù)),主變量的類型 輸入主變量 輸出主變量 一個主變量有可能既是輸入主變量又是輸出主變量,主變量(續(xù)),指示變量: 一個主變量可以附帶一個指示變量(Indicator Variable) 什么是指示變量 指示變量的用途,主變量(續(xù)),在SQL語句中使用主變量和指示變量的方法 1) 說明主變量和指示變量 BEGIN DECLARE SECTION . . (說明主變量和指示變量) . END DECLARE SECTION,主變量(續(xù))

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

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

8、效的標(biāo)識符 在整個程序內(nèi)只有一個連接時可以不指定連接名 關(guān)閉數(shù)據(jù)庫連接 EXEC SQL DISCONNECT connection; 程序運行過程中可以修改當(dāng)前連接 : EXEC SQL SET CONNECTION connection-name | DEFAULT;,五、程序?qū)嵗?例1依次檢查某個系的學(xué)生記錄,交互式更新某些學(xué)生年齡。 EXEC SQL BEGIN DEC LARE SECTION; /*主變量說明開始*/ char deptname64; char HSno64; char HSname64; char HSsex64; int HSage; intNEWAGE; EX

9、EC SQL END DECLARE SECTION; /*主變量說明結(jié)束*/ long SQLCODE; EXEC SQL INCLUDE sqlca; /*定義SQL通信區(qū)*/,程序?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:543

10、21 USER SYSTEM /MANAGER; /*連接數(shù)據(jù)庫TEST*/ EXEC SQL DECLARE SX CURSOR FOR /*定義游標(biāo)*/ SELECT Sno, Sname, Ssex, Sage /*SX對應(yīng)語句的執(zhí)行結(jié)果*/ FROM Student WHERE SDept = :deptname; EXEC SQL OPEN SX; /*打開游標(biāo)SX便指向查詢結(jié)果的第一行*/,程序?qū)嵗ɡm(xù)),for ( ; ; ) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/ EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage; /*

11、推進游標(biāo),將當(dāng)前數(shù)據(jù)放入主變量*/ if (sqlca.sqlcode != 0) /* sqlcode != 0,表示操作不成功*/ break; /*利用SQLCA中的狀態(tài)信息決定何時退出循環(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)?); /*詢問用戶是

12、否要更新該學(xué)生的年齡*/ do scanf(%c,程序?qū)嵗ɡm(xù)),if (yn = y | yn = Y) /*如果選擇更新操作*/ printf(INPUT NEW AGE:); scanf(%d, /*斷開數(shù)據(jù)庫連接*/ ,8.1 嵌入式SQL,8.1.1 嵌入式SQL的處理過程 8.1.2 嵌入式SQL語句與主語言之間的通信 8.1.3 不使用游標(biāo)的SQL語句 8.1.4 使用游標(biāo)的SQL語句 8.1.5 動態(tài)SQL 8.1.6 小結(jié),8.1.3 不用游標(biāo)的SQL語句,不用游標(biāo)的SQL語句的種類 說明性語句 數(shù)據(jù)定義語句 數(shù)據(jù)控制語句 查詢結(jié)果為單記錄的SELECT語句 非CURRENT

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

14、(1) INTO子句、WHERE子句和HAVING短語的條件表達式中均可以使用主變量 (2)查詢返回的記錄中,可能某些列為空值NULL。 (3) 如果查詢結(jié)果實際上并不是單條記錄,而是多條記錄,則程序出錯,RDBMS會在SQLCA中返回錯誤信息,查詢結(jié)果為單記錄的SELECT語句(續(xù)),例3 查詢某個學(xué)生選修某門課程的成績。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號賦給了主變量givensno,將課程號賦給了主變量givencno。 EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid /*指示變量Gradeid*/ FROM SC

15、WHERE Sno=:givensno AND Cno=:givencno; 如果Gradeid 0,不論Hgrade為何值,均認(rèn)為該學(xué)生成績?yōu)榭罩怠?二、非CURRENT形式的增刪改語句,在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量 例4 修改某個學(xué)生選修1號課程的成績。 EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成績已賦給主變量*/ WHERE Sno=:givensno; /*學(xué)號賦給主變量givensno*/,非CURRENT形式的增刪改語句(續(xù)),例5 將計算機系全體學(xué)生年齡置NULL值。 Sa

16、geid=-1; EXEC SQL UPDATE Student SET Sage=:Raise :Sageid WHERE Sdept= CS; 將指示變量Sageid賦一個負(fù)值后,無論主變量Raise為何值,RDBMS都會將CS系所有學(xué)生的年齡置空值 。 等價于: EXEC SQL UPDATE Student SET Sage=NULL WHERE Sdept= CS;,非CURRENT形式的增刪改語句(續(xù)),例6 某個學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已賦給主變量stdname。 EXEC SQL DELETE FROM SC WHERE Sno= (SEL

17、ECT Sno FROM Student WHERE Sname=:stdname);,非CURRENT形式的增刪改語句(續(xù)),例7 某個學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號已賦給主變量stdno,課程號已賦給主變量couno。 gradeid=-1; /*用作指示變量,賦為負(fù)值*/ EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); 由于該學(xué)生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負(fù)值,8.1 嵌入式SQL,8.1.1 嵌入式SQL的處理過程 8.1.2 嵌入式SQ

18、L語句與主語言之間的通信 8.1.3 不使用游標(biāo)的SQL語句 8.1.4 使用游標(biāo)的SQL語句 8.1.5 動態(tài)SQL 8.1.6 小結(jié),8.1.4 使用游標(biāo)的SQL語句,必須使用游標(biāo)的SQL語句 查詢結(jié)果為多條記錄的SELECT語句 CURRENT形式的UPDATE語句 CURRENT形式的DELETE語句,使用游標(biāo)的SQL語句(續(xù)),一、 查詢結(jié)果為多條記錄的SELECT語句 二、CURRENT形式的UPDATE和DELETE語句,一、 查詢結(jié)果為多條記錄的SELECT語句,使用游標(biāo)的步驟 1. 說明游標(biāo) 2. 打開游標(biāo) 3.推進游標(biāo)指針并取當(dāng)前記錄 4. 關(guān)閉游標(biāo),1. 說明游標(biāo),使用D

19、ECLARE語句 語句格式 EXEC SQL DECLARE CURSOR FOR ; 功能 是一條說明性語句,這時DBMS并不執(zhí)行SELECT指定的查詢操作。,2. 打開游標(biāo),使用OPEN語句 語句格式 EXEC SQL OPEN ; 功能 打開游標(biāo)實際上是執(zhí)行相應(yīng)的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中 這時游標(biāo)處于活動狀態(tài),指針指向查詢結(jié)果集中第一條記錄,3.推進游標(biāo)指針并取當(dāng)前記錄,使用FETCH語句 語句格式 EXEC SQL FETCH NEXT|PRIOR| FIRST|LAST FROM INTO ,.;,推進游標(biāo)指針并取當(dāng)前記錄(續(xù)),功能 指定方向推

20、動游標(biāo)指針,然后將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進一步處理 NEXT|PRIOR|FIRST|LAST:指定推動游標(biāo)指針的方式 NEXT:向前推進一條記錄 PRIOR:向回退一條記錄 FIRST:推向第一條記錄 LAST:推向最后一條記錄 缺省值為NEXT,4. 關(guān)閉游標(biāo),使用CLOSE語句 語句格式 EXEC SQL CLOSE ; 功能 關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源 說明 游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系 被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果相聯(lián)系,二、CURRENT形式的UPDATE語句和DELETE語句,CURRENT形式的UPDATE語句和

21、DELETE語句的用途 面向集合的操作 一次修改或刪除所有滿足條件的記錄,CURRENT形式的UPDATE語句和DELETE語句(續(xù)),如果只想修改或刪除其中某個記錄 用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄 從中進一步找出要修改或刪除的記錄 用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之 UPDATE語句和DELETE語句中的子句: WHERE CURRENT OF 表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄,CURRENT形式的UPDATE語句和DELETE語句(續(xù)),不能使用CURRENT形式的UPDATE語句和DELETE語句 : 當(dāng)游標(biāo)定

22、義中的SELECT語句帶有UNION或ORDER BY子句 該SELECT語句相當(dāng)于定義了一個不可更新的視圖,嵌 入 式 SQL,8.1.1 嵌入式SQL的處理過程 8.1.2 嵌入式SQL語句與主語言之間的通信 8.1.3 不使用游標(biāo)的SQL語句 8.1.4 使用游標(biāo)的SQL語句 8.1.5 動態(tài)SQL 8.1.6 小結(jié),8.1.5 動態(tài)SQL,靜態(tài)嵌入式SQL 靜態(tài)嵌入式SQL語句能夠滿足一般要求 無法滿足要到執(zhí)行時才能夠確定要提交的SQL語句 動態(tài)嵌入式SQL 允許在程序運行過程中臨時“組裝”SQL語句 支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式,動態(tài)SQL簡介(續(xù)),一、使用SQL語句主

23、變量 二、動態(tài)參數(shù),一、使用SQL語句主變量,SQL語句主變量: 程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量 SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行,使用SQL語句主變量(續(xù)),例9 創(chuàng)建基本表TEST EXEC SQL BEGIN DECLARE SECTION; const char *stmt = CREATE TABLE test(a int); /* SQL語句主變量 */ EXEC SQL END DECLARE SECTION; . . EXEC SQL EXECUTE IMMEDIATE :stmt; /* 執(zhí)行語句

24、 */,二、動態(tài)參數(shù),動態(tài)參數(shù) SQL語句中的可變元素 使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運行時設(shè)定 和主變量的區(qū)別 動態(tài)參數(shù)的輸入不是編譯時完成綁定 而是通過 (prepare)語句準(zhǔn)備主變量和執(zhí)行(execute)時綁定數(shù)據(jù)或主變量來完成,動態(tài)參數(shù)(續(xù)),使用動態(tài)參數(shù)的步驟: 1.聲明SQL語句主變量。 2.準(zhǔn)備SQL語句(PREPARE)。 EXEC SQL PREPARE FROM ;,動態(tài)參數(shù)(續(xù)),使用動態(tài)參數(shù)的步驟(續(xù)): 3.執(zhí)行準(zhǔn)備好的語句(EXECUTE) EXEC SQL EXECUTE INTO USING ;,動態(tài)參數(shù)(續(xù)),例10向TEST中插入元組。 EXEC

25、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 100; /* 執(zhí)行語句 */ EXEC SQL EXECUTE mystmt USING 200; /* 執(zhí)行語句 */,8.1 嵌入式SQL,8.1.1 嵌入式SQL的處理過程 8.1.2

26、嵌入式SQL語句與主語言之間的通信 8.1.3 不使用游標(biāo)的SQL語句 8.1.4 使用游標(biāo)的SQL語句 8.1.5 動態(tài)SQL 8.1.6 小結(jié),8.1.6 小 結(jié),在嵌入式SQL中,SQL語句與主語言語句分工非常明確 SQL語句 直接與數(shù)據(jù)庫打交道,取出數(shù)據(jù)庫中的數(shù)據(jù)。 主語言語句 控制程序流程 對取出的數(shù)據(jù)做進一步加工處理,小結(jié)(續(xù)),SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄 主語言是面向記錄的,一組主變量一次只能存放一條記錄 僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求 嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式,第八章 數(shù)據(jù)庫

27、編程,8.1 嵌入式SQL 8.2 存儲過程 8.3 ODBC編程,8.2 存儲過程,SQL-invoked routines: 存儲過程(SQL-invoked procedure) 函數(shù)(SQL-invoked function),8.2 存儲過程,8.2.1 PL/SQL的塊結(jié)構(gòu) 8.2.2 變量常量的定義 8.2.3 控制結(jié)構(gòu) 8.2.4 存儲過程 8.2.5 小結(jié),8.2.1 PL/SQL的塊結(jié)構(gòu),PL/SQL : SQL的擴展 增加了過程化語句功能 基本結(jié)構(gòu)是塊 塊之間可以互相嵌套 每個塊完成一個邏輯操作,PL/SQL的塊結(jié)構(gòu)(續(xù)),PL/SOL塊的基本結(jié)構(gòu): 1.定義部分 DEC

28、LARE -變量、常量、游標(biāo)、異常等 定義的變量、常量等只能在該基本塊中使用 當(dāng)基本塊執(zhí)行結(jié)束時,定義就不再存在,PL/SQL的塊結(jié)構(gòu)(續(xù)),PL/SOL塊的基本結(jié)構(gòu)(續(xù)): 2.執(zhí)行部分 BEGIN -SQL語句、PL/SQL的流程控制語句 EXCEPTION -異常處理部分 END;,8.2 存儲過程,8.2.1 PL/SQL的塊結(jié)構(gòu) 8.2.2 變量常量的定義 8.2.3 控制結(jié)構(gòu) 8.2.4 存儲過程 8.2.5 小結(jié),8.2.2 變量常量的定義,1. PL/SQL中定義變量的語法形式是: 變量名 數(shù)據(jù)類型 NOT NULL:=初值表達式或 變量名 數(shù)據(jù)類型 NOT NULL初值表達式

29、 2. 常量的定義類似于變量的定義: 常量名 數(shù)據(jù)類型 CONSTANT :=常量表達式 常量必須要給一個值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,PL/SQL將返回一個異常。 3. 賦值語句 變量名稱:=表達式,8.2 存儲過程,8.2.1 PL/SQL的塊結(jié)構(gòu) 8.2.2 變量常量的定義 8.2.3 控制結(jié)構(gòu) 8.2.4 存儲過程 8.2.5 小結(jié),8.2.3 控制結(jié)構(gòu),PL/SQL 功能: 一、條件控制語句 二、循環(huán)控制語句 三、錯誤處理,控制結(jié)構(gòu)(續(xù)),一、 條件控制語句 IF-THEN, IF-THEN-ELSE和嵌套的IF語句 1. IF condition

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

31、OP語句塊能夠結(jié)束。,控制結(jié)構(gòu)(續(xù)),二、循環(huán)控制語句(續(xù)) 2. WHILE-LOOP WHILE condition LOOP Sequence_of_statements; END LOOP; 每次執(zhí)行循環(huán)體語句之前,首先對條件進行求值 如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語句序列。 如果條件為假,則跳過循環(huán)并把控制傳遞給下一個語句 3. FOR-LOOP FOR count IN REVERSEbound1 bound2 LOOP Sequence_of_statements; END LOOP;,控制結(jié)構(gòu)(續(xù)),三、錯誤處理: 如果PL/SQL在執(zhí)行時出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句

32、處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句 SQL標(biāo)準(zhǔn)對數(shù)據(jù)庫服務(wù)器提供什么樣的異常處理做出了建議,要求PL/SQL管理器提供完善的異常處理機制,8.2 存儲過程,8.2.1 PL/SQL的塊結(jié)構(gòu) 8.2.2 變量常量的定義 8.2.3 控制結(jié)構(gòu) 8.2.4 存儲過程 8.2.5 小結(jié),8.2.4 存儲過程,PL/SQL塊類型: 命名塊:編譯后保存在數(shù)據(jù)庫中,可以被反復(fù)調(diào)用,運行速度較快。存儲過程和函數(shù)是命名塊 匿名塊:每次執(zhí)行時都要進行編譯,它不能被存儲到數(shù)據(jù)庫中,也不能在其他的PL/SQL塊中調(diào)用,存儲過程(續(xù)),一、 存儲過程的優(yōu)點 二、 存儲過程的用戶接口 三、 游標(biāo),存儲過程(續(xù)),

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

34、體:是一個。包括聲明部分和可執(zhí)行語句部分,存儲過程的用戶接口(續(xù)),2. 執(zhí)行存儲過程: execute 過程名參數(shù)1值,參數(shù)2值,.),存儲過程的用戶接口(續(xù)),3. 刪除存儲過程 DROP PROCEDURE 過程名,三、游 標(biāo),在PL/SQL中,如果SELECT語句只返回一條記錄,可以將該結(jié)果存放到變量中。 當(dāng)查詢返回多條記錄時,就要使用游標(biāo)對結(jié)果集進行處理 一個游標(biāo)與一個SQL語句相關(guān)聯(lián)。 PL/SQL中的游標(biāo)由PL/SQL引擎管理,8.2 存儲過程,8.2.1 PL/SQL的塊結(jié)構(gòu) 8.2.2 變量常量的定義 8.2.3 控制結(jié)構(gòu) 8.2.4 存儲過程 8.2.5 小結(jié),8.2.5

35、小 結(jié),存儲過程的優(yōu)點 經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,運行效率高 降低客戶機和服務(wù)器之間的通信量 有利于集中控制,方便維護,第八章 數(shù)據(jù)庫編程,8.1 嵌入式SQL 8.2 存儲過程 8.3 ODBC編程,8.3 ODBC編程,ODBC優(yōu)點: 移植性好 能同時訪問不同的數(shù)據(jù)庫 共享多個數(shù)據(jù)資源,8.3 ODBC編程,8.3.1 數(shù)據(jù)庫互連概述 8.3.2 ODBC工作原理概述 8.3.3 ODBC API 基礎(chǔ) 8.3.4 ODBC的工作流程 8.3.5 小結(jié),8.3.1 數(shù)據(jù)庫互連概述,ODBC產(chǎn)生的原因: 由于不同的數(shù)據(jù)庫管理系統(tǒng)的存在,在某個RDBMS下編寫的應(yīng)用程序就不能在另一個

36、RDBMS下運行 許多應(yīng)用程序需要共享多個部門的數(shù)據(jù)資源,訪問不同的RDBMS,數(shù)據(jù)庫互連概述(續(xù)),ODBC: 是微軟公司開放服務(wù)體系(Windows Open Services Architecture,WOSA)中有關(guān)數(shù)據(jù)庫的一個組成部分 提供了一組訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)API ODBC約束力: 規(guī)范應(yīng)用開發(fā) 規(guī)范RDBMS應(yīng)用接口,8.3 ODBC編程,8.3.1 數(shù)據(jù)庫互連概述 8.3.2 ODBC工作原理概述 8.3.3 ODBC API 基礎(chǔ) 8.3.4 ODBC的工作流程 8.3.5 小結(jié),8.3.2 ODBC工作原理概述,ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu) : 一、 用戶應(yīng)用程序 二、 驅(qū)

37、動程序管理器 三、 數(shù)據(jù)庫驅(qū)動程序 四、 ODBC數(shù)據(jù)源管理,一、 應(yīng)用程序,ODBC應(yīng)用程序包括的內(nèi)容: 請求連接數(shù)據(jù)庫; 向數(shù)據(jù)源發(fā)送SQL語句; 為SQL語句執(zhí)行結(jié)果分配存儲空間,定義所讀取的數(shù)據(jù)格式; 獲取數(shù)據(jù)庫操作結(jié)果,或處理錯誤; 進行數(shù)據(jù)處理并向用戶提交處理結(jié)果; 請求事務(wù)的提交和回滾操作; 斷開與數(shù)據(jù)源的連接。,二、驅(qū)動程序管理器,驅(qū)動程序管理器:用來管理各種驅(qū)動程序 包含在ODBC32.DLL中 管理應(yīng)用程序和驅(qū)動程序之間的通信 建立、配置或刪除數(shù)據(jù)源并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫ODBC驅(qū)動程序 主要功能: 裝載ODBC驅(qū)動程序 選擇和連接正確的驅(qū)動程序 管理數(shù)據(jù)源 檢查OD

38、BC調(diào)用參數(shù)的合法性 記錄ODBC函數(shù)的調(diào)用等,三、數(shù)據(jù)庫驅(qū)動程序,ODBC通過驅(qū)動程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫平臺的獨立性 ODBC應(yīng)用程序不能直接存取數(shù)據(jù)庫 其各種操作請求由驅(qū)動程序管理器提交給某個RDBMS的ODBC驅(qū)動程序 通過調(diào)用驅(qū)動程序所支持的函數(shù)來存取數(shù)據(jù)庫。 數(shù)據(jù)庫的操作結(jié)果也通過驅(qū)動程序返回給應(yīng)用程序。 如果應(yīng)用程序要操縱不同的數(shù)據(jù)庫,就要動態(tài)地鏈接到不同的驅(qū)動程序上。,數(shù)據(jù)庫驅(qū)動程序(續(xù)),ODBC驅(qū)動程序類型: 單束 數(shù)據(jù)源和應(yīng)用程序在同一臺機器上 驅(qū)動程序直接完成對數(shù)據(jù)文件的I/O操作 驅(qū)動程序相當(dāng)于數(shù)據(jù)管理器 多束 支持客戶機/服務(wù)器、客戶機/應(yīng)用服務(wù)器/數(shù)據(jù)庫服務(wù)器等

39、網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)訪問 由驅(qū)動程序完成數(shù)據(jù)庫訪問請求的提交和結(jié)果集接收 應(yīng)用程序使用驅(qū)動程序提供的結(jié)果集管理接口操縱執(zhí)行后的結(jié)果數(shù)據(jù),四、ODBC數(shù)據(jù)源管理,數(shù)據(jù)源:是最終用戶需要訪問的數(shù)據(jù),包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,是一種數(shù)據(jù)連接的抽象 數(shù)據(jù)源對最終用戶是透明的 ODBC給每個被訪問的數(shù)據(jù)源指定唯一的數(shù)據(jù)源名(Data Source Name,簡稱DSN),并映射到所有必要的、用來存取數(shù)據(jù)的低層軟件 在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫名等 最終用戶無需知道DBMS或其他數(shù)據(jù)管理軟件、網(wǎng)絡(luò)以及有關(guān)ODBC驅(qū)動程序的細(xì)節(jié),ODBC數(shù)據(jù)源管理(續(xù)),例如,假設(shè)某個學(xué)

40、校在MS SQL Server和KingbaseES上創(chuàng)建了兩個數(shù)據(jù)庫:學(xué)校人事數(shù)據(jù)庫和教學(xué)科研數(shù)據(jù)庫。 學(xué)校的信息系統(tǒng)要從這兩個數(shù)據(jù)庫中存取數(shù)據(jù) 為方便與兩個數(shù)據(jù)庫連接,為學(xué)校人事數(shù)據(jù)庫創(chuàng)建一個數(shù)據(jù)源名PERSON,為教學(xué)科研數(shù)據(jù)庫創(chuàng)建一個名為EDU的數(shù)據(jù)源。 當(dāng)要訪問每一個數(shù)據(jù)庫時,只要與PERSON和EDU連接即可,不需要記住使用的驅(qū)動程序、服務(wù)器名稱、數(shù)據(jù)庫名,8.3 ODBC編程,8.3.1 數(shù)據(jù)庫互連概述 8.3.2 ODBC工作原理概述 8.3.3 ODBC API 基礎(chǔ) 8.3.4 ODBC的工作流程 8.3.5 小結(jié),8.3.3 ODBC API 基礎(chǔ),ODBC 應(yīng)用程序接口

41、的一致性 API一致性 API一致性級別有核心級、擴展1級、擴展2級 語法一致性 語法一致性級別有最低限度SQL語法級、核心SQL語法級、擴展SQL語法級,ODBC API 基礎(chǔ)(續(xù)),一、 函數(shù)概述 二、 句柄及其屬性 三、 數(shù)據(jù)類型,一、 函數(shù)概述,ODBC 3.0 標(biāo)準(zhǔn)提供了76個函數(shù)接口: 分配和釋放環(huán)境句柄、連接句柄、語句句柄; 連接函數(shù)(SQLDriverconnect等); 與信息相關(guān)的函數(shù)(如獲取描述信息函數(shù)SQLGetinfo、SQLGetFuction); 事務(wù)處理函數(shù)(如SQLEndTran); 執(zhí)行相關(guān)函數(shù)(SQLExecdirect、SQLExecute等); 編目函

42、數(shù),ODBC 3.0提供了11個編目函數(shù)如SQLTables、SQLColumn等,應(yīng)用程序可以通過對編目函數(shù)的調(diào)用來獲取數(shù)據(jù)字典的信息如權(quán)限、表結(jié)構(gòu)等,函數(shù)概述(續(xù)),ODBC 1.0和ODBC 2.x、ODBC 3.x函數(shù)使用上有很多差異 MFC ODBC對較復(fù)雜的ODBC API進行了封裝,提供了簡化的調(diào)用接口,二、 句柄及其屬性,句柄是32位整數(shù)值,代表一個指針 ODBC 3.0中句柄分類: 環(huán)境句柄 連接句柄 語句句柄 描述符句柄,句柄及其屬性(續(xù)),應(yīng)用程序句柄之間的關(guān)系,應(yīng)用程序句柄之間的關(guān)系,句柄及其屬性(續(xù)),1. 每個ODBC應(yīng)用程序需要建立一個ODBC環(huán)境,分配一個環(huán)境句

43、柄,存取數(shù)據(jù)的全局性背景如環(huán)境狀態(tài)、當(dāng)前環(huán)境狀態(tài)診斷、當(dāng)前在環(huán)境上分配的連接句柄等; 2. 一個環(huán)境句柄可以建立多個連接句柄,每一個連接句柄實現(xiàn)與一個數(shù)據(jù)源之間的連接;,句柄及其屬性(續(xù)),3. 在一個連接中可以建立多個語句句柄,它不只是一個SQL語句,還包括SQL語句產(chǎn)生的結(jié)果集以及相關(guān)的信息等; 4. 在ODBC 3.0中又提出了描述符句柄的概念,它是描述SQL語句的參數(shù)、結(jié)果集列的元數(shù)據(jù)集合。,三、 數(shù)據(jù)類型,ODBC數(shù)據(jù)類型: SQL數(shù)據(jù)類型:用于數(shù)據(jù)源 C數(shù)據(jù)類型 :用于應(yīng)用程序的C代碼 應(yīng)用程序可以通過SQLGetTypeInfo來獲取不同的驅(qū)動程序?qū)τ跀?shù)據(jù)類型的支持情況,數(shù)據(jù)類型

44、(續(xù)),SQL數(shù)據(jù)類型和C數(shù)據(jù)類型之間的轉(zhuǎn)換規(guī)則,8.3 ODBC編程,8.3.1 數(shù)據(jù)庫互連概述 8.3.2 ODBC工作原理概述 8.3.3 ODBC API 基礎(chǔ) 8.3.4 ODBC的工作流程 8.3.5 小結(jié),8.3.4 ODBC的工作流程,ODBC的工作流程:,ODBC的工作流程(續(xù)),例13將KingbaseES數(shù)據(jù)庫中Student表的數(shù)據(jù)備份到SQL SERVER數(shù)據(jù)庫中。 該應(yīng)用涉及兩個不同的RDBMS中的數(shù)據(jù)源 使用ODBC來開發(fā)應(yīng)用程序,只要改變應(yīng)用程序中連接函數(shù)(SQLConnect)的參數(shù),就可以連接不同RDBMS的驅(qū)動程序,連接兩個數(shù)據(jù)源,ODBC的工作流程(續(xù))

45、,在應(yīng)用程序運行前,已經(jīng)在KingbaseES和SQL SERVER中分別建立了STUDENT關(guān)系表 CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) UNQUE Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );,ODBC的工作流程(續(xù)),應(yīng)用程序要執(zhí)行的操作是: 在KingbaseES上執(zhí)行SELECT * FROM STUDENT; 把獲取的結(jié)果集,通過多次執(zhí)行 INSERT INTO STUDENT (Sno,Sname,Ssex,Sage,Sddept) VALUES

46、 (?, ?, ?, ?, ?); 插入到SQL SERVER的STUDENT表中,ODBC的工作流程(續(xù)),操作步驟: 一、 配置數(shù)據(jù)源 二、 初始化環(huán)境 三、 建立連接 四、 分配語句句柄 五、 執(zhí)行SQL語句 六、 結(jié)果集處理 七、 中止處理,一、 配置數(shù)據(jù)源,配置數(shù)據(jù)源兩種方法: 運行數(shù)據(jù)源管理工具來進行配置; 使用Driver Manager 提供的ConfigDsn函數(shù)來增加、修 改或刪除數(shù)據(jù)源 在例13中,采用了第一種方法創(chuàng)建數(shù)據(jù)源。因為要同時用到KingbaseES和SQL Server,所以分別建立兩個數(shù)據(jù)源,將其取名為KingbaseES ODBC和SQLServer。,配

47、置數(shù)據(jù)源(續(xù)),例13創(chuàng)建數(shù)據(jù)源的詳細(xì)過程 #include #include #include #include #include #include #define SNO_LEN 30 #define NAME_LEN 50 #define DEPART_LEN 100 #define SSEX_LEN 5,配置數(shù)據(jù)源(續(xù)),例13創(chuàng)建數(shù)據(jù)源-第一步:定義句柄和變量 int main() /* Step 1 定義句柄和變量 */ /以king開頭的表示的是連接KingbaseES的變量 /以server開頭的表示的是連接SQLSERVER的變量 SQLHENV kinghenv, serv

48、erhenv; /環(huán)境句柄 SQLHDBC kinghdbc,serverhdbc; /連接句柄 SQLHSTMT kinghstmt,serverhstmt; /語句句柄 SQLRETURNret; SQLCHAR sNameNAME_LEN,sDepartDEPART_LEN, sSexSSEX_LEN, sSnoSNO_LEN; SQLINTEGER sAge; SQLINTEGER cbAge=0, cbSno=SQL_NTS, cbSex=SQL_NTS, cbName=SQL_NTS,cbDepart=SQL_NTS;,二、初始化環(huán)境,沒有和具體的驅(qū)動程序相關(guān)聯(lián),由Driver M

49、anager來進行控制 ,并配置環(huán)境屬性 應(yīng)用程序通過調(diào)用連接函數(shù)和某個數(shù)據(jù)源進行連接后,Driver Manager才調(diào)用所連的驅(qū)動程序中的SQLAllocHandle,來真正分配環(huán)境句柄的數(shù)據(jù)結(jié)構(gòu),初始化環(huán)境代碼,例13創(chuàng)建數(shù)據(jù)源-第二步:初始化環(huán)境 /* Step 2 初始化環(huán)境 */ ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE, ,三、 建立連接,應(yīng)用程序調(diào)用SQLAllocHandle分配連接句柄,通過SQLConnect、SQLDriverConnect或SQLBrowseConnect與數(shù)據(jù)源連接 SQLConnect連接函

50、數(shù),輸入?yún)?shù)為: 配置好的數(shù)據(jù)源名稱 用戶ID 口令 例13中KingbaseES ODBC為數(shù)據(jù)源名字,SYSTEM為用戶名,MANAGER為用戶密碼,建立連接代碼,例13創(chuàng)建數(shù)據(jù)源-第三步:建立連接 /* Step 3 :建立連接 */ ret=SQLAllocHandle(SQL_HANDLE_DBC, kinghenv, ,四、分配語句句柄,處理任何SQL語句之前,應(yīng)用程序還需要首先分配一個語句句柄 語句句柄含有具體的SQL語句以及輸出的結(jié)果集等信息 例13中分配了兩個語句句柄: 一個用來從KingbaseES中讀取數(shù)據(jù)產(chǎn)生結(jié)果集(kinghstmt) 一個用來向SQLSERVER插入

51、數(shù)據(jù)(serverhstmt) 應(yīng)用程序還可以通過SQLtStmtAttr來設(shè)置語句屬性(也可以使用默認(rèn)值) 例13中結(jié)果集綁定的方式為按列綁定,分配語句句柄代碼,例13創(chuàng)建數(shù)據(jù)源-第四步 /* Step 4 :初始化語句句柄 */ ret=SQLAllocHandle(SQL_HANDLE_STMT, kinghdbc, ,五、 執(zhí)行SQL語句,應(yīng)用程序處理SQL語句的兩種方式: 預(yù)處理(SQLPrepare、SQLExecute適用于語句的多次執(zhí)行) 直接執(zhí)行(SQLExecdirect) 如果SQL語句含有參數(shù),應(yīng)用程序為每個參數(shù)調(diào)用SQLBindParameter,并把它們綁定至應(yīng)用程序變量 應(yīng)用程序可以直接通過改變應(yīng)用程序緩沖區(qū)的內(nèi)容從而在程序中動態(tài)的改變SQL語句的具體執(zhí)行,執(zhí)行SQL語句(續(xù)),應(yīng)用程序根據(jù)語句的類型進行的處理 有結(jié)果集的語句(select或是編目函數(shù)),則進行結(jié)果集處理。 沒有結(jié)果集的函數(shù),可以直接利用本語句句柄繼續(xù)執(zhí)行新的語句或是獲取行計數(shù)(本次執(zhí)行所影響的行數(shù))之后繼續(xù)執(zhí)行。 在例13中,使用SQLExecdirect獲取KingbaseES中的結(jié)果集,并將結(jié)果集根據(jù)各列不同的數(shù)據(jù)類型綁定到用戶程序緩沖區(qū) 在插入數(shù)據(jù)時,采用了預(yù)編譯的方式,首先通過SQLPrepare來預(yù)處理SQ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論