數(shù)據(jù)庫編程課件_第1頁
數(shù)據(jù)庫編程課件_第2頁
數(shù)據(jù)庫編程課件_第3頁
數(shù)據(jù)庫編程課件_第4頁
數(shù)據(jù)庫編程課件_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第八章數(shù)據(jù)庫編程8.1存儲過程8.2數(shù)據(jù)庫訪問技術(shù)8.3嵌入式SQLAnIntroductiontoDatabaseSystem第八章數(shù)據(jù)庫編程8.1存儲過程AnIntrodu8.3嵌入式SQLSQL語言提供了兩種不同的使用方式:交互式嵌入式(embeddedSQL)為什么要引入嵌入式SQLSQL語言是非過程性語言事務(wù)處理應(yīng)用需要高級語言這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計的環(huán)境下,SQL語句要做某些必要的擴充AnIntroductiontoDatabaseSystem8.3嵌入式SQLSQL語言提供了兩種不同的使用方式:An8.3嵌入式SQL8.3.1嵌入式SQL的處理過程8.3.2嵌入式SQL語句與主語言之間的通信8.3.3動態(tài)SQL8.3.4小結(jié)AnIntroductiontoDatabaseSystem8.3嵌入式SQL8.3.1嵌入式SQL的處理過程AnI8.1.1嵌入式SQL的處理過程宿主語言嵌入式SQL是將SQL語句嵌入程序設(shè)計語言中,被嵌入的程序設(shè)計語言,如C、C++、Java,稱為宿主語言,簡稱主語言。處理過程預(yù)編譯方法AnIntroductiontoDatabaseSystem8.1.1嵌入式SQL的處理過程宿主語言AnIntrod嵌入式SQL的處理過程(續(xù))為了區(qū)分SQL語句與主語言語句,所有SQL語句必須加前綴EXECSQL,以(;)結(jié)束:EXECSQL<SQL語句>;AnIntroductiontoDatabaseSystem嵌入式SQL的處理過程(續(xù))為了區(qū)分SQL語句與主語言語句8.3嵌入式SQL8.3.1嵌入式SQL的處理過程8.3.2嵌入式SQL語句與主語言之間的通信8.3.3動態(tài)SQL8.3.4小結(jié)AnIntroductiontoDatabaseSystem8.3嵌入式SQL8.3.1嵌入式SQL的處理過程AnI嵌入式SQL語句分類AnIntroductiontoDatabaseSystem嵌入式SQL語句分類AnIntroductiontoD嵌入式SQL語句說明性部分(在C語言中)AnIntroductiontoDatabaseSystem嵌入式SQL語句說明性部分(在C語言中)AnIntrodu8.3.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句SQL語句描述性的面向集合的語句負(fù)責(zé)操縱數(shù)據(jù)庫高級語言語句過程性的面向記錄的語句負(fù)責(zé)控制程序流程它們之間應(yīng)該如何通信?AnIntroductiontoDatabaseSystem8.3.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到嵌入式SQL語句與主語言之間的通信(續(xù))數(shù)據(jù)庫工作單元與源程序工作單元之間的通信:1.SQL通信區(qū)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息使主語言能夠據(jù)此控制程序流程2.宿主變量主語言向SQL語句提供參數(shù)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進一步處理3.游標(biāo)解決集合性操作語言與過程性操作語言的不匹配AnIntroductiontoDatabaseSystem嵌入式SQL語句與主語言之間的通信(續(xù))數(shù)據(jù)庫工作單元與源一、SQL通信區(qū)SQLCA:SQLCommunicationAreaSQLCA是一個數(shù)據(jù)結(jié)構(gòu)SQLCA的用途SQL語句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息描述系統(tǒng)當(dāng)前工作狀態(tài)描述運行環(huán)境這些信息將送到SQL通信區(qū)SQLCA中應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句AnIntroductiontoDatabaseSystem一、SQL通信區(qū)SQLCA:SQLCommunicatiSQL通信區(qū)SQLCA使用方法:定義SQLCA

