




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
數(shù)據(jù)庫系統(tǒng)原理
第11講數(shù)據(jù)庫編程標準SQL是非過程化的查詢語言
優(yōu)點:具有操作統(tǒng)一、面向集合、功能豐富、使用簡單的優(yōu)點;
缺點:缺少流程控制能力,難于實現(xiàn)應用業(yè)務(wù)中的邏輯控制。SQL編程技術(shù)可以需要克服SQL語言實現(xiàn)應用方面的不足第11講
數(shù)據(jù)庫編程1
嵌入式SQL2存儲過程3
ODBC編程§11.1嵌入式SQL為什么要引入嵌入式SQLSQL語言是非過程性語言事務(wù)處理應用需要高級語言這兩種方式細節(jié)上有差別,在程序設(shè)計的環(huán)境下,SQL語句要做某些必要的擴充§11.1嵌入式SQL1.嵌入式SQL的處理過程2.嵌入式SQL語句與主語言之間的通信3.不使用游標的SQL語句4.使用游標的SQL語句5.動態(tài)SQL§11.1.1嵌入式SQL的處理過程主語言嵌入式SQL是將SQL語句嵌入程序設(shè)計語言中,被嵌入的程序設(shè)計語言,如C、C++、Java,稱為宿主語言,簡稱主語言。處理過程預編譯方法:由RDBMS的預處理程序?qū)υ闯绦蜻M行掃描,識別出ESQL語句,把它們轉(zhuǎn)換成主語言調(diào)用語句,以使主語言編譯程序能識別它們,然后由主語言編譯程序?qū)⒓兊淖≌Z言程序編譯成目標代碼,如下圖所示?!?1.1.1嵌入式SQL的處理過程主語言程序含ESQL語句RDBMS的預處理程序ESQL語句轉(zhuǎn)換為函數(shù)調(diào)用主語言編譯程序目標語言程序ESQL基本處理過程§11.1.1嵌入式SQL的處理過程為了區(qū)分SQL語句與主語言語句,所有SQL語句必須加前綴EXECSQL,以(;)結(jié)束:EXECSQL<SQL語句>;§11.1.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句SQL語句描述性的面向集合的語句負責操縱數(shù)據(jù)庫高級語言語句過程性的面向記錄的語句負責控制程序流程它們之間應該如何通信?§11.1.2嵌入式SQL語句與主語言之間的通信數(shù)據(jù)庫工作單元與源程序工作單元之間的通信:1.SQL通信區(qū)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息使主語言能夠據(jù)此控制程序流程2.主變量主語言向SQL語句提供參數(shù)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進一步處理3.游標解決集合性操作語言與過程性操作語言的不匹配1)SQL通信區(qū)SQLCA:SQLCommunicationAreaSQLCA是一個數(shù)據(jù)結(jié)構(gòu)SQLCA的用途SQL語句執(zhí)行后,RDBMS反饋給應用程序信息
描述系統(tǒng)當前工作狀態(tài)描述運行環(huán)境這些信息將送到SQL通信區(qū)SQLCA中應用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句1)SQL通信區(qū)SQLCA使用方法:定義SQLCA
用EXECSQLINCLUDESQLCA定義使用SQLCASQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯應用程序每執(zhí)行完一條SQL語句之后都應該測試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應處理2)主變量
主變量嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)在SQL語句中使用的主語言程序變量簡稱為主變量(HostVariable)主變量的類型輸入主變量:由應用程序?qū)ζ滟x值,SQL語句引用;輸出主變量:又SQL語句對其賦值或者設(shè)置狀態(tài)信息,返回給應用程序;一個主變量有可能既是輸入主變量又是輸出主變量2)主變量指示變量:一個主變量可以附帶一個指示變量(IndicatorVariable)什么是指示變量:是一個整型變量,用來指示所指主變量的值或者條件;指示變量的用途:可以指示輸入主變量是否為空值,可以檢測輸出主變量是否為空值,值是否被截斷。2)主變量在SQL語句中使用主變量和指示變量的方法(1)
說明主變量和指示變量
BEGINDECLARESECTION ......... .........(說明主變量和指示變量) .........ENDDECLARESECTION2)主變量(2)使用主變量說明之后的主變量可以在SQL語句中任何一個能夠使用表達式的地方出現(xiàn)為了與數(shù)據(jù)庫對象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(:)作為標志(3)
使用指示變量
指示變量前也必須加冒號標志必須緊跟在所指主變量之后在SQL語句之外(主語言語句中)使用主變量和指示變量的方法可以直接引用,不必加冒號3)游標(cursor)為什么要使用游標
SQL語言與主語言具有不同數(shù)據(jù)處理方式SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標的概念,用來協(xié)調(diào)這兩種不同的處理方式
3)游標游標游標是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果每個游標區(qū)都有一個名字用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,交由主語言進一步處理4)建立和關(guān)閉數(shù)據(jù)庫連接建立數(shù)據(jù)庫連接
EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];
target是要連接的數(shù)據(jù)庫服務(wù)器:常見的服務(wù)器標識串,如<dbname>@<hostname>:<port>包含服務(wù)器標識的SQL串常量DEFAULTconnect-name是可選的連接名,連接必須是一個有效的標識符在整個程序內(nèi)只有一個連接時可以不指定連接名關(guān)閉數(shù)據(jù)庫連接
EXECSQLDISCONNECT[connection];程序運行過程中可以修改當前連接:
EXECSQLSETCONNECTIONconnection-name|DEFAULT;嵌入式SQL嵌入式SQL的處理過程嵌入式SQL語句與主語言之間的通信不使用游標的SQL語句使用游標的SQL語句動態(tài)SQL不用游標的SQL語句不用游標的SQL語句的種類說明性語句數(shù)據(jù)定義語句數(shù)據(jù)控制語句查詢結(jié)果為單記錄的SELECT語句非CURRENT形式的增刪改語句不用游標的SQL語句一、查詢結(jié)果為單記錄的SELECT語句二、非CURRENT形式的增刪改語句一、查詢結(jié)果為單記錄的SELECT語句(1)這類語句不需要使用游標,只需要用INTO子句指定存放查詢結(jié)果的主變量【例】根據(jù)學生號碼查詢學生信息。假設(shè)已經(jīng)把要查詢的學生的學號賦給了主變量givensno。EXECSQLSELECTSno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROMStudentWHERESno=:givensno;一、查詢結(jié)果為單記錄的SELECT語句(2)(1)INTO子句、WHERE子句和HAVING短語的條件表達式中均可以使用主變量(2)查詢返回的記錄中,可能某些列為空值NULL。(3)如果查詢結(jié)果實際上并不是單條記錄,而是多條記錄,則程序出錯,RDBMS會在SQLCA中返回錯誤信息一、查詢結(jié)果為單記錄的SELECT語句(3)【例】查詢某個學生選修某門課程的成績。假設(shè)已經(jīng)把將要查詢的學生的學號賦給了主變量givensno,將課程號賦給了主變量givencno。
EXECSQLSELECTSno,Cno,GradeINTO:Hsno,:Hcno,:Hgrade:Gradeid/*指示變量Gradeid*/FROMSCWHERESno=:givensnoANDCno=:givencno;
如果Gradeid<0,不論Hgrade為何值,均認為該學生成績?yōu)榭罩?。二、非CURRENT形式的增刪改語句(1)在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量【例】
修改某個學生選修1號課程的成績。
EXECSQLUPDATESCSETGrade=:newgrade/*修改的成績已賦給主變量*/WHERESno=:givensno;/*學號賦給主變量givensno*/二、非CURRENT形式的增刪改語句(2)【例5】將計算機系全體學生年齡置NULL值。
Sageid=-1;
EXECSQLUPDATEStudentSETSage=:Raise:SageidWHERESdept=‘CS’;將指示變量Sageid賦一個負值后,無論主變量Raise為何值,RDBMS都會將CS系所有學生的年齡置空值。
等價于:
EXECSQLUPDATEStudentSETSage=NULWHERESdept='CS';二、非CURRENT形式的增刪改語句(3)【例】某個學生退學了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學生的姓名已賦給主變量stdname。
EXECSQLDELETEFROMSCWHERESno=(SELECTSnoFROMStudentWHERESname=:stdname);二、非CURRENT形式的增刪改語句(4)【例】某個學生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學號已賦給主變量stdno,課程號已賦給主變量couno。
gradeid=-1;/*用作指示變量,賦為負值*/ EXECSQLINSERTINTOSC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr:gradeid);
由于該學生剛選修課程,成績應為空,所以要把指示變量賦為負值嵌入式SQL嵌入式SQL的處理過程嵌入式SQL語句與主語言之間的通信不使用游標的SQL語句使用游標的SQL語句動態(tài)SQL使用游標的SQL語句必須使用游標的SQL語句查詢結(jié)果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句一、查詢結(jié)果為多條記錄的SELECT語句使用游標的步驟1.說明游標2.打開游標3.推進游標指針并取當前記錄4.關(guān)閉游標使用游標的步驟>>
1.說明游標使用DECLARE語句語句格式
EXECSQLDECLARE<游標名>CURSORFOR<SELECT語句>;功能是一條說明性語句,這時DBMS并不執(zhí)行SELECT指定的查詢操作。使用游標的步驟>>
2.打開游標使用OPEN語句語句格式
EXECSQLOPEN<游標名>;功能打開游標實際上是執(zhí)行相應的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中這時游標處于活動狀態(tài),指針指向查詢結(jié)果集中第一條記錄使用游標的步驟>>
3.推進游標指針并取當前記錄
使用FETCH語句語句格式
EXECSQLFETCH[[NEXT|PRIOR|FIRST|LAST]FROM]<游標名>INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...;功能指定方向推動游標指針,然后將緩沖區(qū)中的當前記錄取出來送至主變量供主語言進一步處理NEXT|PRIOR|FIRST|LAST:指定推動游標指針的方式
NEXT:向前推進一條記錄
PRIOR:向回退一條記錄
FIRST:推向第一條記錄
LAST:推向最后一條記錄缺省值為NEXT使用游標的步驟>>
4.關(guān)閉游標使用CLOSE語句語句格式
EXECSQLCLOSE<游標名>;功能關(guān)閉游標,釋放結(jié)果集占用的緩沖區(qū)及其他資源說明游標被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標可以再次被打開,與新的查詢結(jié)果相聯(lián)系二、CURRENT形式的UPDATE語句和DELETE語句CURRENT形式的UPDATE語句和DELETE語句的用途面向集合的操作一次修改或刪除所有滿足條件的記錄二、CURRENT形式的UPDATE和DELETE語句如果只想修改或刪除其中某個記錄用帶游標的SELECT語句查出所有滿足條件的記錄從中進一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之
UPDATE語句和DELETE語句中的子句:
WHERECURRENTOF<游標名>
表示修改或刪除的是最近一次取出的記錄,即游標指針指向的記錄二、CURRENT形式的UPDATE和DELETE語句不能使用CURRENT形式的UPDATE語句和DELETE語句:當游標定義中的SELECT語句帶有UNION或ORDERBY子句該SELECT語句相當于定義了一個不可更新的視圖程序?qū)嵗纠恳来螜z查某個系的學生記錄,交互式更新某些學生年齡
EXECSQLBEGINDECLARESECTION;/*主變量說明開始*/ chardeptname[64]; charHSno[64]; charHSname[64]; charHSsex[64]; int HSage; int NEWAGE;EXECSQLENDDECLARESECTION;/*主變量說明結(jié)束*/longSQLCODE;EXECSQLINCLUDEsqlca;/*定義SQL通信區(qū)*/5、程序?qū)嵗齣ntmain(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/*定義游標*/ SELECTSno,Sname,Ssex,Sage/*SX對應語句的執(zhí)行結(jié)果*/ FROMStudent WHERESDept=:deptname; EXECSQLOPENSX;/*打開游標SX便指向查詢結(jié)果的第一行*/5、程序?qū)嵗齠or(;;) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/{ EXECSQLFETCHSXINTO:HSno,:HSname,:HSsex,:HSage; /*推進游標,將當前數(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)?");/*詢問用戶是否要更新該學生的年齡*/ 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; }/*對當前游標指向的學生年齡進行更新*/}EXECSQLCLOSESX;/*關(guān)閉游標SX不再和查詢結(jié)果對應*/ EXECSQLCOMMITWORK;/*提交更新*/ EXECSQLDISCONNECTTEST;/*斷開數(shù)據(jù)庫連接*/}嵌入式SQL嵌入式SQL的處理過程嵌入式SQL語句與主語言之間的通信不使用游標的SQL語句使用游標的SQL語句動態(tài)SQL動態(tài)SQL靜態(tài)嵌入式SQL靜態(tài)嵌入式SQL語句能夠滿足一般要求無法滿足要到執(zhí)行時才能夠確定要提交的SQL語句動態(tài)嵌入式SQL允許在程序運行過程中臨時“組裝”SQL語句支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式動態(tài)SQL簡介一、使用SQL語句主變量二、動態(tài)參數(shù)一、使用SQL語句主變量SQL語句主變量:程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行一、使用SQL語句主變量【例】創(chuàng)建基本表TESTEXECSQLBEGINDECLARESECTION;constchar*stmt="CREATETABLEtest(aint);";/*SQL語句主變量*/EXECSQLENDDECLARESECTION;......EXECSQLEXECUTEIMMEDIATE:stmt; /*執(zhí)行語句*/二、動態(tài)參數(shù)動態(tài)參數(shù)SQL語句中的可變元素使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運行時設(shè)定和主變量的區(qū)別動態(tài)參數(shù)的輸入不是編譯時完成綁定而是通過(prepare)語句準備主變量和執(zhí)行(execute)時綁定數(shù)據(jù)或主變量來完成二、動態(tài)參數(shù)使用動態(tài)參數(shù)的步驟:1.聲明SQL語句主變量。 2.準備SQL語句(PREPARE)。 EXECSQLPREPARE<語句名>FROM<SQL語句主變量>;3.執(zhí)行準備好的語句(EXECUTE) EXECSQLEXECUTE<語句名>[INTO<主變量表>][USING<主變量或常量>];二、動態(tài)參數(shù)【例】向TEST中插入元組EXECSQLBEGINDECLARESECTION;constchar*stmt="INSERTINTOtestVALUES(?);";/*聲明SQL主變量*/EXECSQLENDDECLARESECTION;......EXECSQLPREPAREmystmtFROM:stmt;/*準備語句*/......EXECSQLEXECUTEmystmtUSING100;/*執(zhí)行語句*/EXECSQLEXECUTEmystmtUSING200;/*執(zhí)行語句*/數(shù)據(jù)庫編程嵌入式SQL
存儲過程
ODBC編程存儲過程SQL-invokedroutines:存儲過程(SQL-invokedprocedure)函數(shù)(SQL-invokedfunction)存儲過程PL/SQL的塊結(jié)構(gòu)變量常量的定義控制結(jié)構(gòu)存儲過程PL/SQL的塊結(jié)構(gòu)PL/SQL:SQL的擴展增加了過程化語句功能基本結(jié)構(gòu)是塊塊之間可以互相嵌套每個塊完成一個邏輯操作PL/SQL的塊結(jié)構(gòu)PL/SOL塊的基本結(jié)構(gòu):
1.定義部分
DECLARE ------變量、常量、游標、異常等定義的變量、常量等只能在該基本塊中使用當基本塊執(zhí)行結(jié)束時,定義就不再存在PL/SQL的塊結(jié)構(gòu)PL/SOL塊的基本結(jié)構(gòu)(續(xù)):2.執(zhí)行部分BEGIN ------SQL語句、PL/SQL的流程控制語句 EXCEPTION------異常處理部分 END;變量常量的定義1.PL/SQL中定義變量的語法形式是:
變量名數(shù)據(jù)類型[[NOTNULL]:=初值表達式]或 變量名數(shù)據(jù)類型[[NOTNULL]初值表達式]2.常量的定義類似于變量的定義:
常量名數(shù)據(jù)類型CONSTANT:=常量表達式 常量必須要給一個值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,PL/SQL將返回一個異常。3.賦值語句
變量名稱:=表達式控制結(jié)構(gòu)PL/SQL
功能:一、條件控制語句二、循環(huán)控制語句三、錯誤處理控制結(jié)構(gòu)>>
條件控制語句IF-THEN,IF-THEN-ELSE和嵌套的IF語句
1.IFconditionTHEN
Sequence_of_statements; ENDIF 2.IFconditionTHEN
Sequence_of_statements1; ELSE
Sequence_of_statements2;
ENDIF; 3.在THEN和ELSE子句中還可以再包括IF語句,即IF語句可以嵌套??刂平Y(jié)構(gòu)>>循環(huán)控制語句
LOOP,WHILE-LOOP和FOR-LOOP
1.最簡單的循環(huán)語句LOOP LOOP Sequence_of_statements;
ENDLOOP; 多數(shù)數(shù)據(jù)庫服務(wù)器的PL/SQL都提供EXIT、BREAK或LEAVE等循環(huán)結(jié)束語句,保證LOOP語句塊能夠結(jié)束??刂平Y(jié)構(gòu)>>循環(huán)控制語句2.WHILE-LOOPWHILEconditionLOOP
Sequence_of_statements; ENDLOOP;每次執(zhí)行循環(huán)體語句之前,首先對條件進行求值如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語句序列。如果條件為假,則跳過循環(huán)并把控制傳遞給下一個語句3.FOR-LOOP FORcountIN[REVERSE]bound1…bound2LOOP
Sequence_of_statements; ENDLOOP;控制結(jié)構(gòu)>>錯誤處理如果PL/SQL在執(zhí)行時出現(xiàn)異常,則應該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句SQL標準對數(shù)據(jù)庫服務(wù)器提供什么樣的異常處理做出了建議,要求PL/SQL管理器提供完善的異常處理機制存儲過程PL/SQL塊類型:命名塊:編譯后保存在數(shù)據(jù)庫中,可以被反復調(diào)用,運行速度較快。存儲過程和函數(shù)是命名塊匿名塊:每次執(zhí)行時都要進行編譯,它不能被存儲到數(shù)據(jù)庫中,也不能在其他的PL/SQL塊中調(diào)用存儲過程一、存儲過程的優(yōu)點二、存儲過程的用戶接口三、游標存儲過程>>
存儲過程的優(yōu)點存儲過程:由PL/SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,使用時只要調(diào)用即可。一、存儲過程的優(yōu)點:1.運行效率高2.降低了客戶機和服務(wù)器之間的通信量 3.方便實施企業(yè)規(guī)則存儲過程>>
存儲過程的用戶接口二、存儲過程的用戶接口:
1.創(chuàng)建存儲過程
2.執(zhí)行存儲過程
3.刪除存儲過程存儲過程>>
存儲過程的用戶接口1.創(chuàng)建存儲過程:
CREATEProcedure過程名([參數(shù)1,參數(shù)2,...])AS <PL/SQL塊>;過程名:數(shù)據(jù)庫服務(wù)器合法的對象標識參數(shù)列表:用名字來標識調(diào)用時給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù)。默認為輸入?yún)?shù)。過程體:是一個<PL/SQL塊>。包括聲明部分和可執(zhí)行語句部分
存儲過程>>
存儲過程的用戶接口【例】利用存儲過程來實現(xiàn)下面的應用:從一個賬戶轉(zhuǎn)指定數(shù)額的款項到另一個賬戶中。CREATEPROCEDURETRANSFER(inAccountINT,outAccountINT,amountFLOAT) ASDECLARE totalDepositFLOAT; BEGIN/*檢查轉(zhuǎn)出賬戶的余額*/ SELECTtotalINTOtotalDepositFROMACCOUNTWHEREACCOUNTNUM=outAccount; IFtotalDepositISNULLTHEN/*賬戶不存在或賬戶中沒有存款*/ ROLLBACK; RETURN; ENDIF;存儲過程>>
存儲過程的用戶接口
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;存儲過程>>
存儲過程的用戶接口重命名存儲過程
ALTERProcedure過程名1RENAMETO過程名2;存儲過程>>
存儲過程的用戶接口2.執(zhí)行存儲過程:
CALL/PERFORMProcedure過程名([參數(shù)1,參數(shù)2,...]);使用CALL或者PERFORM等方式激活存儲過程的執(zhí)行。在PL/SQL中,數(shù)據(jù)庫服務(wù)器支持在過程體中調(diào)用其他存儲過程【例】從賬戶01003815868轉(zhuǎn)一萬元到01003813828賬戶中。
CALLProcedureTRANSFER(01003813828,01003815868,10000);
存儲過程>>
存儲過程的用戶接口3.刪除存儲過程
DROPPROCEDURE過程名();三、游標在PL/SQL中,如果SELECT語句只返回一條記錄,可以將該結(jié)果存放到變量中。當查詢返回多條記錄時,就要使用游標對結(jié)果集進行處理一個游標與一個SQL語句相關(guān)聯(lián)。PL/SQL中的游標由PL/SQL引擎管理數(shù)據(jù)庫編程嵌入式SQL
存儲過程
ODBC編程ODBC編程ODBC優(yōu)點:移植性好能同時訪問不同的數(shù)據(jù)庫共享多個數(shù)據(jù)資源ODBC編程數(shù)據(jù)庫互連概述
ODBC工作原理概述
ODBCAPI基礎(chǔ)
ODBC的工作流程數(shù)據(jù)庫互連概述ODBC產(chǎn)生的原因:由于不同的數(shù)據(jù)庫管理系統(tǒng)的存在,在某個RDBMS下編寫的應用程序就不能在另一個RDBMS下運行許多應用程序需要共享多個部門的數(shù)據(jù)資源,訪問不同的RDBMS數(shù)據(jù)庫互連概述ODBC:是微軟公司開放服務(wù)體系(WindowsOpenServicesArchitecture,WOSA)中有關(guān)數(shù)據(jù)庫的一個組成部分提供了一組訪問數(shù)據(jù)庫的標準APIODBC約束力:規(guī)范應用開發(fā)規(guī)范RDBMS應用接口ODBC編程數(shù)據(jù)庫互連概述
ODBC工作原理概述
ODBCAPI基礎(chǔ)
ODBC的工作流程ODBC工作原理概述ODBC應用系統(tǒng)的體系結(jié)構(gòu):一、用戶應用程序二、驅(qū)動程序管理器三、數(shù)據(jù)庫驅(qū)動程序四、ODBC數(shù)據(jù)源管理一、應用程序ODBC應用程序包括的內(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中管理應用程序和驅(qū)動程序之間的通信建立、配置或刪除數(shù)據(jù)源并查看系統(tǒng)當前所安裝的數(shù)據(jù)庫ODBC驅(qū)動程序主要功能:裝載ODBC驅(qū)動程序選擇和連接正確的驅(qū)動程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的合法性記錄ODBC函數(shù)的調(diào)用等三、數(shù)據(jù)庫驅(qū)動程序ODBC通過驅(qū)動程序來提供應用系統(tǒng)與數(shù)據(jù)庫平臺的獨立性O(shè)DBC應用程序不能直接存取數(shù)據(jù)庫其各種操作請求由驅(qū)動程序管理器提交給某個RDBMS的ODBC驅(qū)動程序通過調(diào)用驅(qū)動程序所支持的函數(shù)來存取數(shù)據(jù)庫。數(shù)據(jù)庫的操作結(jié)果也通過驅(qū)動程序返回給應用程序。如果應用程序要操縱不同的數(shù)據(jù)庫,就要動態(tài)地鏈接到不同的驅(qū)動程序上。
三、數(shù)據(jù)庫驅(qū)動程序ODBC驅(qū)動程序類型:單束數(shù)據(jù)源和應用程序在同一臺機器上驅(qū)動程序直接完成對數(shù)據(jù)文件的I/O操作驅(qū)動程序相當于數(shù)據(jù)管理器多束
支持客戶機/服務(wù)器、客戶機/應用服務(wù)器/數(shù)據(jù)庫服務(wù)器等網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)訪問由驅(qū)動程序完成數(shù)據(jù)庫訪問請求的提交和結(jié)果集接收應用程序使用驅(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ù)源名(DataSourceName,簡稱DSN),并映射到所有必要的、用來存取數(shù)據(jù)的低層軟件在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫名等最終用戶無需知道DBMS或其他數(shù)據(jù)管理軟件、網(wǎng)絡(luò)以及有關(guān)ODBC驅(qū)動程序的細節(jié)四、ODBC數(shù)據(jù)源管理例如,假設(shè)某個學校在MSSQLServer和KingbaseES上創(chuàng)建了兩個數(shù)據(jù)庫:學校人事數(shù)據(jù)庫和教學科研數(shù)據(jù)庫。學校的信息系統(tǒng)要從這兩個數(shù)據(jù)庫中存取數(shù)據(jù)為方便與兩個數(shù)據(jù)庫連接,為學校人事數(shù)據(jù)庫創(chuàng)建一個數(shù)據(jù)源名PERSON,為教學科研數(shù)據(jù)庫創(chuàng)建一個名為EDU的數(shù)據(jù)源。當要訪問每一個數(shù)據(jù)庫時,只要與PERSON和EDU連接即可,不需要記住使用的驅(qū)動程序、服務(wù)器名稱、數(shù)據(jù)庫名
ODBC編程>>
ODBCAPI基礎(chǔ)ODBC應用程序接口的一致性API一致性API一致性級別有核心級、擴展1級、擴展2級語法一致性語法一致性級別有最低限度SQL語法級、核心SQL語法級、擴展SQL語法級ODBCAPI基礎(chǔ)一、函數(shù)概述二、句柄及其屬性三、數(shù)據(jù)類型一、函數(shù)概述ODBC3.0標準提供了76個函數(shù)接口:分配和釋放環(huán)境句柄、連接句柄、語句句柄;連接函數(shù)(SQLDriverconnect等);與信息相關(guān)的函數(shù)(如獲取描述信息函數(shù)SQLGetinfo、SQLGetFuction);事務(wù)處理函數(shù)(如SQLEndTran);執(zhí)行相關(guān)函數(shù)(SQLExecdirect、SQLExecute等);編目函數(shù),ODBC3.0提供了11個編目函數(shù)如SQLTables、SQLColumn等,應用程序可以通過對編目函數(shù)的調(diào)用來獲取數(shù)據(jù)字典的信息如權(quán)限、表結(jié)構(gòu)等
一、函數(shù)概述ODBC1.0和ODBC2.x、ODBC3.x函數(shù)使用上有很多差異MFCODBC對較復雜的ODBCAPI進行了封裝,提供了簡化的調(diào)用接口二、句柄及其屬性句柄是32位整數(shù)值,代表一個指針ODBC3.0中句柄分類:環(huán)境句柄連接句柄語句句柄描述符句柄二、句柄及其屬性應用程序句柄之間的關(guān)系
應用程序句柄之間的關(guān)系
二、句柄及其屬性1.每個ODBC應用程序需要建立一個ODBC環(huán)境,分配一個環(huán)境句柄,存取數(shù)據(jù)的全局性背景如環(huán)境狀態(tài)、當前環(huán)境狀態(tài)診斷、當前在環(huán)境上分配的連接句柄等;2.一個環(huán)境句柄可以建立多個連接句柄,每一個連接句柄實現(xiàn)與一個數(shù)據(jù)源之間的連接;二、句柄及其屬性3.在一個連接中可以建立多個語句句柄,它不只是一個SQL語句,還包括SQL語句產(chǎn)生的結(jié)果集以及相關(guān)的信息等;4.在ODBC3.0中又提出了描述符句柄的概念,它是描述SQL語句的參數(shù)、結(jié)果集列的元數(shù)據(jù)集合。三、數(shù)據(jù)類型ODBC數(shù)據(jù)類型:SQL數(shù)據(jù)類型:用于數(shù)據(jù)源C數(shù)據(jù)類型:用于應用程序的C代碼應用程序可以通過SQLGetTypeInfo來獲取不同的驅(qū)動程序?qū)τ跀?shù)據(jù)類型的支持情況三、數(shù)據(jù)類型SQL數(shù)據(jù)類型C數(shù)據(jù)類型SQL數(shù)據(jù)類型數(shù)據(jù)源之間轉(zhuǎn)換應用程序變量傳送到語句參數(shù)(SQLBindparameter)C數(shù)據(jù)類型從結(jié)果集列中返回到應用程序變量(SQLBindcol)應用程序變量之間轉(zhuǎn)換SQL數(shù)據(jù)類型和C數(shù)據(jù)類型之間的轉(zhuǎn)換規(guī)則ODBC編程數(shù)據(jù)庫互連概述
ODBC工作原理概述
ODBCAPI基礎(chǔ)
ODBC的工作流程ODBC的工作流程ODBC的工作流程:ODBC的工作流程【例】將KingbaseES數(shù)據(jù)庫中Student表的數(shù)據(jù)備份到SQLSERVER數(shù)據(jù)庫中。該應用涉及兩個不同的RDBMS中的數(shù)據(jù)源使用ODBC來開發(fā)應用程序,只要改變應用程序中連接函數(shù)(SQLConnect)的參數(shù),就可以連接不同RDBMS的驅(qū)動程序,連接兩個數(shù)據(jù)源ODBC的工作流程在應用程序運行前,已經(jīng)在KingbaseES和SQLSERVER中分別建立了STUDENT關(guān)系表
CREATETABLEStudent
(SnoCHAR(9)PRIMARYKEY,
SnameCHAR(20)UNQUESsexCHAR(2),
SageSMALLINT,
SdeptCHAR(20));ODBC的工作流程應用程序要執(zhí)行的操作是:在KingbaseES上執(zhí)行SELECT*FROMSTUDENT;把獲取的結(jié)果集,通過多次執(zhí)行
INSERTINTOSTUDENT(Sno,Sname,Ssex,Sage,Sddept)VALUES(?,?,?,?,?);插入到SQLSERVER的STUDENT表中ODBC的工作流程操作步驟:
一、配置數(shù)據(jù)源 二、初始化環(huán)境 三、建立連接 四、分配語句句柄 五、執(zhí)行SQL語句 六、結(jié)果集處理 七、中止處理一、配置數(shù)據(jù)源配置數(shù)據(jù)源兩種方法:⑴運行數(shù)據(jù)源管理工具來進行配置;⑵使用DriverManager提供的ConfigDsn函數(shù)來增加、修
改或刪除數(shù)據(jù)源在[例13]中,采用了第一種方法創(chuàng)建數(shù)據(jù)源。因為要同時用到KingbaseES和SQLServer,所以分別建立兩個數(shù)據(jù)源,將其取名為KingbaseESODBC和SQLServer。一、配置數(shù)據(jù)源【例】創(chuàng)建數(shù)據(jù)源的詳細過程#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開頭的表示的是連接KingbaseES的變量 //以server開頭的表示的是連接SQLSERVER的變量 SQLHENVkinghenv,serverhenv; //環(huán)境句柄 SQLHDBC kinghdbc,serverhdbc; //連接句柄 SQLHSTMT kinghstmt,serverhstmt; //語句句柄 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)境沒有和具體的驅(qū)動程序相關(guān)聯(lián),由DriverManager來進行控制,并配置環(huán)境屬性應用程序通過調(diào)用連接函數(shù)和某個數(shù)據(jù)源進行連接后,DriverManager才調(diào)用所連的驅(qū)動程序中的SQLAllocHandle,來真正分配環(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);三、建立連接應用程序調(diào)用SQLAllocHandle分配連接句柄,通過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))//連接失敗時返回錯誤值 return-1;ret=SQLConnect(serverhdbc,"SQLServer",SQL_NTS,"sa", SQL_NTS,"sa",SQL_NTS);if(!SQL_SUCCEEDED(ret)) //連接失敗時返回錯誤值 return-1;四、分配語句句柄處理任何SQL語句之前,應用程序還需要首先分配一個語句句柄語句句柄含有具體的SQL語句以及輸出的結(jié)果集等信息上例中分配了兩個語句句柄:一個用來從KingbaseES中讀取數(shù)據(jù)產(chǎn)生結(jié)果集(kinghstmt)一個用來向SQLSERVER插入數(shù)據(jù)(serverhstmt)應用程序還可以通過SQLtStmtAttr來設(shè)置語句屬性(也可以使用默認值)
分配語句句柄代碼【例】創(chuàng)建數(shù)據(jù)源---第四步/*Step4:初始化語句句柄*/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語句應用程序處理SQL語句的兩種方式:預處理(SQLPrepare、SQLExecute適用于語句的多次執(zhí)行)直接執(zhí)行(SQLExecdirect)
如果SQL語句含有參數(shù),應用程序為每個參數(shù)調(diào)用SQLBindParameter,并把它們綁定至應用程序變量
應用程序可以直接通過改變應用程序緩沖區(qū)的內(nèi)容從而在程序中動態(tài)的改變SQL語句的具體執(zhí)行執(zhí)行SQL語句應用程序根據(jù)語句的類型進行的處理有結(jié)果集的語句(select或是編目函數(shù)),則進行結(jié)果集處理。沒有結(jié)果集的函數(shù),可以直接利用本語句句柄繼續(xù)執(zhí)行新的語句或是獲取行計數(shù)(本次執(zhí)行所影響的行數(shù))之后繼續(xù)執(zhí)行。
在上例中,使用SQLExecdirect獲取KingbaseES中的結(jié)果集,并將結(jié)果集根據(jù)各列不同的數(shù)據(jù)類型綁定到用戶程序緩沖區(qū)在插入數(shù)據(jù)時,采用了預編譯的方式,首先通過SQLPrepare來預處理SQL語句,將每一列綁定到用戶緩沖區(qū)應用程序可以直接修改結(jié)果集緩沖區(qū)的內(nèi)容
程序源碼【例】創(chuàng)建數(shù)據(jù)源---第五步:執(zhí)行SQL語句/*Step5:兩種方式執(zhí)行語句*//*預編譯帶有參數(shù)的語句*/ret=SQLPrepare(serverhstmt,"INSERTINTOSTUDENT(SNO,SNAME,SSEX,SAGE,SDEPT)VALUES(?,?,?,?,?)",SQL_NTS);if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_W
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鏟車裝費合同范本
- 餐飲 委托加工合同范本
- 加工車間用工合同范本
- 村鎮(zhèn)門面出售合同范本
- 匡威加盟合同范本
- 家鄉(xiāng)傳統(tǒng)美食展-六年級語文下冊一單元《臘八粥》任務(wù)型教學設(shè)計
- 合肥新房投資合同范本
- 2025合同范本電子產(chǎn)品購銷合同
- 2025合同范本之辦公樓租賃合同租戶版
- 2025版助學貸款合同示范文本
- 婦女營養(yǎng)保健培訓
- 時間序列的平穩(wěn)性測試題及答案
- 2025-2030中國數(shù)據(jù)要素市場發(fā)展前景及趨勢預測分析研究報告
- 陜西秦農(nóng)銀行招聘筆試真題2024
- 執(zhí)法人員禮儀規(guī)范培訓
- 4.1 中國的機遇與挑戰(zhàn)課件 -2024-2025學年統(tǒng)編版道德與法治九年級下冊
- 2025-2030中國纖維增強聚合物(FRP)鋼筋行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 茅臺學院《汽車理論A》2023-2024學年第二學期期末試卷
- 中外航海文化知到課后答案智慧樹章節(jié)測試答案2025年春中國人民解放軍海軍大連艦艇學院
- 大學美育 課程標準
- 育兒嫂合同范本內(nèi)容
評論
0/150
提交評論