版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、8.1 嵌入式嵌入式SQL SQL語言提供了兩種不同的使用方式: 交互式 嵌入式 為什么要引入嵌入式SQL SQL語言是非過程性語言 事務(wù)處理應(yīng)用需要高級語言 這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計的環(huán)境下,SQL語句要做某些必要的擴(kuò)充第1頁/共138頁8.1 嵌入式嵌入式SQL嵌入式嵌入式SQL的處理過程的處理過程嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信不使用游標(biāo)的不使用游標(biāo)的SQL語句語句使用游標(biāo)的使用游標(biāo)的SQL語句語句動態(tài)動態(tài)SQL小結(jié)小結(jié)第2頁/共138頁嵌入式嵌入式SQL的處理過程的處理過程 主語言 嵌入式SQL是將SQL語句嵌入程序設(shè)計語言中,被嵌入的程序設(shè)計語
2、言,如C、C+、Java,稱為宿主語言,簡稱主語言。 處理過程 預(yù)編譯方法第3頁/共138頁嵌入式嵌入式SQL的處理過程(續(xù))的處理過程(續(xù)) 主語言程序 含ESQL語句RDBMS的預(yù)處理程序ESQL語句轉(zhuǎn)換為函數(shù)調(diào)用主語言編譯程序目標(biāo)語言程序ESQL基本處理過程第4頁/共138頁嵌入式嵌入式SQL的處理過程(續(xù))的處理過程(續(xù)) 為了區(qū)分SQL語句與主語言語句, 所有SQL語句必須加前綴EXEC SQL,以(;)結(jié)束: EXEC SQL ;第5頁/共138頁8.1 嵌入式嵌入式SQL嵌入式嵌入式SQL的處理過程的處理過程嵌入式嵌入式SQL與主語言的通信與主語言的通信不使用游標(biāo)的不使用游標(biāo)的S
3、QL語句語句使用游標(biāo)的使用游標(biāo)的SQL語句語句動態(tài)動態(tài)SQL小結(jié)小結(jié)第6頁/共138頁嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信 將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句nSQL語句 描述性的面向集合的語句 負(fù)責(zé)操縱數(shù)據(jù)庫n高級語言語句 過程性的面向記錄的語句 負(fù)責(zé)控制程序流程n它們之間應(yīng)該如何通信?第7頁/共138頁嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信(續(xù))(續(xù)) 數(shù)據(jù)庫工作單元與源程序工作單元之間的通信:n1. SQL通信區(qū) 向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息 使主語言能夠據(jù)此控制程序流程n2. 主變量 主語言向S
4、QL語句提供參數(shù) 將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進(jìn)一步處理n3. 游標(biāo) 解決集合性操作語言與過程性操作語言的不匹配第8頁/共138頁一、一、SQL通信區(qū)通信區(qū) SQLCA: SQL Communication AreanSQLCA是一個數(shù)據(jù)結(jié)構(gòu) SQLCA的用途nSQL語句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息 描述系統(tǒng)當(dāng)前工作狀態(tài) 描述運行環(huán)境n這些信息將送到SQL通信區(qū)SQLCA中n應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句第9頁/共138頁SQL通信區(qū)通信區(qū) SQLCA使用方法: 定義SQLCA 用EXEC SQL INCLUDE SQLCA定義 使用SQLCA
5、SQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯應(yīng)用程序每執(zhí)行完一條SQL 語句之后都應(yīng)該測試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理第10頁/共138頁二、主變量二、主變量 主變量 嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù) 在SQL語句中使用的主語言程序變量簡稱為主變量(Host Variable)第11頁/共138頁主變量(續(xù))主變量(續(xù)) 主變量的類型 輸入主變量 輸出主變量 一個主變量有可能既是輸入主變量又是輸出主變量第12頁/共138頁主變
6、量(續(xù))主變量(續(xù)) 指示變量: 一個主變量可以附帶一個指示變量(Indicator Variable) 什么是指示變量 指示變量的用途第13頁/共138頁主變量(續(xù))主變量(續(xù)) 在SQL語句中使用主變量和指示變量的方法 1) 說明主變量和指示變量BEGIN DECLARE SECTION. . (說明主變量和指示變量).END DECLARE SECTION第14頁/共138頁主變量(續(xù))主變量(續(xù)) 2) 使用主變量 說明之后的主變量可以在SQL語句中任何一個能夠使用表達(dá)式的地方出現(xiàn) 為了與數(shù)據(jù)庫對象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(:)作為標(biāo)志 3) 使
7、用指示變量 指示變量前也必須加冒號標(biāo)志 必須緊跟在所指主變量之后第15頁/共138頁主變量(續(xù))主變量(續(xù)) 在SQL語句之外(主語言語句中)使用主變量和指示變量的方法 可以直接引用,不必加冒號第16頁/共138頁三、游標(biāo)(三、游標(biāo)(cursor) 為什么要使用游標(biāo) SQL語言與主語言具有不同數(shù)據(jù)處理方式 SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄 主語言是面向記錄的,一組主變量一次只能存放一條記錄 僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求 嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式第17頁/共138頁 游標(biāo)(續(xù))游標(biāo)(續(xù)) 游標(biāo) 游
8、標(biāo)是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果 每個游標(biāo)區(qū)都有一個名字 用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理第18頁/共138頁四、建立和關(guān)閉數(shù)據(jù)庫連接四、建立和關(guān)閉數(shù)據(jù)庫連接 建立數(shù)據(jù)庫連接 EXEC SQL CONNECT TO target AS connection-name USER user-name; target是要連接的數(shù)據(jù)庫服務(wù)器:l常見的服務(wù)器標(biāo)識串,如: l包含服務(wù)器標(biāo)識的SQL串常量 lDEFAULT connect-name是可選的連接名,連接必須是一個有效的標(biāo)識符 在整個程序內(nèi)只有一個連接時可以不指定連接名 關(guān)
9、閉數(shù)據(jù)庫連接 EXEC SQL DISCONNECT connection; 程序運行過程中可以修改當(dāng)前連接 :EXEC SQL SET CONNECTION connection-name | DEFAULT;第19頁/共138頁五、程序?qū)嵗?、程序?qū)嵗?依次檢查某個系的學(xué)生記錄,交互式更新某些學(xué)生年齡。EXEC SQL BEGIN DEC LARE SECTION; /*主變量說明開始*/ char deptname64;char HSno64;char HSname64; char HSsex64;int HSage;intNEWAGE;EXEC SQL END DECLARE SEC
10、TION; /*主變量說明結(jié)束*/long SQLCODE;EXEC SQL INCLUDE sqlca; /*定義SQL通信區(qū)*/第20頁/共138頁程序?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 SYSTE
11、M /MANAGER; /*連接數(shù)據(jù)庫TEST*/EXEC SQL DECLARE SX CURSOR FOR /*定義游標(biāo)*/SELECT Sno, Sname, Ssex, Sage /*SX對應(yīng)語句的執(zhí)行結(jié)果*/FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; /*打開游標(biāo)SX便指向查詢結(jié)果的第一行*/第21頁/共138頁程序?qū)嵗ɡm(xù))程序?qū)嵗ɡm(xù))for ( ; ; ) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/ EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage; /*推進(jìn)游
12、標(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)?); /*詢問用戶是否要更新該學(xué)
13、生的年齡*/ do scanf(%c,&yn); while(yn != N & yn != n & yn != Y & yn != y);第22頁/共138頁程序?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 ; /*對當(dāng)前游標(biāo)指向的學(xué)生年齡進(jìn)行更新
14、*/ EXEC SQL CLOSE SX; /*關(guān)閉游標(biāo)SX不再和查詢結(jié)果對應(yīng)*/EXEC SQL COMMIT WORK; /*提交更新*/EXEC SQL DISCONNECT TEST; /*斷開數(shù)據(jù)庫連接*/第23頁/共138頁8.1 嵌入式嵌入式SQL嵌入式嵌入式SQL的處理過程的處理過程嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信不使用游標(biāo)的不使用游標(biāo)的SQL語句語句使用游標(biāo)的使用游標(biāo)的SQL語句語句動態(tài)動態(tài)SQL小結(jié)小結(jié)第24頁/共138頁不用游標(biāo)的不用游標(biāo)的SQL語句語句 不用游標(biāo)的SQL語句的種類 說明性語句 數(shù)據(jù)定義語句 數(shù)據(jù)控制語句 查詢結(jié)果為單記錄的S
15、ELECT語句 非CURRENT形式的增刪改語句 第25頁/共138頁不用游標(biāo)的不用游標(biāo)的SQL語句(續(xù))語句(續(xù)) 一、查詢結(jié)果為單記錄的SELECT語句 二、非CURRENT形式的增刪改語句第26頁/共138頁一、查詢結(jié)果為單記錄的一、查詢結(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,:Hdep
16、t FROM Student WHERE Sno=:givensno;第27頁/共138頁查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語句(續(xù))語句(續(xù))(1) INTO子句、WHERE子句和HAVING短語的條件表達(dá)式中均可以使用主變量(2)查詢返回的記錄中,可能某些列為空值NULL。(3) 如果查詢結(jié)果實際上并不是單條記錄,而是多條記錄,則程序出錯,RDBMS會在SQLCA中返回錯誤信息 第28頁/共138頁查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語句(續(xù))語句(續(xù))例3 查詢某個學(xué)生選修某門課程的成績。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號賦給了主變量givensno,將課程號賦給了
17、主變量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)榭罩?。為何值,均認(rèn)為該學(xué)生成績?yōu)榭罩?。?9頁/共138頁二、非二、非CURRENT形式的增刪改語句形式的增刪改語句 在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量 例4 修改某個學(xué)生選修1號課程的成績。E
18、XEC SQL UPDATE SC SET Grade=:newgrade /*修改的成績已賦給主變量*/ WHERE Sno=:givensno; /*學(xué)號賦給主變量givensno*/ 第30頁/共138頁非非CURRENT形式的增刪改語句(續(xù))形式的增刪改語句(續(xù))例5 將計算機(jī)系全體學(xué)生年齡置NULL值。 Sageid=-1; EXEC SQL UPDATE Student SET Sage=:Raise :Sageid WHERE Sdept= CS; 將指示變量Sageid賦一個負(fù)值后,無論主變量Raise為何值,RDBMS都會將CS系所有學(xué)生的年齡置空值 。等價于: EXEC S
19、QL UPDATE Student SET Sage=NULL WHERE Sdept= CS;第31頁/共138頁非非CURRENT形式的增刪改語句(續(xù))形式的增刪改語句(續(xù))例6 某個學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已賦給主變量stdname。 EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname=:stdname); 第32頁/共138頁非非CURRENT形式的增刪改語句(續(xù))形式的增刪改語句(續(xù))例7 某個學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號已
20、賦給主變量stdno,課程號已賦給主變量couno。 gradeid=-1; /*用作指示變量,賦為負(fù)值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); 由于該學(xué)生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負(fù)值由于該學(xué)生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負(fù)值 第33頁/共138頁8.1 嵌入式嵌入式SQL 嵌入式嵌入式SQL的處理過程的處理過程 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信 不使用游標(biāo)的不使用游標(biāo)的SQL語句語句 使用游標(biāo)的使用游標(biāo)的SQL語句語
21、句 動態(tài)動態(tài)SQL 小結(jié)小結(jié)第34頁/共138頁使用游標(biāo)的使用游標(biāo)的SQL語句語句必須使用游標(biāo)的SQL語句查詢結(jié)果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句第35頁/共138頁使用游標(biāo)的使用游標(biāo)的SQL語句(續(xù))語句(續(xù)) 一、 查詢結(jié)果為多條記錄的SELECT語句 二、CURRENT形式的UPDATE和DELETE語句第36頁/共138頁一、一、 查詢結(jié)果為多條記錄的查詢結(jié)果為多條記錄的SELECT語句語句 使用游標(biāo)的步驟1. 說明游標(biāo)2. 打開游標(biāo)3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄 4. 關(guān)閉游標(biāo)第37頁/共138頁1. 說明游標(biāo)說明游標(biāo)
22、 使用DECLARE語句 語句格式EXEC SQL DECLARE CURSOR FOR ; 功能 是一條說明性語句,這時DBMS并不執(zhí)行SELECT指定的查詢操作。第38頁/共138頁2. 打開游標(biāo)打開游標(biāo) 使用OPEN語句 語句格式 EXEC SQL OPEN ; 功能 打開游標(biāo)實際上是執(zhí)行相應(yīng)的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中 這時游標(biāo)處于活動狀態(tài),指針指向查詢結(jié)果集中第一條記錄第39頁/共138頁3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄推進(jìn)游標(biāo)指針并取當(dāng)前記錄 使用FETCH語句 語句格式 EXEC SQL FETCH NEXT|PRIOR| FIRST|LAST F
23、ROM INTO ,.;第40頁/共138頁推進(jìn)游標(biāo)指針并取當(dāng)前記錄(續(xù))推進(jìn)游標(biāo)指針并取當(dāng)前記錄(續(xù)) 功能 指定方向推動游標(biāo)指針,然后將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理 NEXT|PRIOR|FIRST|LAST:指定推動游標(biāo)指針的方式 NEXT:向前推進(jìn)一條記錄 PRIOR:向回退一條記錄 FIRST:推向第一條記錄 LAST:推向最后一條記錄 缺省值為NEXT第41頁/共138頁4. 關(guān)閉游標(biāo)關(guān)閉游標(biāo) 使用CLOSE語句 語句格式 EXEC SQL CLOSE ; 功能 關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源 說明 游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系
24、被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果相聯(lián)系第42頁/共138頁二、二、CURRENT形式的形式的UPDATE語句和語句和DELETE語句語句 CURRENT形式的UPDATE語句和DELETE語句的用途 面向集合的操作 一次修改或刪除所有滿足條件的記錄第43頁/共138頁CURRENT形式的形式的UPDATE語句和語句和DELETE語句語句(續(xù)續(xù)) 如果只想修改或刪除其中某個記錄 用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄 從中進(jìn)一步找出要修改或刪除的記錄 用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之 UPDATE語句和DELETE語句中的子句: WHERE
25、 CURRENT OF 表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄 第44頁/共138頁CURRENT形式的形式的UPDATE語句和語句和DELETE語句語句(續(xù)續(xù)) 不能使用CURRENT形式的UPDATE語句和DELETE語句 : 當(dāng)游標(biāo)定義中的SELECT語句帶有UNION或ORDER BY子句 該SELECT語句相當(dāng)于定義了一個不可更新的視圖 第45頁/共138頁嵌嵌 入入 式式 SQL 嵌入式嵌入式SQL的處理過程的處理過程 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信 不使用游標(biāo)的不使用游標(biāo)的SQL語句語句 使用游標(biāo)的使用游標(biāo)的SQL語句語句 動態(tài)
26、動態(tài)SQL 小結(jié)小結(jié)第46頁/共138頁動態(tài)動態(tài)SQL 靜態(tài)嵌入式SQL 靜態(tài)嵌入式SQL語句能夠滿足一般要求 無法滿足要到執(zhí)行時才能夠確定要提交的SQL語句 動態(tài)嵌入式SQL 允許在程序運行過程中臨時“組裝”SQL語句 支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式 第47頁/共138頁動態(tài)動態(tài)SQL簡介(續(xù))簡介(續(xù)) 一、使用SQL語句主變量 二、動態(tài)參數(shù)第48頁/共138頁一、使用一、使用SQL語句主變量語句主變量 SQL語句主變量: 程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量 SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行 第49頁/共
27、138頁使用使用SQL語句主變量(續(xù))語句主變量(續(xù))例9 創(chuàng)建基本表TESTEXEC SQL BEGIN DECLARE SECTION;const char *stmt = CREATE TABLE test(a int); /* SQL語句主變量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL EXECUTE IMMEDIATE :stmt; /* 執(zhí)行語句 */第50頁/共138頁二、動態(tài)參數(shù)二、動態(tài)參數(shù) 動態(tài)參數(shù) SQL語句中的可變元素 使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運行時設(shè)定 和主變量的區(qū)別 動態(tài)參數(shù)的輸入不是編譯時完成綁定 而是通過 (
28、prepare)語句準(zhǔn)備主變量和執(zhí)行(execute)時綁定數(shù)據(jù)或主變量來完成 第51頁/共138頁動態(tài)參數(shù)(續(xù))動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟:1.聲明SQL語句主變量。2.準(zhǔn)備SQL語句(PREPARE)。 EXEC SQL PREPARE FROM ;第52頁/共138頁動態(tài)參數(shù)(續(xù))動態(tài)參數(shù)(續(xù)) 使用動態(tài)參數(shù)的步驟(續(xù)): 3.執(zhí)行準(zhǔn)備好的語句(EXECUTE)EXEC SQL EXECUTE INTO USING ;第53頁/共138頁動態(tài)參數(shù)(續(xù))動態(tài)參數(shù)(續(xù))例10向TEST中插入元組。EXEC SQL BEGIN DECLARE SECTION;const char *st
29、mt = 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í)行語句 */第54頁/共138頁8.1 嵌入式嵌入式SQL嵌入式嵌入式SQL的處理過程的處理過程嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信不使用游標(biāo)的不使用游
30、標(biāo)的SQL語句語句使用游標(biāo)的使用游標(biāo)的SQL語句語句動態(tài)動態(tài)SQL小結(jié)小結(jié)第55頁/共138頁小小 結(jié)結(jié) 在嵌入式SQL中,SQL語句與主語言語句分工非常明確 SQL語句直接與數(shù)據(jù)庫打交道,取出數(shù)據(jù)庫中的數(shù)據(jù)。 主語言語句控制程序流程對取出的數(shù)據(jù)做進(jìn)一步加工處理第56頁/共138頁小結(jié)(續(xù))小結(jié)(續(xù)) SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄 主語言是面向記錄的,一組主變量一次只能存放一條記錄 僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求 嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式第57頁/共138頁第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8
31、.1 嵌入式嵌入式SQL8.2 存儲過程存儲過程8.3 ODBC編程編程第58頁/共138頁8.2 存儲過程存儲過程 SQL-invoked routines: 存儲過程(SQL-invoked procedure) 函數(shù)(SQL-invoked function)第59頁/共138頁8.2 存儲過程存儲過程的塊結(jié)構(gòu)的塊結(jié)構(gòu)變量常量的定義變量常量的定義控制結(jié)構(gòu)控制結(jié)構(gòu)存儲過程存儲過程小結(jié)小結(jié)第60頁/共138頁的塊結(jié)構(gòu)的塊結(jié)構(gòu) PL/SQL : SQL的擴(kuò)展 增加了過程化語句功能 基本結(jié)構(gòu)是塊 塊之間可以互相嵌套 每個塊完成一個邏輯操作 第61頁/共138頁PL/SQL的塊結(jié)構(gòu)(續(xù))的塊結(jié)構(gòu)(
32、續(xù)) PL/SOL塊的基本結(jié)構(gòu):塊的基本結(jié)構(gòu): 1.定義部分定義部分 DECLARE -變量、常量、游標(biāo)、異常等 n定義的變量、常量等只能在該基本塊中使用n當(dāng)基本塊執(zhí)行結(jié)束時,定義就不再存在第62頁/共138頁PL/SQL的塊結(jié)構(gòu)(續(xù))的塊結(jié)構(gòu)(續(xù)) PL/SOL塊的基本結(jié)構(gòu)塊的基本結(jié)構(gòu)(續(xù)續(xù)): 2.執(zhí)行部分執(zhí)行部分 BEGIN -SQL語句、PL/SQL的流程控制語句 EXCEPTION -異常處理部分 END;第63頁/共138頁8.2 存儲過程存儲過程的塊結(jié)構(gòu)的塊結(jié)構(gòu)變量常量的定義變量常量的定義控制結(jié)構(gòu)控制結(jié)構(gòu)存儲過程存儲過程小結(jié)小結(jié)第64頁/共138頁變量常量的定義變量常量的定義1.
33、 PL/SQL中定義變量的語法形式是中定義變量的語法形式是: 變量名 數(shù)據(jù)類型 NOT NULL:=初值表達(dá)式或 變量名 數(shù)據(jù)類型 NOT NULL初值表達(dá)式2. 常量的定義類似于變量的定義常量的定義類似于變量的定義: 常量名 數(shù)據(jù)類型 CONSTANT :=常量表達(dá)式 常量必須要給一個值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,PL/SQL將返回一個異常。3. 賦值語句賦值語句 變量名稱:=表達(dá)式第65頁/共138頁8.2 存儲過程存儲過程的塊結(jié)構(gòu)的塊結(jié)構(gòu)變量常量的定義變量常量的定義控制結(jié)構(gòu)控制結(jié)構(gòu)存儲過程存儲過程小結(jié)小結(jié)第66頁/共138頁控制結(jié)構(gòu)控制結(jié)構(gòu) PL/SQL
34、 功能:功能:一、條件控制語句二、循環(huán)控制語句 三、錯誤處理 第67頁/共138頁控制結(jié)構(gòu)(續(xù))控制結(jié)構(gòu)(續(xù)) 一、一、 條件控制語句條件控制語句 IF-THEN, IF-THEN-ELSE和嵌套的和嵌套的IF語句語句 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語句,即IF語句可以嵌套 第68頁/共138頁控制結(jié)構(gòu)(續(xù))控
35、制結(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é)束。第69頁/共138頁控制結(jié)構(gòu)(續(xù))控制結(jié)構(gòu)(續(xù))二、循環(huán)控制語句(續(xù))二、循環(huán)控制語句(續(xù))2. WHILE-LOOP WHILE condition LOOP Sequence_of_statements;END LOOP;n每次執(zhí)行循環(huán)體語句之前,首先對條件進(jìn)
36、行求值n如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語句序列。n如果條件為假,則跳過循環(huán)并把控制傳遞給下一個語句 3. FOR-LOOP FOR count IN REVERSEbound1 bound2 LOOP Sequence_of_statements;END LOOP;第70頁/共138頁控制結(jié)構(gòu)(續(xù))控制結(jié)構(gòu)(續(xù)) 三、錯誤處理: 如果PL/SQL在執(zhí)行時出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句 SQL標(biāo)準(zhǔn)對數(shù)據(jù)庫服務(wù)器提供什么樣的異常處理做出了建議,要求PL/SQL管理器提供完善的異常處理機(jī)制 第71頁/共138頁8.2 存儲過程存儲過程 的塊結(jié)構(gòu)的塊結(jié)
37、構(gòu) 變量常量的定義變量常量的定義 控制結(jié)構(gòu)控制結(jié)構(gòu) 存儲過程存儲過程 小結(jié)小結(jié)第72頁/共138頁存儲過程存儲過程 PL/SQL塊類型: 命名塊:編譯后保存在數(shù)據(jù)庫中,可以被反復(fù)調(diào)用,運行速度較快。存儲過程和函數(shù)是命名塊 匿名塊:每次執(zhí)行時都要進(jìn)行編譯,它不能被存儲到數(shù)據(jù)庫中,也不能在其他的PL/SQL塊中調(diào)用 第73頁/共138頁存儲過程(續(xù))存儲過程(續(xù)) 一、 存儲過程的優(yōu)點 二、 存儲過程的用戶接口 三、 游標(biāo) 第74頁/共138頁存儲過程(續(xù))存儲過程(續(xù)) 存儲過程:由PL/SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,使用時只要調(diào)用即可。 一、存儲過程的優(yōu)點:1. 運
38、行效率高2. 降低了客戶機(jī)和服務(wù)器之間的通信量 3. 方便實施企業(yè)規(guī)則第75頁/共138頁存儲過程(續(xù))存儲過程(續(xù)) 二、 存儲過程的用戶接口:1. 創(chuàng)建存儲過程 2. 執(zhí)行存儲過程 3. 刪除存儲過程 第76頁/共138頁二、二、 存儲過程的用戶接口存儲過程的用戶接口 1. 創(chuàng)建存儲過程:創(chuàng)建存儲過程:CREATE Procedure 過程名(參數(shù)1,參數(shù)2,.) AS;n過程名:數(shù)據(jù)庫服務(wù)器合法的對象標(biāo)識n參數(shù)列表:用名字來標(biāo)識調(diào)用時給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù)。默認(rèn)為輸入?yún)?shù)。n過程體:是一個。包括聲明部分和可執(zhí)行語句部分 第77
39、頁/共138頁存儲過程的用戶接口(續(xù))存儲過程的用戶接口(續(xù))例11 利用存儲過程來實現(xiàn)下面的應(yīng)用: 從一個賬戶轉(zhuǎn)指定數(shù)額的款項到另一個賬戶中。 CREATE PROCEDURE TRANSFER(inAccount INT, outAccount INT, amount FLOAT) AS DECLARE totalDeposit FLOAT; BEGIN /* 檢查轉(zhuǎn)出賬戶的余額 * SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM=outAccount; IF totalDeposit IS NULL THEN /*
40、 賬戶不存在或賬戶中沒有存款 */ ROLLBACK; RETURN; END IF; 第78頁/共138頁存儲過程的用戶接口(續(xù))存儲過程的用戶接口(續(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=total + amount WHERE ACCOUNTNUM=inAccount;
41、 /* 修改轉(zhuǎn)入賬戶,增加轉(zhuǎn)出額 */COMMIT; /* 提交轉(zhuǎn)賬事務(wù) */END;第79頁/共138頁存儲過程的用戶接口(續(xù))存儲過程的用戶接口(續(xù)) 重命名存儲過程 ALTER Procedure 過程名1 RENAME TO 過程名2;第80頁/共138頁存儲過程的用戶接口(續(xù))存儲過程的用戶接口(續(xù)) 2. 執(zhí)行存儲過程:執(zhí)行存儲過程: CALL/PERFORM Procedure 過程名(參數(shù)1,參數(shù)2,.);n使用CALL或者PERFORM等方式激活存儲過程的執(zhí)行。n在PL/SQL中,數(shù)據(jù)庫服務(wù)器支持在過程體中調(diào)用其他存儲過程例12從賬戶轉(zhuǎn)一萬元到賬戶中。 CALL Proced
42、ure TRANSFER(01003813828,10000); 第81頁/共138頁存儲過程的用戶接口(續(xù))存儲過程的用戶接口(續(xù))3. 刪除存儲過程 DROP PROCEDURE 過程名();第82頁/共138頁三、游三、游 標(biāo)標(biāo) 在PL/SQL中,如果SELECT語句只返回一條記錄,可以將該結(jié)果存放到變量中。 當(dāng)查詢返回多條記錄時,就要使用游標(biāo)對結(jié)果集進(jìn)行處理 一個游標(biāo)與一個SQL語句相關(guān)聯(lián)。 PL/SQL中的游標(biāo)由PL/SQL引擎管理 第83頁/共138頁8.2 存儲過程存儲過程 的塊結(jié)構(gòu)的塊結(jié)構(gòu) 變量常量的定義變量常量的定義 控制結(jié)構(gòu)控制結(jié)構(gòu) 存儲過程存儲過程 小結(jié)小結(jié)第84頁/共1
43、38頁小小 結(jié)結(jié) 存儲過程的優(yōu)點 經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,運行效率高 降低客戶機(jī)和服務(wù)器之間的通信量 有利于集中控制,方便維護(hù) 第85頁/共138頁第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1 嵌入式嵌入式SQL8.2 存儲過程存儲過程8.3 ODBC編程編程第86頁/共138頁8.3 ODBC編程編程 ODBC優(yōu)點: 移植性好 能同時訪問不同的數(shù)據(jù)庫 共享多個數(shù)據(jù)資源 第87頁/共138頁8.3 ODBC編程編程 數(shù)據(jù)庫互連概述數(shù)據(jù)庫互連概述 工作原理概述工作原理概述 基礎(chǔ)基礎(chǔ) 的工作流程的工作流程 小結(jié)小結(jié)第88頁/共138頁數(shù)據(jù)庫互連概述數(shù)據(jù)庫互連概述 ODBC產(chǎn)生的原因:產(chǎn)生的
44、原因: 由于不同的數(shù)據(jù)庫管理系統(tǒng)的存在,在某個RDBMS下編寫的應(yīng)用程序就不能在另一個RDBMS下運行 許多應(yīng)用程序需要共享多個部門的數(shù)據(jù)資源,訪問不同的RDBMS 第89頁/共138頁數(shù)據(jù)庫互連概述(續(xù))數(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)用接口第90頁/共138頁8.3 ODBC編程編程 數(shù)據(jù)庫互連概述數(shù)據(jù)庫互連概述 工作原理概述工作原理概述 基礎(chǔ)基礎(chǔ) 的工作流程的工作流程
45、 小結(jié)小結(jié)第91頁/共138頁工作原理概述工作原理概述 ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu) :一、一、 用戶應(yīng)用程序用戶應(yīng)用程序 二、二、 驅(qū)動程序管理器驅(qū)動程序管理器 三、三、 數(shù)據(jù)庫驅(qū)動程序數(shù)據(jù)庫驅(qū)動程序四、四、 ODBC數(shù)據(jù)源管理數(shù)據(jù)源管理 第92頁/共138頁一、一、 應(yīng)用程序應(yīng)用程序 ODBC應(yīng)用程序包括的內(nèi)容應(yīng)用程序包括的內(nèi)容: 請求連接數(shù)據(jù)庫; 向數(shù)據(jù)源發(fā)送SQL語句; 為SQL語句執(zhí)行結(jié)果分配存儲空間,定義所讀取的數(shù)據(jù)格式; 獲取數(shù)據(jù)庫操作結(jié)果,或處理錯誤; 進(jìn)行數(shù)據(jù)處理并向用戶提交處理結(jié)果; 請求事務(wù)的提交和回滾操作; 斷開與數(shù)據(jù)源的連接。 第93頁/共138頁二、驅(qū)動程序管理器二、
46、驅(qū)動程序管理器 驅(qū)動程序管理器:用來管理各種驅(qū)動程序 包含在ODBC32.DLL中 管理應(yīng)用程序和驅(qū)動程序之間的通信 建立、配置或刪除數(shù)據(jù)源并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫ODBC驅(qū)動程序 主要功能:裝載ODBC驅(qū)動程序選擇和連接正確的驅(qū)動程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的合法性記錄ODBC函數(shù)的調(diào)用等 第94頁/共138頁三、數(shù)據(jù)庫驅(qū)動程序三、數(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ū)動程序返
47、回給應(yīng)用程序。 如果應(yīng)用程序要操縱不同的數(shù)據(jù)庫,就要動態(tài)地鏈接到不同的驅(qū)動程序上。 第95頁/共138頁數(shù)據(jù)庫驅(qū)動程序(續(xù))數(shù)據(jù)庫驅(qū)動程序(續(xù)) ODBC驅(qū)動程序類型: 單束數(shù)據(jù)源和應(yīng)用程序在同一臺機(jī)器上驅(qū)動程序直接完成對數(shù)據(jù)文件的I/O操作驅(qū)動程序相當(dāng)于數(shù)據(jù)管理器 多束 支持客戶機(jī)/服務(wù)器、客戶機(jī)/應(yīng)用服務(wù)器/數(shù)據(jù)庫服務(wù)器等網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)訪問由驅(qū)動程序完成數(shù)據(jù)庫訪問請求的提交和結(jié)果集接收應(yīng)用程序使用驅(qū)動程序提供的結(jié)果集管理接口操縱執(zhí)行后的結(jié)果數(shù)據(jù) 第96頁/共138頁四、四、ODBC數(shù)據(jù)源管理數(shù)據(jù)源管理 數(shù)據(jù)源:是最終用戶需要訪問的數(shù)據(jù),包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,是一種數(shù)據(jù)連接的
48、抽象 數(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é)第97頁/共138頁ODBC數(shù)據(jù)源管理(續(xù))數(shù)據(jù)源管理(續(xù))例如,假設(shè)某個學(xué)校在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ù)源名PER
49、SON,為教學(xué)科研數(shù)據(jù)庫創(chuàng)建一個名為EDU的數(shù)據(jù)源。 當(dāng)要訪問每一個數(shù)據(jù)庫時,只要與PERSON和EDU連接即可,不需要記住使用的驅(qū)動程序、服務(wù)器名稱、數(shù)據(jù)庫名 第98頁/共138頁8.3 ODBC編程編程 數(shù)據(jù)庫互連概述數(shù)據(jù)庫互連概述 工作原理概述工作原理概述 基礎(chǔ)基礎(chǔ) 的工作流程的工作流程 小結(jié)小結(jié)第99頁/共138頁基礎(chǔ)基礎(chǔ) ODBC 應(yīng)用程序接口的一致性 API一致性 API一致性級別有核心級、擴(kuò)展1級、擴(kuò)展2級 語法一致性 語法一致性級別有最低限度SQL語法級、核心SQL語法級、擴(kuò)展SQL語法級 第100頁/共138頁ODBC API 基礎(chǔ)(續(xù))基礎(chǔ)(續(xù)) 一、 函數(shù)概述 二、 句柄
50、及其屬性 三、 數(shù)據(jù)類型第101頁/共138頁一、一、 函數(shù)概述函數(shù)概述 ODBC 3.0 標(biāo)準(zhǔn)提供了標(biāo)準(zhǔn)提供了76個函數(shù)接口:個函數(shù)接口: 分配和釋放環(huán)境句柄、連接句柄、語句句柄; 連接函數(shù)(SQLDriverconnect等); 與信息相關(guān)的函數(shù)(如獲取描述信息函數(shù)SQLGetinfo、SQLGetFuction); 事務(wù)處理函數(shù)(如SQLEndTran); 執(zhí)行相關(guān)函數(shù)(SQLExecdirect、SQLExecute等); 編目函數(shù),ODBC 3.0提供了11個編目函數(shù)如SQLTables、SQLColumn等,應(yīng)用程序可以通過對編目函數(shù)的調(diào)用來獲取數(shù)據(jù)字典的信息如權(quán)限、表結(jié)構(gòu)等 第1
51、02頁/共138頁函數(shù)概述(續(xù))函數(shù)概述(續(xù)) ODBC 1.0和ODBC 2.x、ODBC 3.x函數(shù)使用上有很多差異 MFC ODBC對較復(fù)雜的ODBC API進(jìn)行了封裝,提供了簡化的調(diào)用接口 第103頁/共138頁二、二、 句柄及其屬性句柄及其屬性 句柄是32位整數(shù)值,代表一個指針 ODBC 3.0中句柄分類: 環(huán)境句柄 連接句柄 語句句柄 描述符句柄 第104頁/共138頁句柄及其屬性(續(xù))句柄及其屬性(續(xù)) 應(yīng)用程序句柄之間的關(guān)系 應(yīng)用程序句柄之間的關(guān)系 第105頁/共138頁句柄及其屬性(續(xù))句柄及其屬性(續(xù))1. 每個ODBC應(yīng)用程序需要建立一個ODBC環(huán)境,分配一個環(huán)境句柄,存
52、取數(shù)據(jù)的全局性背景如環(huán)境狀態(tài)、當(dāng)前環(huán)境狀態(tài)診斷、當(dāng)前在環(huán)境上分配的連接句柄等;2. 一個環(huán)境句柄可以建立多個連接句柄,每一個連接句柄實現(xiàn)與一個數(shù)據(jù)源之間的連接;第106頁/共138頁句柄及其屬性(續(xù))句柄及其屬性(續(xù))3. 在一個連接中可以建立多個語句句柄,它不只是一個SQL語句,還包括SQL語句產(chǎn)生的結(jié)果集以及相關(guān)的信息等;4. 在ODBC 3.0中又提出了描述符句柄的概念,它是描述SQL語句的參數(shù)、結(jié)果集列的元數(shù)據(jù)集合。第107頁/共138頁三、三、 數(shù)據(jù)類型數(shù)據(jù)類型 ODBC數(shù)據(jù)類型: SQL數(shù)據(jù)類型:用于數(shù)據(jù)源 C數(shù)據(jù)類型 :用于應(yīng)用程序的C代碼 應(yīng)用程序可以通過SQLGetTypeI
53、nfo來獲取不同的驅(qū)動程序?qū)τ跀?shù)據(jù)類型的支持情況 第108頁/共138頁數(shù)據(jù)類型(續(xù))數(shù)據(jù)類型(續(xù))SQL數(shù)據(jù)類型C數(shù)據(jù)類型SQL數(shù)據(jù)類型數(shù)據(jù)源之間轉(zhuǎn)換應(yīng)用程序變量傳送到語句參數(shù)(SQLBindparameter)C數(shù)據(jù)類型從結(jié)果集列中返回到應(yīng)用程序變量(SQLBindcol)應(yīng)用程序變量之間轉(zhuǎn)換SQL數(shù)據(jù)類型和C數(shù)據(jù)類型之間的轉(zhuǎn)換規(guī)則第109頁/共138頁8.3 ODBC編程編程 數(shù)據(jù)庫互連概述數(shù)據(jù)庫互連概述 工作原理概述工作原理概述 基礎(chǔ)基礎(chǔ) 的工作流程的工作流程 小結(jié)小結(jié)第110頁/共138頁的工作流程的工作流程 ODBC的工作流程:的工作流程:第111頁/共138頁ODBC的工作流程(
54、續(xù))的工作流程(續(xù))例13將KingbaseES數(shù)據(jù)庫中Student表的數(shù)據(jù)備份到SQL SERVER數(shù)據(jù)庫中。n該應(yīng)用涉及兩個不同的RDBMS中的數(shù)據(jù)源n使用ODBC來開發(fā)應(yīng)用程序,只要改變應(yīng)用程序中連接函數(shù)(SQLConnect)的參數(shù),就可以連接不同RDBMS的驅(qū)動程序,連接兩個數(shù)據(jù)源第112頁/共138頁ODBC的工作流程(續(xù))的工作流程(續(xù))n 在應(yīng)用程序運行前,已經(jīng)在KingbaseES和SQL SERVER中分別建立了STUDENT關(guān)系表 CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) UNQUE S
55、sex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );第113頁/共138頁ODBC的工作流程(續(xù))的工作流程(續(xù)) 應(yīng)用程序要執(zhí)行的操作是: 在KingbaseES上執(zhí)行SELECT * FROM STUDENT; 把獲取的結(jié)果集,通過多次執(zhí)行 INSERT INTO STUDENT (Sno,Sname,Ssex,Sage,Sddept) VALUES (?, ?, ?, ?, ?); 插入到SQL SERVER的STUDENT表中 第114頁/共138頁ODBC的工作流程(續(xù))的工作流程(續(xù)) 操作步驟:一、 配置數(shù)據(jù)源二、 初始化環(huán)境三、 建立連接
56、四、 分配語句句柄五、 執(zhí)行SQL語句六、 結(jié)果集處理七、 中止處理第115頁/共138頁一、一、 配置數(shù)據(jù)源配置數(shù)據(jù)源配置數(shù)據(jù)源兩種方法: 運行數(shù)據(jù)源管理工具來進(jìn)行配置; 使用Driver Manager 提供的ConfigDsn函數(shù)來增加、修 改或刪除數(shù)據(jù)源在例13中,采用了第一種方法創(chuàng)建數(shù)據(jù)源。因為要同時用到KingbaseES和SQL Server,所以分別建立兩個數(shù)據(jù)源,將其取名為KingbaseES ODBC和SQLServer。 第116頁/共138頁配置數(shù)據(jù)源(續(xù))配置數(shù)據(jù)源(續(xù))例13創(chuàng)建數(shù)據(jù)源的詳細(xì)過程 #include #include #include #include
57、 #include #include #define SNO_LEN 30#define NAME_LEN 50#define DEPART_LEN 100#define SSEX_LEN 5第117頁/共138頁配置數(shù)據(jù)源(續(xù))配置數(shù)據(jù)源(續(xù))例13創(chuàng)建數(shù)據(jù)源-第一步:定義句柄和變量int main()/* Step 1 定義句柄和變量 */以king開頭的表示的是連接KingbaseES的變量/以server開頭的表示的是連接SQLSERVER的變量SQLHENV kinghenv, serverhenv; /環(huán)境句柄SQLHDBC kinghdbc,serverhdbc; /連接句柄SQ
58、LHSTMT 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;第118頁/共138頁二、初始化環(huán)境二、初始化環(huán)境 沒有和具體的驅(qū)動程序相關(guān)聯(lián),由Driver Manager來進(jìn)行控制 ,并配置環(huán)境屬性 應(yīng)用程序通過調(diào)用連接函數(shù)和某個數(shù)據(jù)源進(jìn)
59、行連接后,Driver Manager才調(diào)用所連的驅(qū)動程序中的SQLAllocHandle,來真正分配環(huán)境句柄的數(shù)據(jù)結(jié)構(gòu) 第119頁/共138頁初始化環(huán)境代碼例13創(chuàng)建數(shù)據(jù)源-第二步:初始化環(huán)境/* Step 2 初始化環(huán)境 */ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE, &kinghenv);ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE, &serverhenv);ret=SQLSetEnvAttr(kinghenv, SQL_ATTR_ODBC_VERSION,
60、(void*)SQL_OV_ODBC3, 0);ret=SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);第120頁/共138頁三、三、 建立連接建立連接 應(yīng)用程序調(diào)用SQLAllocHandle分配連接句柄,通過SQLConnect、SQLDriverConnect或SQLBrowseConnect與數(shù)據(jù)源連接 SQLConnect連接函數(shù),輸入?yún)?shù)為: 配置好的數(shù)據(jù)源名稱 用戶ID 口令 例13中KingbaseES ODBC為數(shù)據(jù)源名字,SYSTEM為用戶名,MANAGER為用戶密碼 第121頁/共138頁建立連接代碼建立連接代碼例13創(chuàng)建數(shù)據(jù)源-第三步:建立連接/* Step 3 :建立連接 */ret=S
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度水陸聯(lián)運貨物保險及運輸合同
- 二零二五年度新能源儲能技術(shù)聘用合同8篇
- 二零二四年度信息化設(shè)備融資租賃管理合同3篇
- 課件:正確認(rèn)識高職院校內(nèi)部質(zhì)量保證體系診斷與改進(jìn)
- 二零二五年度牧草生物質(zhì)能項目合作協(xié)議4篇
- 2025版農(nóng)家樂民宿租賃管理服務(wù)合同2篇
- 二零二五版年薪制勞動合同:房地產(chǎn)企業(yè)銷售精英激勵方案4篇
- 第三單元 資產(chǎn)階級民主革命與中華民國的建立(解析版)- 2023-2024學(xué)年八年級歷史上學(xué)期期中考點大串講(部編版)
- 2025年度個人家政服務(wù)分期支付合同范本2篇
- 二零二五年度地鐵車站安全門系統(tǒng)采購合同
- 2024年蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 人教版初中語文2022-2024年三年中考真題匯編-學(xué)生版-專題08 古詩詞名篇名句默寫
- 2024-2025學(xué)年人教版(2024)七年級(上)數(shù)學(xué)寒假作業(yè)(十二)
- 山西粵電能源有限公司招聘筆試沖刺題2025
- ESG表現(xiàn)對企業(yè)財務(wù)績效的影響研究
- 醫(yī)療行業(yè)軟件系統(tǒng)應(yīng)急預(yù)案
- 使用錯誤評估報告(可用性工程)模版
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫附答案
- 2024年4月浙江省00015英語二試題及答案含評分參考
- 黑枸杞生物原液應(yīng)用及產(chǎn)業(yè)化項目可行性研究報告
- 2024年黑龍江省政工師理論知識考試參考題庫(含答案)
評論
0/150
提交評論