用EXECSQLINCLUDESQLCA定義使用SQLCASQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯應(yīng)用程序每執(zhí)行完一條SQL語句之后都應(yīng)該測試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理AnIntroductiontoDatabaseSystemSQL通信區(qū)SQLCA使用方法:AnIntroductioSQL通信區(qū)小結(jié)AnIntroductiontoDatabaseSystemSQL通信區(qū)小結(jié)AnIntroductiontoDat二、宿主變量宿主變量嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)在SQL語句中使用的主語言程序變量簡稱為宿主變量(HostVariable)AnIntroductiontoDatabaseSystem二、宿主變量宿主變量AnIntroductionto宿主變量(續(xù))

宿主變量的類型輸入宿主變量輸出宿主變量一個宿主變量有可能既是輸入宿主變量又是輸出宿主變量AnIntroductiontoDatabaseSystem宿主變量(續(xù))宿主變量的類型AnIntroduction宿主變量(續(xù))

指示變量:一個宿主變量可以附帶一個指示變量(IndicatorVariable)什么是指示變量指示變量的用途AnIntroductiontoDatabaseSystem宿主變量(續(xù))指示變量:AnIntroductiont宿主變量(續(xù))

在SQL語句中使用宿主變量和指示變量的方法1)說明宿主變量和指示變量BEGINDECLARESECTION ......... .........(說明宿主變量和指示變量) .........ENDDECLARESECTIONAnIntroductiontoDatabaseSystem宿主變量(續(xù))在SQL語句中使用宿主變量和指示變量的方法A宿主變量(續(xù))[例1]AnIntroductiontoDatabaseSystem宿主變量(續(xù))[例1]AnIntroductionto宿主變量(續(xù))

2)使用宿主變量說明之后的宿主變量可以在SQL語句中任何一個能夠使用表達式的地方出現(xiàn)為了與數(shù)據(jù)庫對象名(表名、視圖名、列名等)區(qū)別,SQL語句中的宿主變量名前要加冒號(:)作為標(biāo)志3)使用指示變量指示變量前也必須加冒號標(biāo)志必須緊跟在所指宿主變量之后AnIntroductiontoDatabaseSystem宿主變量(續(xù))2)使用宿主變量AnIntroducti宿主變量(續(xù))

在SQL語句之外(主語言語句中)使用宿主變量和指示變量的方法可以直接引用,不必加冒號AnIntroductiontoDatabaseSystem宿主變量(續(xù))在SQL語句之外(主語言語句中)使用宿主變量三、游標(biāo)(cursor)為什么要使用游標(biāo)SQL語言與主語言具有不同數(shù)據(jù)處理方式SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄主語言是面向記錄的,一組宿主變量一次只能存放一條記錄僅使用宿主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式AnIntroductiontoDatabaseSystem三、游標(biāo)(cursor)為什么要使用游標(biāo)AnIntrodu游標(biāo)(續(xù))游標(biāo)游標(biāo)是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果每個游標(biāo)區(qū)都有一個名字用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給宿主變量,交由主語言進一步處理AnIntroductiontoDatabaseSystem游標(biāo)(續(xù))游標(biāo)AnIntroductiontoDat嵌入式SQL語句可執(zhí)行部分嵌入式DDL,QL,DML,DCLConnect語句格式EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];

target是要連接的數(shù)據(jù)庫服務(wù)器:常見的服務(wù)器標(biāo)識串,如<dbname>@<hostname>:<port>包含服務(wù)器標(biāo)識的SQL串常量DEFAULTconnect-name是可選的連接名,連接必須是一個有效的標(biāo)識符AnIntroductiontoDatabaseSystem嵌入式SQL語句可執(zhí)行部分嵌入式DDL,QL,DML,DCL嵌入式SQL語句可執(zhí)行部分(續(xù))插入語句返回單個值的選擇語句

