版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)庫(kù)系統(tǒng)原理
第11講數(shù)據(jù)庫(kù)編程標(biāo)準(zhǔn)SQL是非過(guò)程化的查詢語(yǔ)言
優(yōu)點(diǎn):具有操作統(tǒng)一、面向集合、功能豐富、使用簡(jiǎn)單的優(yōu)點(diǎn);
缺點(diǎn):缺少流程控制能力,難于實(shí)現(xiàn)應(yīng)用業(yè)務(wù)中的邏輯控制。SQL編程技術(shù)可以需要克服SQL語(yǔ)言實(shí)現(xiàn)應(yīng)用方面的不足第11講
數(shù)據(jù)庫(kù)編程1
嵌入式SQL2存儲(chǔ)過(guò)程3
ODBC編程§11.1嵌入式SQL為什么要引入嵌入式SQLSQL語(yǔ)言是非過(guò)程性語(yǔ)言事務(wù)處理應(yīng)用需要高級(jí)語(yǔ)言這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語(yǔ)句要做某些必要的擴(kuò)充§11.1嵌入式SQL1.嵌入式SQL的處理過(guò)程2.嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信3.不使用游標(biāo)的SQL語(yǔ)句4.使用游標(biāo)的SQL語(yǔ)句5.動(dòng)態(tài)SQL§11.1.1嵌入式SQL的處理過(guò)程主語(yǔ)言嵌入式SQL是將SQL語(yǔ)句嵌入程序設(shè)計(jì)語(yǔ)言中,被嵌入的程序設(shè)計(jì)語(yǔ)言,如C、C++、Java,稱為宿主語(yǔ)言,簡(jiǎn)稱主語(yǔ)言。處理過(guò)程預(yù)編譯方法:由RDBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識(shí)別出ESQL語(yǔ)句,把它們轉(zhuǎn)換成主語(yǔ)言調(diào)用語(yǔ)句,以使主語(yǔ)言編譯程序能識(shí)別它們,然后由主語(yǔ)言編譯程序?qū)⒓兊淖≌Z(yǔ)言程序編譯成目標(biāo)代碼,如下圖所示?!?1.1.1嵌入式SQL的處理過(guò)程主語(yǔ)言程序含ESQL語(yǔ)句RDBMS的預(yù)處理程序ESQL語(yǔ)句轉(zhuǎn)換為函數(shù)調(diào)用主語(yǔ)言編譯程序目標(biāo)語(yǔ)言程序ESQL基本處理過(guò)程§11.1.1嵌入式SQL的處理過(guò)程為了區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句,所有SQL語(yǔ)句必須加前綴EXECSQL,以(;)結(jié)束:EXECSQL<SQL語(yǔ)句>;§11.1.2嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信將SQL嵌入到高級(jí)語(yǔ)言中混合編程,程序中會(huì)含有兩種不同計(jì)算模型的語(yǔ)句SQL語(yǔ)句描述性的面向集合的語(yǔ)句負(fù)責(zé)操縱數(shù)據(jù)庫(kù)高級(jí)語(yǔ)言語(yǔ)句過(guò)程性的面向記錄的語(yǔ)句負(fù)責(zé)控制程序流程它們之間應(yīng)該如何通信?§11.1.2嵌入式SQL語(yǔ)句與主語(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ǔ)言進(jìn)一步處理3.游標(biāo)解決集合性操作語(yǔ)言與過(guò)程性操作語(yǔ)言的不匹配1)SQL通信區(qū)SQLCA:SQLCommunicationAreaSQLCA是一個(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ù)此決定接下來(lái)執(zhí)行的語(yǔ)句1)SQL通信區(qū)SQLCA使用方法:定義SQLCA
用EXECSQLINCLUDESQLCA定義使用SQLCASQLCA中有一個(gè)存放每次執(zhí)行SQL語(yǔ)句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語(yǔ)句成功,否則表示出錯(cuò)應(yīng)用程序每執(zhí)行完一條SQL語(yǔ)句之后都應(yīng)該測(cè)試一下SQLCODE的值,以了解該SQL語(yǔ)句執(zhí)行情況并做相應(yīng)處理2)主變量
主變量嵌入式SQL語(yǔ)句中可以使用主語(yǔ)言的程序變量來(lái)輸入或輸出數(shù)據(jù)在SQL語(yǔ)句中使用的主語(yǔ)言程序變量簡(jiǎn)稱為主變量(HostVariable)主變量的類型輸入主變量:由應(yīng)用程序?qū)ζ滟x值,SQL語(yǔ)句引用;輸出主變量:又SQL語(yǔ)句對(duì)其賦值或者設(shè)置狀態(tài)信息,返回給應(yīng)用程序;一個(gè)主變量有可能既是輸入主變量又是輸出主變量2)主變量指示變量:一個(gè)主變量可以附帶一個(gè)指示變量(IndicatorVariable)什么是指示變量:是一個(gè)整型變量,用來(lái)指示所指主變量的值或者條件;指示變量的用途:可以指示輸入主變量是否為空值,可以檢測(cè)輸出主變量是否為空值,值是否被截?cái)唷?)主變量在SQL語(yǔ)句中使用主變量和指示變量的方法(1)
說(shuō)明主變量和指示變量
BEGINDECLARESECTION ......... .........(說(shuō)明主變量和指示變量) .........ENDDECLARESECTION2)主變量(2)使用主變量說(shuō)明之后的主變量可以在SQL語(yǔ)句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn)為了與數(shù)據(jù)庫(kù)對(duì)象名(表名、視圖名、列名等)區(qū)別,SQL語(yǔ)句中的主變量名前要加冒號(hào)(:)作為標(biāo)志(3)
使用指示變量
指示變量前也必須加冒號(hào)標(biāo)志必須緊跟在所指主變量之后在SQL語(yǔ)句之外(主語(yǔ)言語(yǔ)句中)使用主變量和指示變量的方法可以直接引用,不必加冒號(hào)3)游標(biāo)(cursor)為什么要使用游標(biāo)
SQL語(yǔ)言與主語(yǔ)言具有不同數(shù)據(jù)處理方式SQL語(yǔ)言是面向集合的,一條SQL語(yǔ)句原則上可以產(chǎn)生或處理多條記錄主語(yǔ)言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語(yǔ)句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標(biāo)的概念,用來(lái)協(xié)調(diào)這兩種不同的處理方式
3)游標(biāo)游標(biāo)游標(biāo)是系統(tǒng)為用戶開(kāi)設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語(yǔ)句的執(zhí)行結(jié)果每個(gè)游標(biāo)區(qū)都有一個(gè)名字用戶可以用SQL語(yǔ)句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語(yǔ)言進(jìn)一步處理4)建立和關(guān)閉數(shù)據(jù)庫(kù)連接建立數(shù)據(jù)庫(kù)連接
EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];
target是要連接的數(shù)據(jù)庫(kù)服務(wù)器:常見(jiàn)的服務(wù)器標(biāo)識(shí)串,如<dbname>@<hostname>:<port>包含服務(wù)器標(biāo)識(shí)的SQL串常量DEFAULTconnect-name是可選的連接名,連接必須是一個(gè)有效的標(biāo)識(shí)符在整個(gè)程序內(nèi)只有一個(gè)連接時(shí)可以不指定連接名關(guān)閉數(shù)據(jù)庫(kù)連接
EXECSQLDISCONNECT[connection];程序運(yùn)行過(guò)程中可以修改當(dāng)前連接:
EXECSQLSETCONNECTIONconnection-name|DEFAULT;嵌入式SQL嵌入式SQL的處理過(guò)程嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信不使用游標(biāo)的SQL語(yǔ)句使用游標(biāo)的SQL語(yǔ)句動(dòng)態(tài)SQL不用游標(biāo)的SQL語(yǔ)句不用游標(biāo)的SQL語(yǔ)句的種類說(shuō)明性語(yǔ)句數(shù)據(jù)定義語(yǔ)句數(shù)據(jù)控制語(yǔ)句查詢結(jié)果為單記錄的SELECT語(yǔ)句非CURRENT形式的增刪改語(yǔ)句不用游標(biāo)的SQL語(yǔ)句一、查詢結(jié)果為單記錄的SELECT語(yǔ)句二、非CURRENT形式的增刪改語(yǔ)句一、查詢結(jié)果為單記錄的SELECT語(yǔ)句(1)這類語(yǔ)句不需要使用游標(biāo),只需要用INTO子句指定存放查詢結(jié)果的主變量【例】根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。假設(shè)已經(jīng)把要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno。EXECSQLSELECTSno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROMStudentWHERESno=:givensno;一、查詢結(jié)果為單記錄的SELECT語(yǔ)句(2)(1)INTO子句、WHERE子句和HAVING短語(yǔ)的條件表達(dá)式中均可以使用主變量(2)查詢返回的記錄中,可能某些列為空值NULL。(3)如果查詢結(jié)果實(shí)際上并不是單條記錄,而是多條記錄,則程序出錯(cuò),RDBMS會(huì)在SQLCA中返回錯(cuò)誤信息一、查詢結(jié)果為單記錄的SELECT語(yǔ)句(3)【例】查詢某個(gè)學(xué)生選修某門課程的成績(jī)。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno,將課程號(hào)賦給了主變量givencno。
EXECSQLSELECTSno,Cno,GradeINTO:Hsno,:Hcno,:Hgrade:Gradeid/*指示變量Gradeid*/FROMSCWHERESno=:givensnoANDCno=:givencno;
如果Gradeid<0,不論Hgrade為何值,均認(rèn)為該學(xué)生成績(jī)?yōu)榭罩?。二、非CURRENT形式的增刪改語(yǔ)句(1)在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量【例】
修改某個(gè)學(xué)生選修1號(hào)課程的成績(jī)。
EXECSQLUPDATESCSETGrade=:newgrade/*修改的成績(jī)已賦給主變量*/WHERESno=:givensno;/*學(xué)號(hào)賦給主變量givensno*/二、非CURRENT形式的增刪改語(yǔ)句(2)【例5】將計(jì)算機(jī)系全體學(xué)生年齡置NULL值。
Sageid=-1;
EXECSQLUPDATEStudentSETSage=:Raise:SageidWHERESdept=‘CS’;將指示變量Sageid賦一個(gè)負(fù)值后,無(wú)論主變量Raise為何值,RDBMS都會(huì)將CS系所有學(xué)生的年齡置空值。
等價(jià)于:
EXECSQLUPDATEStudentSETSage=NULWHERESdept='CS';二、非CURRENT形式的增刪改語(yǔ)句(3)【例】某個(gè)學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已賦給主變量stdname。
EXECSQLDELETEFROMSCWHERESno=(SELECTSnoFROMStudentWHERESname=:stdname);二、非CURRENT形式的增刪改語(yǔ)句(4)【例】某個(gè)學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號(hào)已賦給主變量stdno,課程號(hào)已賦給主變量couno。
gradeid=-1;/*用作指示變量,賦為負(fù)值*/ EXECSQLINSERTINTOSC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr:gradeid);
由于該學(xué)生剛選修課程,成績(jī)應(yīng)為空,所以要把指示變量賦為負(fù)值嵌入式SQL嵌入式SQL的處理過(guò)程嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信不使用游標(biāo)的SQL語(yǔ)句使用游標(biāo)的SQL語(yǔ)句動(dòng)態(tài)SQL使用游標(biāo)的SQL語(yǔ)句必須使用游標(biāo)的SQL語(yǔ)句查詢結(jié)果為多條記錄的SELECT語(yǔ)句CURRENT形式的UPDATE語(yǔ)句CURRENT形式的DELETE語(yǔ)句一、查詢結(jié)果為多條記錄的SELECT語(yǔ)句使用游標(biāo)的步驟1.說(shuō)明游標(biāo)2.打開(kāi)游標(biāo)3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄4.關(guān)閉游標(biāo)使用游標(biāo)的步驟>>
1.說(shuō)明游標(biāo)使用DECLARE語(yǔ)句語(yǔ)句格式
EXECSQLDECLARE<游標(biāo)名>CURSORFOR<SELECT語(yǔ)句>;功能是一條說(shuō)明性語(yǔ)句,這時(shí)DBMS并不執(zhí)行SELECT指定的查詢操作。使用游標(biāo)的步驟>>
2.打開(kāi)游標(biāo)使用OPEN語(yǔ)句語(yǔ)句格式
EXECSQLOPEN<游標(biāo)名>;功能打開(kāi)游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語(yǔ)句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中第一條記錄使用游標(biāo)的步驟>>
3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄
使用FETCH語(yǔ)句語(yǔ)句格式
EXECSQLFETCH[[NEXT|PRIOR|FIRST|LAST]FROM]<游標(biāo)名>INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...;功能指定方向推動(dòng)游標(biāo)指針,然后將緩沖區(qū)中的當(dāng)前記錄取出來(lái)送至主變量供主語(yǔ)言進(jìn)一步處理NEXT|PRIOR|FIRST|LAST:指定推動(dòng)游標(biāo)指針的方式
NEXT:向前推進(jìn)一條記錄
PRIOR:向回退一條記錄
FIRST:推向第一條記錄
LAST:推向最后一條記錄缺省值為NEXT使用游標(biāo)的步驟>>
4.關(guān)閉游標(biāo)使用CLOSE語(yǔ)句語(yǔ)句格式
EXECSQLCLOSE<游標(biāo)名>;功能關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源說(shuō)明游標(biāo)被關(guān)閉后,就不再和原來(lái)的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標(biāo)可以再次被打開(kāi),與新的查詢結(jié)果相聯(lián)系二、CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句的用途面向集合的操作一次修改或刪除所有滿足條件的記錄二、CURRENT形式的UPDATE和DELETE語(yǔ)句如果只想修改或刪除其中某個(gè)記錄用帶游標(biāo)的SELECT語(yǔ)句查出所有滿足條件的記錄從中進(jìn)一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句修改或刪除之
UPDATE語(yǔ)句和DELETE語(yǔ)句中的子句:
WHERECURRENTOF<游標(biāo)名>
表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄二、CURRENT形式的UPDATE和DELETE語(yǔ)句不能使用CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句:當(dāng)游標(biāo)定義中的SELECT語(yǔ)句帶有UNION或ORDERBY子句該SELECT語(yǔ)句相當(dāng)于定義了一個(gè)不可更新的視圖程序?qū)嵗纠恳来螜z查某個(gè)系的學(xué)生記錄,交互式更新某些學(xué)生年齡
EXECSQLBEGINDECLARESECTION;/*主變量說(shuō)明開(kāi)始*/ chardeptname[64]; charHSno[64]; charHSname[64]; charHSsex[64]; int HSage; int NEWAGE;EXECSQLENDDECLARESECTION;/*主變量說(shuō)明結(jié)束*/longSQLCODE;EXECSQLINCLUDEsqlca;/*定義SQL通信區(qū)*/5、程序?qū)嵗齣ntmain(void)/*C語(yǔ)言主程序開(kāi)始*/{ int count=0; charyn;/*變量yn代表yes或no*/ printf("Pleasechoosethedepartmentname(CS/MA/IS):"); scanf("%s",deptname);/*為主變量deptname賦值*/ EXECSQLCONNECTTOTEST@localhost:54321USER"SYSTEM"/"MANAGER";/*連接數(shù)據(jù)庫(kù)TEST*/ EXECSQLDECLARESXCURSORFOR/*定義游標(biāo)*/ SELECTSno,Sname,Ssex,Sage/*SX對(duì)應(yīng)語(yǔ)句的執(zhí)行結(jié)果*/ FROMStudent WHERESDept=:deptname; EXECSQLOPENSX;/*打開(kāi)游標(biāo)SX便指向查詢結(jié)果的第一行*/5、程序?qū)嵗齠or(;;) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/{ EXECSQLFETCHSXINTO: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)/*如果是第一行的話,先打出行頭*/ 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)?");/*詢問(wèn)用戶是否要更新該學(xué)生的年齡*/ do{ scanf("%c",&yn); } while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y');5、程序?qū)嵗?/p>
if(yn=='y'||yn=='Y')/*如果選擇更新操作*/ { printf("INPUTNEWAGE:"); scanf("%d",&NEWAGE);/*用戶輸入新年齡到主變量中*/ EXECSQLUPDATEStudent /*嵌入式SQL*/ SETSage=:NEWAGE WHERECURRENTOFSX; }/*對(duì)當(dāng)前游標(biāo)指向的學(xué)生年齡進(jìn)行更新*/}EXECSQLCLOSESX;/*關(guān)閉游標(biāo)SX不再和查詢結(jié)果對(duì)應(yīng)*/ EXECSQLCOMMITWORK;/*提交更新*/ EXECSQLDISCONNECTTEST;/*斷開(kāi)數(shù)據(jù)庫(kù)連接*/}嵌入式SQL嵌入式SQL的處理過(guò)程嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信不使用游標(biāo)的SQL語(yǔ)句使用游標(biāo)的SQL語(yǔ)句動(dòng)態(tài)SQL動(dòng)態(tài)SQL靜態(tài)嵌入式SQL靜態(tài)嵌入式SQL語(yǔ)句能夠滿足一般要求無(wú)法滿足要到執(zhí)行時(shí)才能夠確定要提交的SQL語(yǔ)句動(dòng)態(tài)嵌入式SQL允許在程序運(yùn)行過(guò)程中臨時(shí)“組裝”SQL語(yǔ)句支持動(dòng)態(tài)組裝SQL語(yǔ)句和動(dòng)態(tài)參數(shù)兩種形式動(dòng)態(tài)SQL簡(jiǎn)介一、使用SQL語(yǔ)句主變量二、動(dòng)態(tài)參數(shù)一、使用SQL語(yǔ)句主變量SQL語(yǔ)句主變量:程序主變量包含的內(nèi)容是SQL語(yǔ)句的內(nèi)容,而不是原來(lái)保存數(shù)據(jù)的輸入或輸出變量SQL語(yǔ)句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語(yǔ)句,然后立即執(zhí)行一、使用SQL語(yǔ)句主變量【例】創(chuàng)建基本表TESTEXECSQLBEGINDECLARESECTION;constchar*stmt="CREATETABLEtest(aint);";/*SQL語(yǔ)句主變量*/EXECSQLENDDECLARESECTION;......EXECSQLEXECUTEIMMEDIATE:stmt; /*執(zhí)行語(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í)完成綁定而是通過(guò)(prepare)語(yǔ)句準(zhǔn)備主變量和執(zhí)行(execute)時(shí)綁定數(shù)據(jù)或主變量來(lái)完成二、動(dòng)態(tài)參數(shù)使用動(dòng)態(tài)參數(shù)的步驟:1.聲明SQL語(yǔ)句主變量。 2.準(zhǔn)備SQL語(yǔ)句(PREPARE)。 EXECSQLPREPARE<語(yǔ)句名>FROM<SQL語(yǔ)句主變量>;3.執(zhí)行準(zhǔn)備好的語(yǔ)句(EXECUTE) EXECSQLEXECUTE<語(yǔ)句名>[INTO<主變量表>][USING<主變量或常量>];二、動(dòng)態(tài)參數(shù)【例】向TEST中插入元組EXECSQLBEGINDECLARESECTION;constchar*stmt="INSERTINTOtestVALUES(?);";/*聲明SQL主變量*/EXECSQLENDDECLARESECTION;......EXECSQLPREPAREmystmtFROM:stmt;/*準(zhǔn)備語(yǔ)句*/......EXECSQLEXECUTEmystmtUSING100;/*執(zhí)行語(yǔ)句*/EXECSQLEXECUTEmystmtUSING200;/*執(zhí)行語(yǔ)句*/數(shù)據(jù)庫(kù)編程嵌入式SQL
存儲(chǔ)過(guò)程
ODBC編程存儲(chǔ)過(guò)程SQL-invokedroutines:存儲(chǔ)過(guò)程(SQL-invokedprocedure)函數(shù)(SQL-invokedfunction)存儲(chǔ)過(guò)程PL/SQL的塊結(jié)構(gòu)變量常量的定義控制結(jié)構(gòu)存儲(chǔ)過(guò)程PL/SQL的塊結(jié)構(gòu)PL/SQL:SQL的擴(kuò)展增加了過(guò)程化語(yǔ)句功能基本結(jié)構(gòu)是塊塊之間可以互相嵌套每個(gè)塊完成一個(gè)邏輯操作PL/SQL的塊結(jié)構(gòu)PL/SOL塊的基本結(jié)構(gòu):
1.定義部分
DECLARE ------變量、常量、游標(biāo)、異常等定義的變量、常量等只能在該基本塊中使用當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在PL/SQL的塊結(jié)構(gòu)PL/SOL塊的基本結(jié)構(gòu)(續(xù)):2.執(zhí)行部分BEGIN ------SQL語(yǔ)句、PL/SQL的流程控制語(yǔ)句 EXCEPTION------異常處理部分 END;變量常量的定義1.PL/SQL中定義變量的語(yǔ)法形式是:
變量名數(shù)據(jù)類型[[NOTNULL]:=初值表達(dá)式]或 變量名數(shù)據(jù)類型[[NOTNULL]初值表達(dá)式]2.常量的定義類似于變量的定義:
常量名數(shù)據(jù)類型CONSTANT:=常量表達(dá)式 常量必須要給一個(gè)值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,PL/SQL將返回一個(gè)異常。3.賦值語(yǔ)句
變量名稱:=表達(dá)式控制結(jié)構(gòu)PL/SQL
功能:一、條件控制語(yǔ)句二、循環(huán)控制語(yǔ)句三、錯(cuò)誤處理控制結(jié)構(gòu)>>
條件控制語(yǔ)句IF-THEN,IF-THEN-ELSE和嵌套的IF語(yǔ)句
1.IFconditionTHEN
Sequence_of_statements; ENDIF 2.IFconditionTHEN
Sequence_of_statements1; ELSE
Sequence_of_statements2;
ENDIF; 3.在THEN和ELSE子句中還可以再包括IF語(yǔ)句,即IF語(yǔ)句可以嵌套??刂平Y(jié)構(gòu)>>循環(huán)控制語(yǔ)句
LOOP,WHILE-LOOP和FOR-LOOP
1.最簡(jiǎn)單的循環(huán)語(yǔ)句LOOP LOOP Sequence_of_statements;
ENDLOOP; 多數(shù)數(shù)據(jù)庫(kù)服務(wù)器的PL/SQL都提供EXIT、BREAK或LEAVE等循環(huán)結(jié)束語(yǔ)句,保證LOOP語(yǔ)句塊能夠結(jié)束??刂平Y(jié)構(gòu)>>循環(huán)控制語(yǔ)句2.WHILE-LOOPWHILEconditionLOOP
Sequence_of_statements; ENDLOOP;每次執(zhí)行循環(huán)體語(yǔ)句之前,首先對(duì)條件進(jìn)行求值如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語(yǔ)句序列。如果條件為假,則跳過(guò)循環(huán)并把控制傳遞給下一個(gè)語(yǔ)句3.FOR-LOOP FORcountIN[REVERSE]bound1…bound2LOOP
Sequence_of_statements; ENDLOOP;控制結(jié)構(gòu)>>錯(cuò)誤處理如果PL/SQL在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語(yǔ)句處停下來(lái),根據(jù)異常的類型去執(zhí)行異常處理語(yǔ)句SQL標(biāo)準(zhǔn)對(duì)數(shù)據(jù)庫(kù)服務(wù)器提供什么樣的異常處理做出了建議,要求PL/SQL管理器提供完善的異常處理機(jī)制存儲(chǔ)過(guò)程PL/SQL塊類型:命名塊:編譯后保存在數(shù)據(jù)庫(kù)中,可以被反復(fù)調(diào)用,運(yùn)行速度較快。存儲(chǔ)過(guò)程和函數(shù)是命名塊匿名塊:每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存儲(chǔ)到數(shù)據(jù)庫(kù)中,也不能在其他的PL/SQL塊中調(diào)用存儲(chǔ)過(guò)程一、存儲(chǔ)過(guò)程的優(yōu)點(diǎn)二、存儲(chǔ)過(guò)程的用戶接口三、游標(biāo)存儲(chǔ)過(guò)程>>
存儲(chǔ)過(guò)程的優(yōu)點(diǎn)存儲(chǔ)過(guò)程:由PL/SQL語(yǔ)句書(shū)寫(xiě)的過(guò)程,經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,使用時(shí)只要調(diào)用即可。一、存儲(chǔ)過(guò)程的優(yōu)點(diǎn):1.運(yùn)行效率高2.降低了客戶機(jī)和服務(wù)器之間的通信量 3.方便實(shí)施企業(yè)規(guī)則存儲(chǔ)過(guò)程>>
存儲(chǔ)過(guò)程的用戶接口二、存儲(chǔ)過(guò)程的用戶接口:
1.創(chuàng)建存儲(chǔ)過(guò)程
2.執(zhí)行存儲(chǔ)過(guò)程
3.刪除存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程>>
存儲(chǔ)過(guò)程的用戶接口1.創(chuàng)建存儲(chǔ)過(guò)程:
CREATEProcedure過(guò)程名([參數(shù)1,參數(shù)2,...])AS <PL/SQL塊>;過(guò)程名:數(shù)據(jù)庫(kù)服務(wù)器合法的對(duì)象標(biāo)識(shí)參數(shù)列表:用名字來(lái)標(biāo)識(shí)調(diào)用時(shí)給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù)。默認(rèn)為輸入?yún)?shù)。過(guò)程體:是一個(gè)<PL/SQL塊>。包括聲明部分和可執(zhí)行語(yǔ)句部分
存儲(chǔ)過(guò)程>>
存儲(chǔ)過(guò)程的用戶接口【例】利用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)下面的應(yīng)用:從一個(gè)賬戶轉(zhuǎn)指定數(shù)額的款項(xiàng)到另一個(gè)賬戶中。CREATEPROCEDURETRANSFER(inAccountINT,outAccountINT,amountFLOAT) ASDECLARE totalDepositFLOAT; BEGIN/*檢查轉(zhuǎn)出賬戶的余額*/ SELECTtotalINTOtotalDepositFROMACCOUNTWHEREACCOUNTNUM=outAccount; IFtotalDepositISNULLTHEN/*賬戶不存在或賬戶中沒(méi)有存款*/ ROLLBACK; RETURN; ENDIF;存儲(chǔ)過(guò)程>>
存儲(chǔ)過(guò)程的用戶接口
IFtotalDeposit<amountTHEN /*賬戶賬戶存款不足*/ ROLLBACK; RETURN; ENDIF; UPDATEaccountSETtotal=total-amount
WHEREACCOUNTNUM=outAccount; /*修改轉(zhuǎn)出賬戶,減去轉(zhuǎn)出額*/UPDATEaccountSETtotal=total+amountWHEREACCOUNTNUM=inAccount; /*修改轉(zhuǎn)入賬戶,增加轉(zhuǎn)出額*/ COMMIT; /*提交轉(zhuǎn)賬事務(wù)*/ END;存儲(chǔ)過(guò)程>>
存儲(chǔ)過(guò)程的用戶接口重命名存儲(chǔ)過(guò)程
ALTERProcedure過(guò)程名1RENAMETO過(guò)程名2;存儲(chǔ)過(guò)程>>
存儲(chǔ)過(guò)程的用戶接口2.執(zhí)行存儲(chǔ)過(guò)程:
CALL/PERFORMProcedure過(guò)程名([參數(shù)1,參數(shù)2,...]);使用CALL或者PERFORM等方式激活存儲(chǔ)過(guò)程的執(zhí)行。在PL/SQL中,數(shù)據(jù)庫(kù)服務(wù)器支持在過(guò)程體中調(diào)用其他存儲(chǔ)過(guò)程【例】從賬戶01003815868轉(zhuǎn)一萬(wàn)元到01003813828賬戶中。
CALLProcedureTRANSFER(01003813828,01003815868,10000);
存儲(chǔ)過(guò)程>>
存儲(chǔ)過(guò)程的用戶接口3.刪除存儲(chǔ)過(guò)程
DROPPROCEDURE過(guò)程名();三、游標(biāo)在PL/SQL中,如果SELECT語(yǔ)句只返回一條記錄,可以將該結(jié)果存放到變量中。當(dāng)查詢返回多條記錄時(shí),就要使用游標(biāo)對(duì)結(jié)果集進(jìn)行處理一個(gè)游標(biāo)與一個(gè)SQL語(yǔ)句相關(guān)聯(lián)。PL/SQL中的游標(biāo)由PL/SQL引擎管理數(shù)據(jù)庫(kù)編程嵌入式SQL
存儲(chǔ)過(guò)程
ODBC編程ODBC編程ODBC優(yōu)點(diǎn):移植性好能同時(shí)訪問(wèn)不同的數(shù)據(jù)庫(kù)共享多個(gè)數(shù)據(jù)資源ODBC編程數(shù)據(jù)庫(kù)互連概述
ODBC工作原理概述
ODBCAPI基礎(chǔ)
ODBC的工作流程數(shù)據(jù)庫(kù)互連概述ODBC產(chǎn)生的原因:由于不同的數(shù)據(jù)庫(kù)管理系統(tǒng)的存在,在某個(gè)RDBMS下編寫(xiě)的應(yīng)用程序就不能在另一個(gè)RDBMS下運(yùn)行許多應(yīng)用程序需要共享多個(gè)部門的數(shù)據(jù)資源,訪問(wèn)不同的RDBMS數(shù)據(jù)庫(kù)互連概述ODBC:是微軟公司開(kāi)放服務(wù)體系(WindowsOpenServicesArchitecture,WOSA)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分提供了一組訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)APIODBC約束力:規(guī)范應(yīng)用開(kāi)發(fā)規(guī)范RDBMS應(yīng)用接口ODBC編程數(shù)據(jù)庫(kù)互連概述
ODBC工作原理概述
ODBCAPI基礎(chǔ)
ODBC的工作流程ODBC工作原理概述ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu):一、用戶應(yīng)用程序二、驅(qū)動(dòng)程序管理器三、數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序四、ODBC數(shù)據(jù)源管理一、應(yīng)用程序ODBC應(yīng)用程序包括的內(nèi)容:
請(qǐng)求連接數(shù)據(jù)庫(kù);向數(shù)據(jù)源發(fā)送SQL語(yǔ)句;為SQL語(yǔ)句執(zhí)行結(jié)果分配存儲(chǔ)空間,定義所讀取的數(shù)據(jù)格式;獲取數(shù)據(jù)庫(kù)操作結(jié)果,或處理錯(cuò)誤;進(jìn)行數(shù)據(jù)處理并向用戶提交處理結(jié)果;請(qǐng)求事務(wù)的提交和回滾操作;斷開(kāi)與數(shù)據(jù)源的連接。
二、驅(qū)動(dòng)程序管理器
驅(qū)動(dòng)程序管理器:用來(lái)管理各種驅(qū)動(dòng)程序包含在ODBC32.DLL中管理應(yīng)用程序和驅(qū)動(dòng)程序之間的通信建立、配置或刪除數(shù)據(jù)源并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫(kù)ODBC驅(qū)動(dòng)程序主要功能:裝載ODBC驅(qū)動(dòng)程序選擇和連接正確的驅(qū)動(dòng)程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的合法性記錄ODBC函數(shù)的調(diào)用等三、數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序ODBC通過(guò)驅(qū)動(dòng)程序來(lái)提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫(kù)平臺(tái)的獨(dú)立性O(shè)DBC應(yīng)用程序不能直接存取數(shù)據(jù)庫(kù)其各種操作請(qǐng)求由驅(qū)動(dòng)程序管理器提交給某個(gè)RDBMS的ODBC驅(qū)動(dòng)程序通過(guò)調(diào)用驅(qū)動(dòng)程序所支持的函數(shù)來(lái)存取數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)的操作結(jié)果也通過(guò)驅(qū)動(dòng)程序返回給應(yīng)用程序。如果應(yīng)用程序要操縱不同的數(shù)據(jù)庫(kù),就要?jiǎng)討B(tài)地鏈接到不同的驅(qū)動(dòng)程序上。
三、數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序ODBC驅(qū)動(dòng)程序類型:?jiǎn)问鴶?shù)據(jù)源和應(yīng)用程序在同一臺(tái)機(jī)器上驅(qū)動(dòng)程序直接完成對(duì)數(shù)據(jù)文件的I/O操作驅(qū)動(dòng)程序相當(dāng)于數(shù)據(jù)管理器多束
支持客戶機(jī)/服務(wù)器、客戶機(jī)/應(yīng)用服務(wù)器/數(shù)據(jù)庫(kù)服務(wù)器等網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)訪問(wèn)由驅(qū)動(dòng)程序完成數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求的提交和結(jié)果集接收應(yīng)用程序使用驅(qū)動(dòng)程序提供的結(jié)果集管理接口操縱執(zhí)行后的結(jié)果數(shù)據(jù)
四、ODBC數(shù)據(jù)源管理數(shù)據(jù)源:是最終用戶需要訪問(wèn)的數(shù)據(jù),包含了數(shù)據(jù)庫(kù)位置和數(shù)據(jù)庫(kù)類型等信息,是一種數(shù)據(jù)連接的抽象數(shù)據(jù)源對(duì)最終用戶是透明的ODBC給每個(gè)被訪問(wèn)的數(shù)據(jù)源指定唯一的數(shù)據(jù)源名(DataSourceName,簡(jiǎn)稱DSN),并映射到所有必要的、用來(lái)存取數(shù)據(jù)的低層軟件在連接中,用數(shù)據(jù)源名來(lái)代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫(kù)名等最終用戶無(wú)需知道DBMS或其他數(shù)據(jù)管理軟件、網(wǎng)絡(luò)以及有關(guān)ODBC驅(qū)動(dòng)程序的細(xì)節(jié)四、ODBC數(shù)據(jù)源管理例如,假設(shè)某個(gè)學(xué)校在MSSQLServer和KingbaseES上創(chuàng)建了兩個(gè)數(shù)據(jù)庫(kù):學(xué)校人事數(shù)據(jù)庫(kù)和教學(xué)科研數(shù)據(jù)庫(kù)。學(xué)校的信息系統(tǒng)要從這兩個(gè)數(shù)據(jù)庫(kù)中存取數(shù)據(jù)為方便與兩個(gè)數(shù)據(jù)庫(kù)連接,為學(xué)校人事數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)數(shù)據(jù)源名PERSON,為教學(xué)科研數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)名為EDU的數(shù)據(jù)源。當(dāng)要訪問(wèn)每一個(gè)數(shù)據(jù)庫(kù)時(shí),只要與PERSON和EDU連接即可,不需要記住使用的驅(qū)動(dòng)程序、服務(wù)器名稱、數(shù)據(jù)庫(kù)名
ODBC編程>>
ODBCAPI基礎(chǔ)ODBC應(yīng)用程序接口的一致性API一致性API一致性級(jí)別有核心級(jí)、擴(kuò)展1級(jí)、擴(kuò)展2級(jí)語(yǔ)法一致性語(yǔ)法一致性級(jí)別有最低限度SQL語(yǔ)法級(jí)、核心SQL語(yǔ)法級(jí)、擴(kuò)展SQL語(yǔ)法級(jí)ODBCAPI基礎(chǔ)一、函數(shù)概述二、句柄及其屬性三、數(shù)據(jù)類型一、函數(shù)概述ODBC3.0標(biāo)準(zhǔn)提供了76個(gè)函數(shù)接口:分配和釋放環(huán)境句柄、連接句柄、語(yǔ)句句柄;連接函數(shù)(SQLDriverconnect等);與信息相關(guān)的函數(shù)(如獲取描述信息函數(shù)SQLGetinfo、SQLGetFuction);事務(wù)處理函數(shù)(如SQLEndTran);執(zhí)行相關(guān)函數(shù)(SQLExecdirect、SQLExecute等);編目函數(shù),ODBC3.0提供了11個(gè)編目函數(shù)如SQLTables、SQLColumn等,應(yīng)用程序可以通過(guò)對(duì)編目函數(shù)的調(diào)用來(lái)獲取數(shù)據(jù)字典的信息如權(quán)限、表結(jié)構(gòu)等
一、函數(shù)概述ODBC1.0和ODBC2.x、ODBC3.x函數(shù)使用上有很多差異MFCODBC對(duì)較復(fù)雜的ODBCAPI進(jìn)行了封裝,提供了簡(jiǎn)化的調(diào)用接口二、句柄及其屬性句柄是32位整數(shù)值,代表一個(gè)指針ODBC3.0中句柄分類:環(huán)境句柄連接句柄語(yǔ)句句柄描述符句柄二、句柄及其屬性應(yīng)用程序句柄之間的關(guān)系
應(yīng)用程序句柄之間的關(guān)系
二、句柄及其屬性1.每個(gè)ODBC應(yīng)用程序需要建立一個(gè)ODBC環(huán)境,分配一個(gè)環(huán)境句柄,存取數(shù)據(jù)的全局性背景如環(huán)境狀態(tài)、當(dāng)前環(huán)境狀態(tài)診斷、當(dāng)前在環(huán)境上分配的連接句柄等;2.一個(gè)環(huán)境句柄可以建立多個(gè)連接句柄,每一個(gè)連接句柄實(shí)現(xiàn)與一個(gè)數(shù)據(jù)源之間的連接;二、句柄及其屬性3.在一個(gè)連接中可以建立多個(gè)語(yǔ)句句柄,它不只是一個(gè)SQL語(yǔ)句,還包括SQL語(yǔ)句產(chǎn)生的結(jié)果集以及相關(guān)的信息等;4.在ODBC3.0中又提出了描述符句柄的概念,它是描述SQL語(yǔ)句的參數(shù)、結(jié)果集列的元數(shù)據(jù)集合。三、數(shù)據(jù)類型ODBC數(shù)據(jù)類型:SQL數(shù)據(jù)類型:用于數(shù)據(jù)源C數(shù)據(jù)類型:用于應(yīng)用程序的C代碼應(yīng)用程序可以通過(guò)SQLGetTypeInfo來(lái)獲取不同的驅(qū)動(dòng)程序?qū)τ跀?shù)據(jù)類型的支持情況三、數(shù)據(jù)類型SQL數(shù)據(jù)類型C數(shù)據(jù)類型SQL數(shù)據(jù)類型數(shù)據(jù)源之間轉(zhuǎn)換應(yīng)用程序變量傳送到語(yǔ)句參數(shù)(SQLBindparameter)C數(shù)據(jù)類型從結(jié)果集列中返回到應(yīng)用程序變量(SQLBindcol)應(yīng)用程序變量之間轉(zhuǎn)換SQL數(shù)據(jù)類型和C數(shù)據(jù)類型之間的轉(zhuǎn)換規(guī)則ODBC編程數(shù)據(jù)庫(kù)互連概述
ODBC工作原理概述
ODBCAPI基礎(chǔ)
ODBC的工作流程ODBC的工作流程ODBC的工作流程:ODBC的工作流程【例】將KingbaseES數(shù)據(jù)庫(kù)中Student表的數(shù)據(jù)備份到SQLSERVER數(shù)據(jù)庫(kù)中。該應(yīng)用涉及兩個(gè)不同的RDBMS中的數(shù)據(jù)源使用ODBC來(lái)開(kāi)發(fā)應(yīng)用程序,只要改變應(yīng)用程序中連接函數(shù)(SQLConnect)的參數(shù),就可以連接不同RDBMS的驅(qū)動(dòng)程序,連接兩個(gè)數(shù)據(jù)源ODBC的工作流程在應(yīng)用程序運(yùn)行前,已經(jīng)在KingbaseES和SQLSERVER中分別建立了STUDENT關(guān)系表
CREATETABLEStudent
(SnoCHAR(9)PRIMARYKEY,
SnameCHAR(20)UNQUESsexCHAR(2),
SageSMALLINT,
SdeptCHAR(20));ODBC的工作流程應(yīng)用程序要執(zhí)行的操作是:在KingbaseES上執(zhí)行SELECT*FROMSTUDENT;把獲取的結(jié)果集,通過(guò)多次執(zhí)行
INSERTINTOSTUDENT(Sno,Sname,Ssex,Sage,Sddept)VALUES(?,?,?,?,?);插入到SQLSERVER的STUDENT表中ODBC的工作流程操作步驟:
一、配置數(shù)據(jù)源 二、初始化環(huán)境 三、建立連接 四、分配語(yǔ)句句柄 五、執(zhí)行SQL語(yǔ)句 六、結(jié)果集處理 七、中止處理一、配置數(shù)據(jù)源配置數(shù)據(jù)源兩種方法:⑴運(yùn)行數(shù)據(jù)源管理工具來(lái)進(jìn)行配置;⑵使用DriverManager提供的ConfigDsn函數(shù)來(lái)增加、修
改或刪除數(shù)據(jù)源在[例13]中,采用了第一種方法創(chuàng)建數(shù)據(jù)源。因?yàn)橐瑫r(shí)用到KingbaseES和SQLServer,所以分別建立兩個(gè)數(shù)據(jù)源,將其取名為KingbaseESODBC和SQLServer。一、配置數(shù)據(jù)源【例】創(chuàng)建數(shù)據(jù)源的詳細(xì)過(guò)程#include<stdlib.h>#include<stdio.h>#include<windows.h>#include<sql.h>#include<sqlext.h>#include<Sqltypes.h>#defineSNO_LEN30#defineNAME_LEN50#defineDEPART_LEN100#defineSSEX_LEN5一、配置數(shù)據(jù)源【例】創(chuàng)建數(shù)據(jù)源---第一步:定義句柄和變量intmain(){ /*Step1定義句柄和變量*/ //以king開(kāi)頭的表示的是連接KingbaseES的變量 //以server開(kāi)頭的表示的是連接SQLSERVER的變量 SQLHENVkinghenv,serverhenv; //環(huán)境句柄 SQLHDBC kinghdbc,serverhdbc; //連接句柄 SQLHSTMT kinghstmt,serverhstmt; //語(yǔ)句句柄 SQLRETURN ret; SQLCHARsName[NAME_LEN],sDepart[DEPART_LEN], sSex[SSEX_LEN],sSno[SNO_LEN]; SQLINTEGERsAge; SQLINTEGERcbAge=0,cbSno=SQL_NTS,cbSex=SQL_NTS, cbName=SQL_NTS,cbDepart=SQL_NTS;二、初始化環(huán)境沒(méi)有和具體的驅(qū)動(dòng)程序相關(guān)聯(lián),由DriverManager來(lái)進(jìn)行控制,并配置環(huán)境屬性應(yīng)用程序通過(guò)調(diào)用連接函數(shù)和某個(gè)數(shù)據(jù)源進(jìn)行連接后,DriverManager才調(diào)用所連的驅(qū)動(dòng)程序中的SQLAllocHandle,來(lái)真正分配環(huán)境句柄的數(shù)據(jù)結(jié)構(gòu)初始化環(huán)境代碼【例】創(chuàng)建數(shù)據(jù)源---第二步:初始化環(huán)境
/*Step2初始化環(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, (void*)SQL_OV_ODBC3,0); ret=SQLSetEnvAttr(serverhenv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,0);三、建立連接應(yīng)用程序調(diào)用SQLAllocHandle分配連接句柄,通過(guò)SQLConnect、SQLDriverConnect或SQLBrowseConnect與數(shù)據(jù)源連接SQLConnect連接函數(shù),輸入?yún)?shù)為:配置好的數(shù)據(jù)源名稱用戶ID口令
[例13]中KingbaseESODBC為數(shù)據(jù)源名字,SYSTEM為用戶名,MANAGER為用戶密碼
建立連接代碼【例】創(chuàng)建數(shù)據(jù)源---第三步:建立連接/*Step3:建立連接*/ret=SQLAllocHandle(SQL_HANDLE_DBC,kinghenv,&kinghdbc);ret=SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);ret=SQLConnect(kinghdbc,"KingbaseESODBC",SQL_NTS,"SYSTEM",SQL_NTS,"MANAGER",SQL_NTS);if(!SQL_SUCCEEDED(ret))//連接失敗時(shí)返回錯(cuò)誤值 return-1;ret=SQLConnect(serverhdbc,"SQLServer",SQL_NTS,"sa", SQL_NTS,"sa",SQL_NTS);if(!SQL_SUCCEEDED(ret)) //連接失敗時(shí)返回錯(cuò)誤值 return-1;四、分配語(yǔ)句句柄處理任何SQL語(yǔ)句之前,應(yīng)用程序還需要首先分配一個(gè)語(yǔ)句句柄語(yǔ)句句柄含有具體的SQL語(yǔ)句以及輸出的結(jié)果集等信息上例中分配了兩個(gè)語(yǔ)句句柄:一個(gè)用來(lái)從KingbaseES中讀取數(shù)據(jù)產(chǎn)生結(jié)果集(kinghstmt)一個(gè)用來(lái)向SQLSERVER插入數(shù)據(jù)(serverhstmt)應(yīng)用程序還可以通過(guò)SQLtStmtAttr來(lái)設(shè)置語(yǔ)句屬性(也可以使用默認(rèn)值)
分配語(yǔ)句句柄代碼【例】創(chuàng)建數(shù)據(jù)源---第四步/*Step4:初始化語(yǔ)句句柄*/ret=SQLAllocHandle(SQL_HANDLE_STMT,kinghdbc,&kinghstmt);ret=SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);五、執(zhí)行SQL語(yǔ)句應(yīng)用程序處理SQL語(yǔ)句的兩種方式:預(yù)處理(SQLPrepare、SQLExecute適用于語(yǔ)句的多次執(zhí)行)直接執(zhí)行(SQLExecdirect)
如果SQL語(yǔ)句含有參數(shù),應(yīng)用程序?yàn)槊總€(gè)參數(shù)調(diào)用SQLBindParameter,并把它們綁定至應(yīng)用程序變量
應(yīng)用程序可以直接通過(guò)改變應(yīng)用程序緩沖區(qū)的內(nèi)容從而在程序中動(dòng)態(tài)的改變SQL語(yǔ)句的具體執(zhí)行執(zhí)行SQL語(yǔ)句應(yīng)用程序根據(jù)語(yǔ)句的類型進(jìn)行的處理有結(jié)果集的語(yǔ)句(select或是編目函數(shù)),則進(jìn)行結(jié)果集處理。沒(méi)有結(jié)果集的函數(shù),可以直接利用本語(yǔ)句句柄繼續(xù)執(zhí)行新的語(yǔ)句或是獲取行計(jì)數(shù)(本次執(zhí)行所影響的行數(shù))之后繼續(xù)執(zhí)行。
在上例中,使用SQLExecdirect獲取KingbaseES中的結(jié)果集,并將結(jié)果集根據(jù)各列不同的數(shù)據(jù)類型綁定到用戶程序緩沖區(qū)在插入數(shù)據(jù)時(shí),采用了預(yù)編譯的方式,首先通過(guò)SQLPrepare來(lái)預(yù)處理SQL語(yǔ)句,將每一列綁定到用戶緩沖區(qū)應(yīng)用程序可以直接修改結(jié)果集緩沖區(qū)的內(nèi)容
程序源碼【例】創(chuàng)建數(shù)據(jù)源---第五步:執(zhí)行SQL語(yǔ)句/*Step5:兩種方式執(zhí)行語(yǔ)句*//*預(yù)編譯帶有參數(shù)的語(yǔ)句*/ret=SQLPrepare(serverhstmt,"INSERTINTOSTUDENT(SNO,SNAME,SSEX,SAGE,SDEPT)VALUES(?,?,?,?,?)",SQL_NTS);if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_W
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房產(chǎn)銷售合作協(xié)議
- 工藝品訂購(gòu)合同范本
- 建筑工程內(nèi)部承包經(jīng)營(yíng)合同案例
- 大學(xué)生就業(yè)協(xié)議范本
- 建筑施工合同模板 工程合同范本
- 職工待崗協(xié)議2024年
- 建筑施工隊(duì)臨時(shí)工合同
- 蘇教版小學(xué)數(shù)學(xué)四年級(jí)下冊(cè)《用數(shù)對(duì)確定位置》公開(kāi)課說(shuō)課課件
- 2024職業(yè)培訓(xùn)合作協(xié)議
- 園林工程結(jié)算合同樣本
- 公路工程安全技術(shù)交底(完整版)
- 國(guó)家電網(wǎng)公司輸變電工程工藝標(biāo)準(zhǔn)庫(kù)(輸電線路工程部分)試題
- 諸暨市籃球協(xié)會(huì)會(huì)員登記表(精品)
- 直線度、平面度、平行度的測(cè)量
- 三年級(jí)習(xí)作:菊花教學(xué)指導(dǎo)(課堂PPT)
- 個(gè)人醫(yī)德醫(yī)風(fēng)檔案
- DIC的診斷與評(píng)價(jià)ppt課件
- 車輛評(píng)估報(bào)告
- 施工圖變更單4頁(yè)
- 金山區(qū)社區(qū)衛(wèi)生服務(wù)中心基本項(xiàng)目標(biāo)化工作量指導(dǎo)標(biāo)準(zhǔn)2015
- 紙尿褲生產(chǎn)規(guī)程與設(shè)備維護(hù)
評(píng)論
0/150
提交評(píng)論