AnIntroductiontoDatabaseSystem嵌入式SQL語句可執(zhí)行部分(續(xù))插入語句AnIntrodu嵌入式SQL語句可執(zhí)行部分(續(xù))返回一組值的選擇語句AnIntroductiontoDatabaseSystem嵌入式SQL語句可執(zhí)行部分(續(xù))返回一組值的選擇語句AnI嵌入式SQL語句可執(zhí)行部分(續(xù))返回一組值的選擇語句AnIntroductiontoDatabaseSystem嵌入式SQL語句可執(zhí)行部分(續(xù))返回一組值的選擇語句AnI嵌入式SQL語句可執(zhí)行部分(續(xù))返回一組值的選擇語句AnIntroductiontoDatabaseSystem嵌入式SQL語句可執(zhí)行部分(續(xù))返回一組值的選擇語句AnI返回一組值的選擇語句[例2]AnIntroductiontoDatabaseSystem返回一組值的選擇語句[例2]AnIntroduction程序?qū)嵗齕例3]依次檢查某個系的學(xué)生記錄,交互式更新某些學(xué)生年齡。EXECSQLBEGINDECLARESECTION;/*宿主變量說明開始*/ chardeptname[64]; charHSno[64]; charHSname[64]; charHSsex[64]; int HSage; int NEWAGE;EXECSQLENDDECLARESECTION;/*宿主變量說明結(jié)束*/EXECSQLINCLUDEsqlca;/*定義SQL通信區(qū)*/AnIntroductiontoDatabaseSystem程序?qū)嵗齕例3]依次檢查某個系的學(xué)生記錄,交互式更新某些學(xué)生intmain(void)/*C語言主程序開始*/{ int count=0; charyn;/*變量yn代表yes或no*/ printf("Pleasechoosethedepartmentname(CS/MA/IS):"); scanf("%s",deptname);/*為宿主變量deptname賦值*/ EXECSQLCONNECTTOTEST@localhost:54321USER"SYSTEM"/"MANAGER";/*連接數(shù)據(jù)庫TEST*/ EXECSQLDECLARESXCURSORFOR/*定義游標(biāo)*/ SELECTSno,Sname,Ssex,Sage/*SX對應(yīng)語句的執(zhí)行結(jié)果*/ FROMStudent WHERESDept=:deptname; EXECSQLOPENSX;/*打開游標(biāo)SX便指向查詢結(jié)果的第一行*/AnIntroductiontoDatabaseSystemintmain(void)for(;;) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/{ EXECSQLFETCHSXINTO:HSno,:HSname,:HSsex,:HSage; /*推進游標(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%-10s\n","Sno","Sname","Ssex","Sage"); printf("%-10s%-20s%-10s%-10d\n",HSno,HSname,HSsex,HSage); /*打印查詢結(jié)果*/ printf("UPDATEAGE(y/n)?");/*詢問用戶是否要更新該學(xué)生的年齡*/ do{ scanf("%c",&yn); } while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y');

AnIntroductiontoDatabaseSystemfor(;;)

if(yn=='y'||yn=='Y')/*如果選擇更新操作*/ { printf("INPUTNEWAGE:"); scanf("%d",&NEWAGE);/*用戶輸入新年齡到宿主變量中*/ EXECSQLUPDATEStudent /*嵌入式SQL*/ SETSage=:NEWAGE WHERECURRENTOFSX; }/*對當(dāng)前游標(biāo)指向的學(xué)生年齡進行更新*/}EXECSQLCLOSESX;/*關(guān)閉游標(biāo)SX不再和查詢結(jié)果對應(yīng)*/ EXECSQLCOMMITWORK;/*提交更新*/ EXECSQLDISCONNECTTEST;/*斷開數(shù)據(jù)庫連接*/}AnIntroductiontoDatabaseSystem if(yn=='y'||yn=='Y')小結(jié)AnIntroductiontoDatabaseSystem小結(jié)AnIntroductiontoDatabase8.3嵌入式SQL8.3.1嵌入式SQL的處理過程8.3.2嵌入式SQL語句與主語言之間的通信8.3.3動態(tài)SQL8.3.4小結(jié)AnIntroductiontoDatabaseSystem8.3嵌入式SQL8.3.1嵌入式SQL的處理過程AnI8.3.3動態(tài)SQL靜態(tài)嵌入式SQL靜態(tài)嵌入式SQL語句能夠滿足一般要求無法滿足要到執(zhí)行時才能夠確定要提交的SQL語句動態(tài)嵌入式SQL允許在程序運行過程中臨時“組裝”SQL語句支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式AnIntroductiontoDatabaseSystem8.3.3動態(tài)SQL靜態(tài)嵌入式SQLAnIntrodu動態(tài)SQL簡介(續(xù))一、使用SQL語句宿主變量(直接執(zhí)行)二、動態(tài)參數(shù)三、查詢類AnIntroductiontoDatabaseSystem動態(tài)SQL簡介(續(xù))一、使用SQL語句宿主變量(直接執(zhí)行)一、使用SQL語句宿主變量AnIntroductiontoDatabaseSystem一、使用SQL語句宿主變量AnIntroductiont使用SQL語句宿主變量(續(xù))[例4]創(chuàng)建基本表TESTEXECSQLBEGINDECLARESECTION;constchar*stmt="CREATETABLEtest(aint);";/*SQL語句宿主變量*/EXECSQLENDDECLARESECTION;......EXECSQLEXECUTEIMMEDIATE:stmt; /*執(zhí)行語句*/AnIntroductiontoDatabaseSystem使用SQL語句宿主變量(續(xù))[例4]創(chuàng)建基本表TESTA使用SQL語句宿主變量(續(xù))[例5]AnIntroductiontoDatabaseSystem使用SQL語句宿主變量(續(xù))[例5]AnIntroduct二、動態(tài)參數(shù)AnIntroductiontoDatabaseSystem二、動態(tài)參數(shù)AnIntroductiontoDatab動態(tài)參數(shù)(續(xù))動態(tài)參數(shù)SQL語句中的可變元素使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運行時設(shè)定和宿主變量的區(qū)別動態(tài)參數(shù)的輸入不是編譯時完成綁定而是通過(prepare)語句準(zhǔn)備宿主變量和執(zhí)行(execute)時綁定數(shù)據(jù)或宿主變量來完成AnIntroductiontoDatabaseSystem動態(tài)參數(shù)(續(xù))動態(tài)參數(shù)AnIntroductionto動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟: 1.聲明SQL語句宿主變量。

2.準(zhǔn)備SQL語句(PREPARE)。

EXECSQLPREPARE<語句名>FROM<SQL語句宿主變量>;

AnIntroductiontoDatabaseSystem動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟:AnIntroducti動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟(續(xù)):3.執(zhí)行準(zhǔn)備好的語句(EXECUTE)

EXECSQLEXECUTE<語句名>[INTO<宿主變量表>][USING< 宿主變量或常量>];AnIntroductiontoDatabaseSystem動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟(續(xù)):AnIntrodu動態(tài)參數(shù)(續(xù))[例6]向TEST中插入元組。EXECSQLBEGINDECLARESECTION;constchar*stmt="INSERTINTOtestVALUES(?);";/*聲明SQL宿主變量*/EXECSQLENDDECLARESECTION;......EXECSQLPREPAREmystmtFROM:stmt;/*準(zhǔn)備語句*/......EXECSQLEXECUTEmystmtUSING100;/*執(zhí)行語句*/EXECSQLEXECUTEmystmtUSING200;/*執(zhí)行語句*/AnIntroductiontoDatabas

溫馨提示

  • 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

提交評論