An Introduction to Database System 數據庫系統概論An Introduction to Database System 數據庫編程_第1頁
An Introduction to Database System 數據庫系統概論An Introduction to Database System 數據庫編程_第2頁
An Introduction to Database System 數據庫系統概論An Introduction to Database System 數據庫編程_第3頁
An Introduction to Database System 數據庫系統概論An Introduction to Database System 數據庫編程_第4頁
An Introduction to Database System 數據庫系統概論An Introduction to Database System 數據庫編程_第5頁
已閱讀5頁,還剩134頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

會計學1AnIntroductiontoDatabaseSystem數據庫系統概論AnIntroductiontoDatabaseSystem數據庫編程第八章數據庫編程8.1嵌入式SQL8.2存儲過程8.3ODBC編程第1頁/共139頁8.1嵌入式SQLSQL語言提供了兩種不同的使用方式:交互式嵌入式為什么要引入嵌入式SQLSQL語言是非過程性語言事務處理應用需要高級語言這兩種方式細節上有差別,在程序設計的環境下,SQL語句要做某些必要的擴充第2頁/共139頁8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標的SQL語句8.1.4使用游標的SQL語句8.1.5動態SQL8.1.6小結第3頁/共139頁8.1.1嵌入式SQL的處理過程主語言嵌入式SQL是將SQL語句嵌入程序設計語言中,被嵌入的程序設計語言,如C、C++、Java,稱為宿主語言,簡稱主語言。處理過程預編譯方法第4頁/共139頁嵌入式SQL的處理過程(續)主語言程序含ESQL語句RDBMS的預處理程序ESQL語句轉換為函數調用主語言編譯程序目標語言程序ESQL基本處理過程第5頁/共139頁嵌入式SQL的處理過程(續)為了區分SQL語句與主語言語句,所有SQL語句必須加前綴EXECSQL,以(;)結束:EXECSQL<SQL語句>;第6頁/共139頁8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL與主語言的通信8.1.3不使用游標的SQL語句8.1.4使用游標的SQL語句8.1.5動態SQL8.1.6小結第7頁/共139頁8.1.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句SQL語句描述性的面向集合的語句負責操縱數據庫高級語言語句過程性的面向記錄的語句負責控制程序流程它們之間應該如何通信?第8頁/共139頁嵌入式SQL語句與主語言之間的通信(續)數據庫工作單元與源程序工作單元之間的通信:1.SQL通信區向主語言傳遞SQL語句的執行狀態信息使主語言能夠據此控制程序流程2.主變量主語言向SQL語句提供參數將SQL語句查詢數據庫的結果交主語言進一步處理3.游標解決集合性操作語言與過程性操作語言的不匹配第9頁/共139頁一、SQL通信區SQLCA:SQLCommunicationAreaSQLCA是一個數據結構SQLCA的用途SQL語句執行后,RDBMS反饋給應用程序信息

描述系統當前工作狀態描述運行環境這些信息將送到SQL通信區SQLCA中應用程序從SQLCA中取出這些狀態信息,據此決定接下來執行的語句第10頁/共139頁SQL通信區SQLCA使用方法:定義SQLCA

用EXECSQLINCLUDESQLCA定義使用SQLCASQLCA中有一個存放每次執行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯應用程序每執行完一條SQL語句之后都應該測試一下SQLCODE的值,以了解該SQL語句執行情況并做相應處理第11頁/共139頁二、主變量主變量嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數據在SQL語句中使用的主語言程序變量簡稱為主變量(HostVariable)第12頁/共139頁主變量(續)

主變量的類型輸入主變量輸出主變量一個主變量有可能既是輸入主變量又是輸出主變量第13頁/共139頁主變量(續)

指示變量:一個主變量可以附帶一個指示變量(IndicatorVariable)什么是指示變量指示變量的用途第14頁/共139頁主變量(續)

在SQL語句中使用主變量和指示變量的方法1)說明主變量和指示變量BEGINDECLARESECTION ......... .........(說明主變量和指示變量) .........ENDDECLARESECTION第15頁/共139頁主變量(續)

2)使用主變量說明之后的主變量可以在SQL語句中任何一個能夠使用表達式的地方出現為了與數據庫對象名(表名、視圖名、列名等)區別,SQL語句中的主變量名前要加冒號(:)作為標志3)使用指示變量

指示變量前也必須加冒號標志必須緊跟在所指主變量之后第16頁/共139頁主變量(續)

在SQL語句之外(主語言語句中)使用主變量和指示變量的方法可以直接引用,不必加冒號第17頁/共139頁三、游標(cursor)為什么要使用游標

SQL語言與主語言具有不同數據處理方式SQL語言是面向集合的,一條SQL語句原則上可以產生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應用程序輸出數據的要求嵌入式SQL引入了游標的概念,用來協調這兩種不同的處理方式第18頁/共139頁

游標(續)游標游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果每個游標區都有一個名字用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,交由主語言進一步處理第19頁/共139頁四、建立和關閉數據庫連接建立數據庫連接

EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];

target是要連接的數據庫服務器:常見的服務器標識串,如<dbname>@<hostname>:<port>包含服務器標識的SQL串常量DEFAULTconnect-name是可選的連接名,連接必須是一個有效的標識符在整個程序內只有一個連接時可以不指定連接名關閉數據庫連接

EXECSQLDISCONNECT[connection];程序運行過程中可以修改當前連接:

EXECSQLSETCONNECTIONconnection-name|DEFAULT;第20頁/共139頁五、程序實例[例1]依次檢查某個系的學生記錄,交互式更新某些學生年齡。EXECSQLBEGINDECLARESECTION;/*主變量說明開始*/ chardeptname[64]; charHSno[64]; charHSname[64]; charHSsex[64]; int HSage; int NEWAGE;EXECSQLENDDECLARESECTION;/*主變量說明結束*/longSQLCODE;EXECSQLINCLUDEsqlca;/*定義SQL通信區*/第21頁/共139頁程序實例(續)intmain(void)/*C語言主程序開始*/{ int count=0; charyn;/*變量yn代表yes或no*/ printf("Pleasechoosethedepartmentname(CS/MA/IS):"); scanf("%s",deptname);/*為主變量deptname賦值*/ EXECSQLCONNECTTOTEST@localhost:54321USER"SYSTEM"/"MANAGER";/*連接數據庫TEST*/ EXECSQLDECLARESXCURSORFOR/*定義游標*/ SELECTSno,Sname,Ssex,Sage/*SX對應語句的執行結果*/ FROMStudent WHERESDept=:deptname; EXECSQLOPENSX;/*打開游標SX便指向查詢結果的第一行*/第22頁/共139頁程序實例(續)for(;;) /*用循環結構逐條處理結果集中的記錄*/{ EXECSQLFETCHSXINTO:HSno,:HSname,:HSsex,:HSage; /*推進游標,將當前數據放入主變量*/ if(sqlca.sqlcode!=0)/*sqlcode!=0,表示操作不成功*/ break; /*利用SQLCA中的狀態信息決定何時退出循環*/ if(count++==0)/*如果是第一行的話,先打出行頭*/ printf("\n%-10s%-20s%-10s%-10s\n","Sno","Sname","Ssex","Sage"); printf("%-10s%-20s%-10s%-10d\n",HSno,HSname,HSsex,HSage); /*打印查詢結果*/ printf("UPDATEAGE(y/n)?");/*詢問用戶是否要更新該學生的年齡*/ do{ scanf("%c",&yn); } while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y');

第23頁/共139頁程序實例(續) if(yn=='y'||yn=='Y')/*如果選擇更新操作*/ { printf("INPUTNEWAGE:"); scanf("%d",&NEWAGE);/*用戶輸入新年齡到主變量中*/ EXECSQLUPDATEStudent /*嵌入式SQL*/ SETSage=:NEWAGE WHERECURRENTOFSX; }/*對當前游標指向的學生年齡進行更新*/}EXECSQLCLOSESX;/*關閉游標SX不再和查詢結果對應*/ EXECSQLCOMMITWORK;/*提交更新*/ EXECSQLDISCONNECTTEST;/*斷開數據庫連接*/}第24頁/共139頁8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標的SQL語句8.1.4使用游標的SQL語句8.1.5動態SQL8.1.6小結第25頁/共139頁8.1.3不用游標的SQL語句不用游標的SQL語句的種類說明性語句數據定義語句數據控制語句查詢結果為單記錄的SELECT語句非CURRENT形式的增刪改語句第26頁/共139頁不用游標的SQL語句(續)一、查詢結果為單記錄的SELECT語句二、非CURRENT形式的增刪改語句第27頁/共139頁一、查詢結果為單記錄的SELECT語句這類語句不需要使用游標,只需要用INTO子句指定存放查詢結果的主變量[例2]根據學生號碼查詢學生信息。假設已經把要查詢的學生的學號賦給了主變量givensno。EXECSQLSELECTSno,Sname,Ssex,Sage,Sdept INTO:Hsno,:

Hname,:Hsex,:Hage,:HdeptFROMStudentWHERESno=:givensno;第28頁/共139頁查詢結果為單記錄的SELECT語句(續)(1)INTO子句、WHERE子句和HAVING短語的條件表達式中均可以使用主變量(2)查詢返回的記錄中,可能某些列為空值NULL。(3)如果查詢結果實際上并不是單條記錄,而是多條記錄,則程序出錯,RDBMS會在SQLCA中返回錯誤信息第29頁/共139頁查詢結果為單記錄的SELECT語句(續)[例3]查詢某個學生選修某門課程的成績。假設已經把將要查詢的學生的學號賦給了主變量givensno,將課程號賦給了主變量givencno。

EXECSQLSELECTSno,Cno,GradeINTO:Hsno,:Hcno,:Hgrade:Gradeid /*指示變量Gradeid*/FROMSCWHERESno=:givensnoANDCno=:givencno;

如果Gradeid<0,不論Hgrade為何值,均認為該學生成績為空值。第30頁/共139頁二、非CURRENT形式的增刪改語句在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量[例4]修改某個學生選修1號課程的成績。

EXECSQLUPDATESCSETGrade=:newgrade/*修改的成績已賦給主變量*/WHERESno=:givensno;/*學號賦給主變量givensno*/第31頁/共139頁非CURRENT形式的增刪改語句(續)[例5]將計算機系全體學生年齡置NULL值。

Sageid=-1;

EXECSQLUPDATEStudentSETSage=:Raise:SageidWHERESdept=‘CS’;將指示變量Sageid賦一個負值后,無論主變量Raise為何值,RDBMS都會將CS系所有學生的年齡置空值。等價于:

EXECSQLUPDATEStudentSETSage=NULLWHERESdept='CS';第32頁/共139頁非CURRENT形式的增刪改語句(續)[例6]某個學生退學了,現要將有關他的所有選課記錄刪除掉。假設該學生的姓名已賦給主變量stdname。

EXECSQLDELETEFROMSCWHERESno=(SELECTSnoFROMStudentWHERESname=:stdname);第33頁/共139頁非CURRENT形式的增刪改語句(續)[例7]某個學生新選修了某門課程,將有關記錄插入SC表中。假設插入的學號已賦給主變量stdno,課程號已賦給主變量couno。

gradeid=-1;/*用作指示變量,賦為負值*/ EXECSQLINSERTINTOSC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr:gradeid);

由于該學生剛選修課程,成績應為空,所以要把指示變量賦為負值第34頁/共139頁8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標的SQL語句8.1.4使用游標的SQL語句8.1.5動態SQL8.1.6小結第35頁/共139頁8.1.4使用游標的SQL語句必須使用游標的SQL語句查詢結果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句第36頁/共139頁使用游標的SQL語句(續)一、查詢結果為多條記錄的SELECT語句二、CURRENT形式的UPDATE和DELETE語句第37頁/共139頁一、查詢結果為多條記錄的SELECT語句使用游標的步驟1.說明游標2.打開游標3.推進游標指針并取當前記錄4.關閉游標第38頁/共139頁1.說明游標使用DECLARE語句語句格式

EXECSQLDECLARE<游標名>CURSORFOR<SELECT語句>;功能是一條說明性語句,這時DBMS并不執行SELECT指定的查詢操作。第39頁/共139頁2.打開游標使用OPEN語句語句格式

EXECSQLOPEN<游標名>;功能打開游標實際上是執行相應的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區中這時游標處于活動狀態,指針指向查詢結果集中第一條記錄第40頁/共139頁3.推進游標指針并取當前記錄

使用FETCH語句語句格式

EXECSQLFETCH[[NEXT|PRIOR|FIRST|LAST]FROM]<游標名>INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...;第41頁/共139頁推進游標指針并取當前記錄(續)功能指定方向推動游標指針,然后將緩沖區中的當前記錄取出來送至主變量供主語言進一步處理NEXT|PRIOR|FIRST|LAST:指定推動游標指針的方式

NEXT:向前推進一條記錄

PRIOR:向回退一條記錄

FIRST:推向第一條記錄

LAST:推向最后一條記錄缺省值為NEXT第42頁/共139頁4.關閉游標使用CLOSE語句語句格式

EXECSQLCLOSE<游標名>;功能關閉游標,釋放結果集占用的緩沖區及其他資源說明游標被關閉后,就不再和原來的查詢結果集相聯系被關閉的游標可以再次被打開,與新的查詢結果相聯系第43頁/共139頁二、CURRENT形式的UPDATE語句和DELETE語句CURRENT形式的UPDATE語句和DELETE語句的用途面向集合的操作一次修改或刪除所有滿足條件的記錄第44頁/共139頁CURRENT形式的UPDATE語句和DELETE語句(續)如果只想修改或刪除其中某個記錄用帶游標的SELECT語句查出所有滿足條件的記錄從中進一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之UPDATE語句和DELETE語句中的子句:

WHERECURRENTOF<游標名>表示修改或刪除的是最近一次取出的記錄,即游標指針指向的記錄第45頁/共139頁CURRENT形式的UPDATE語句和DELETE語句(續)不能使用CURRENT形式的UPDATE語句和DELETE語句:當游標定義中的SELECT語句帶有UNION或ORDERBY子句該SELECT語句相當于定義了一個不可更新的視圖第46頁/共139頁嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標的SQL語句8.1.4使用游標的SQL語句8.1.5動態SQL8.1.6小結第47頁/共139頁8.1.5動態SQL靜態嵌入式SQL靜態嵌入式SQL語句能夠滿足一般要求無法滿足要到執行時才能夠確定要提交的SQL語句動態嵌入式SQL允許在程序運行過程中臨時“組裝”SQL語句支持動態組裝SQL語句和動態參數兩種形式第48頁/共139頁動態SQL簡介(續)一、使用SQL語句主變量二、動態參數第49頁/共139頁一、使用SQL語句主變量SQL語句主變量:程序主變量包含的內容是SQL語句的內容,而不是原來保存數據的輸入或輸出變量SQL語句主變量在程序執行期間可以設定不同的SQL語句,然后立即執行第50頁/共139頁使用SQL語句主變量(續)[例9]創建基本表TESTEXECSQLBEGINDECLARESECTION;constchar*stmt="CREATETABLEtest(aint);";/*SQL語句主變量*/EXECSQLENDDECLARESECTION;......EXECSQLEXECUTEIMMEDIATE:stmt; /*執行語句*/第51頁/共139頁二、動態參數動態參數SQL語句中的可變元素使用參數符號(?)表示該位置的數據在運行時設定和主變量的區別動態參數的輸入不是編譯時完成綁定而是通過(prepare)語句準備主變量和執行(execute)時綁定數據或主變量來完成第52頁/共139頁動態參數(續)使用動態參數的步驟:

1.聲明SQL語句主變量。

2.準備SQL語句(PREPARE)。

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

第53頁/共139頁動態參數(續)使用動態參數的步驟(續):

3.執行準備好的語句(EXECUTE)

EXECSQLEXECUTE<語句名>[INTO<主變量表>][USING< 主變量或常量>];第54頁/共139頁動態參數(續)[例10]向TEST中插入元組。EXECSQLBEGINDECLARESECTION;constchar*stmt="INSERTINTOtestVALUES(?);";/*聲明SQL主變量*/EXECSQLENDDECLARESECTION;......EXECSQLPREPAREmystmtFROM:stmt;/*準備語句*/......EXECSQLEXECUTEmystmtUSING100;/*執行語句*/EXECSQLEXECUTEmystmtUSING200;/*執行語句*/第55頁/共139頁8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標的SQL語句8.1.4使用游標的SQL語句8.1.5動態SQL8.1.6小結第56頁/共139頁8.1.6小結在嵌入式SQL中,SQL語句與主語言語句分工非常明確

SQL語句直接與數據庫打交道,取出數據庫中的數據。主語言語句控制程序流程對取出的數據做進一步加工處理第57頁/共139頁小結(續)SQL語言是面向集合的,一條SQL語句原則上可以產生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應用程序輸出數據的要求嵌入式SQL引入了游標的概念,用來協調這兩種不同的處理方式第58頁/共139頁第八章數據庫編程8.1嵌入式SQL8.2存儲過程8.3ODBC編程第59頁/共139頁8.2存儲過程SQL-invokedroutines:存儲過程(SQL-invokedprocedure)函數(SQL-invokedfunction)第60頁/共139頁8.2存儲過程8.2.1PL/SQL的塊結構8.2.2變量常量的定義8.2.3控制結構8.2.4存儲過程8.2.5小結第61頁/共139頁8.2.1PL/SQL的塊結構PL/SQL:SQL的擴展增加了過程化語句功能基本結構是塊塊之間可以互相嵌套每個塊完成一個邏輯操作第62頁/共139頁PL/SQL的塊結構(續)PL/SOL塊的基本結構:

1.定義部分

DECLARE ------變量、常量、游標、異常等定義的變量、常量等只能在該基本塊中使用當基本塊執行結束時,定義就不再存在第63頁/共139頁PL/SQL的塊結構(續)PL/SOL塊的基本結構(續):

2.執行部分

BEGIN ------SQL語句、PL/SQL的流程控制語句

EXCEPTION------異常處理部分

END;第64頁/共139頁8.2存儲過程8.2.1PL/SQL的塊結構8.2.2變量常量的定義8.2.3控制結構8.2.4存儲過程8.2.5小結第65頁/共139頁8.2.2變量常量的定義1.PL/SQL中定義變量的語法形式是:

變量名數據類型[[NOTNULL]:=初值表達式]或 變量名數據類型[[NOTNULL]初值表達式]2.常量的定義類似于變量的定義:

常量名數據類型CONSTANT:=常量表達式 常量必須要給一個值,并且該值在存在期間或常量的作用域內不能改變。如果試圖修改它,PL/SQL將返回一個異常。3.賦值語句

變量名稱:=表達式第66頁/共139頁8.2存儲過程8.2.1PL/SQL的塊結構8.2.2變量常量的定義8.2.3控制結構8.2.4存儲過程8.2.5小結第67頁/共139頁8.2.3控制結構PL/SQL

功能:一、條件控制語句二、循環控制語句三、錯誤處理第68頁/共139頁控制結構(續)一、條件控制語句

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語句可以嵌套

第69頁/共139頁控制結構(續)二、循環控制語句

LOOP,WHILE-LOOP和FOR-LOOP

1.最簡單的循環語句LOOP LOOP Sequence_of_statements;

ENDLOOP;

多數數據庫服務器的PL/SQL都提供EXIT、BREAK或LEAVE等循環結束語句,保證LOOP語句塊能夠結束。第70頁/共139頁控制結構(續)二、循環控制語句(續)2.WHILE-LOOPWHILEconditionLOOP

Sequence_of_statements; ENDLOOP;每次執行循環體語句之前,首先對條件進行求值如果條件為真,則執行循環體內的語句序列。如果條件為假,則跳過循環并把控制傳遞給下一個語句3.FOR-LOOP FORcountIN[REVERSE]bound1…bound2LOOP

Sequence_of_statements; ENDLOOP;第71頁/共139頁控制結構(續)三、錯誤處理:如果PL/SQL在執行時出現異常,則應該讓程序在產生異常的語句處停下來,根據異常的類型去執行異常處理語句SQL標準對數據庫服務器提供什么樣的異常處理做出了建議,要求PL/SQL管理器提供完善的異常處理機制第72頁/共139頁8.2存儲過程8.2.1PL/SQL的塊結構8.2.2變量常量的定義8.2.3控制結構8.2.4存儲過程8.2.5小結第73頁/共139頁8.2.4存儲過程PL/SQL塊類型:命名塊:編譯后保存在數據庫中,可以被反復調用,運行速度較快。存儲過程和函數是命名塊匿名塊:每次執行時都要進行編譯,它不能被存儲到數據庫中,也不能在其他的PL/SQL塊中調用第74頁/共139頁存儲過程(續)一、存儲過程的優點二、存儲過程的用戶接口三、游標第75頁/共139頁存儲過程(續)存儲過程:由PL/SQL語句書寫的過程,經編譯和優化后存儲在數據庫服務器中,使用時只要調用即可。一、存儲過程的優點:

1.運行效率高

2.降低了客戶機和服務器之間的通信量

3.方便實施企業規則第76頁/共139頁存儲過程(續)二、存儲過程的用戶接口:

1.創建存儲過程

2.執行存儲過程

3.刪除存儲過程第77頁/共139頁二、存儲過程的用戶接口1.創建存儲過程:

CREATEProcedure過程名([參數1,參數2,...])AS <PL/SQL塊>;過程名:數據庫服務器合法的對象標識參數列表:用名字來標識調用時給出的參數值,必須指定值的數據類型。參數也可以定義輸入參數、輸出參數或輸入/輸出參數。默認為輸入參數。過程體:是一個<PL/SQL塊>。包括聲明部分和可執行語句部分

第78頁/共139頁存儲過程的用戶接口(續)[例11]利用存儲過程來實現下面的應用:從一個賬戶轉指定數額的款項到另一個賬戶中。

CREATEPROCEDURETRANSFER(inAccountINT,outAccountINT,amountFLOAT) ASDECLARE totalDepositFLOAT; BEGIN/*檢查轉出賬戶的余額*

SELECTtotalINTOtotalDepositFROMACCOUNTWHEREACCOUNTNUM=outAccount; IFtotalDepositISNULLTHEN/*賬戶不存在或賬戶中沒有存款*/ ROLLBACK; RETURN; ENDIF;第79頁/共139頁存儲過程的用戶接口(續)IFtotalDeposit<amountTHEN /*賬戶賬戶存款不足*/ ROLLBACK; RETURN; ENDIF; UPDATEaccountSETtotal=total-amount

WHEREACCOUNTNUM=outAccount; /*修改轉出賬戶,減去轉出額*/UPDATEaccountSETtotal=total+amountWHEREACCOUNTNUM=inAccount; /*修改轉入賬戶,增加轉出額*/ COMMIT; /*提交轉賬事務*/ END;第80頁/共139頁存儲過程的用戶接口(續)重命名存儲過程

ALTERProcedure過程名1RENAMETO過程名2;第81頁/共139頁存儲過程的用戶接口(續)2.執行存儲過程:

CALL/PERFORMProcedure過程名([參數1,參數2,...]);使用CALL或者PERFORM等方式激活存儲過程的執行。在PL/SQL中,數據庫服務器支持在過程體中調用其他存儲過程[例12]從賬戶01003815868轉一萬元到01003813828賬戶中。

CALLProcedureTRANSFER(01003813828,01003815868,10000);

第82頁/共139頁存儲過程的用戶接口(續)3.刪除存儲過程

DROPPROCEDURE過程名();第83頁/共139頁三、游標在PL/SQL中,如果SELECT語句只返回一條記錄,可以將該結果存放到變量中。當查詢返回多條記錄時,就要使用游標對結果集進行處理一個游標與一個SQL語句相關聯。PL/SQL中的游標由PL/SQL引擎管理第84頁/共139頁8.2存儲過程8.2.1PL/SQL的塊結構8.2.2變量常量的定義8.2.3控制結構8.2.4存儲過程8.2.5小結第85頁/共139頁8.2.5小結存儲過程的優點經編譯和優化后存儲在數據庫服務器中,運行效率高降低客戶機和服務器之間的通信量有利于集中控制,方便維護第86頁/共139頁第八章數據庫編程8.1嵌入式SQL8.2存儲過程8.3ODBC編程第87頁/共139頁8.3ODBC編程ODBC優點:移植性好能同時訪問不同的數據庫共享多個數據資源第88頁/共139頁8.3ODBC編程8.3.1數據庫互連概述8.3.2ODBC工作原理概述8.3.3ODBCAPI基礎8.3.4ODBC的工作流程8.3.5小結第89頁/共139頁8.3.1數據庫互連概述ODBC產生的原因:由于不同的數據庫管理系統的存在,在某個RDBMS下編寫的應用程序就不能在另一個RDBMS下運行許多應用程序需要共享多個部門的數據資源,訪問不同的RDBMS第90頁/共139頁數據庫互連概述(續)ODBC:是微軟公司開放服務體系(WindowsOpenServicesArchitecture,WOSA)中有關數據庫的一個組成部分提供了一組訪問數據庫的標準APIODBC約束力:規范應用開發規范RDBMS應用接口第91頁/共139頁8.3ODBC編程8.3.1數據庫互連概述8.3.2ODBC工作原理概述

8.3.3ODBCAPI基礎8.3.4ODBC的工作流程8.3.5小結第92頁/共139頁8.3.2ODBC工作原理概述ODBC應用系統的體系結構:一、用戶應用程序二、驅動程序管理器三、數據庫驅動程序四、ODBC數據源管理第93頁/共139頁一、應用程序ODBC應用程序包括的內容:

請求連接數據庫;向數據源發送SQL語句;為SQL語句執行結果分配存儲空間,定義所讀取的數據格式;獲取數據庫操作結果,或處理錯誤;進行數據處理并向用戶提交處理結果;請求事務的提交和回滾操作;斷開與數據源的連接。

第94頁/共139頁二、驅動程序管理器

驅動程序管理器:用來管理各種驅動程序包含在ODBC32.DLL中管理應用程序和驅動程序之間的通信建立、配置或刪除數據源并查看系統當前所安裝的數據庫ODBC驅動程序主要功能:裝載ODBC驅動程序選擇和連接正確的驅動程序管理數據源檢查ODBC調用參數的合法性記錄ODBC函數的調用等第95頁/共139頁三、數據庫驅動程序ODBC通過驅動程序來提供應用系統與數據庫平臺的獨立性ODBC應用程序不能直接存取數據庫其各種操作請求由驅動程序管理器提交給某個RDBMS的ODBC驅動程序通過調用驅動程序所支持的函數來存取數據庫。數據庫的操作結果也通過驅動程序返回給應用程序。如果應用程序要操縱不同的數據庫,就要動態地鏈接到不同的驅動程序上。

第96頁/共139頁數據庫驅動程序(續)ODBC驅動程序類型:單束數據源和應用程序在同一臺機器上驅動程序直接完成對數據文件的I/O操作驅動程序相當于數據管理器多束

支持客戶機/服務器、客戶機/應用服務器/數據庫服務器等網絡環境下的數據訪問由驅動程序完成數據庫訪問請求的提交和結果集接收應用程序使用驅動程序提供的結果集管理接口操縱執行后的結果數據

第97頁/共139頁四、ODBC數據源管理數據源:是最終用戶需要訪問的數據,包含了數據庫位置和數據庫類型等信息,是一種數據連接的抽象數據源對最終用戶是透明的ODBC給每個被訪問的數據源指定唯一的數據源名(DataSourceName,簡稱DSN),并映射到所有必要的、用來存取數據的低層軟件在連接中,用數據源名來代表用戶名、服務器名、所連接的數據庫名等最終用戶無需知道DBMS或其他數據管理軟件、網絡以及有關ODBC驅動程序的細節第98頁/共139頁ODBC數據源管理(續)例如,假設某個學校在MSSQLServer和KingbaseES上創建了兩個數據庫:學校人事數據庫和教學科研數據庫。學校的信息系統要從這兩個數據庫中存取數據為方便與兩個數據庫連接,為學校人事數據庫創建一個數據源名PERSON,為教學科研數據庫創建一個名為EDU的數據源。當要訪問每一個數據庫時,只要與PERSON和EDU連接即可,不需要記住使用的驅動程序、服務器名稱、數據庫名

第99頁/共139頁8.3ODBC編程8.3.1數據庫互連概述8.3.2ODBC工作原理概述8.3.3ODBCAPI基礎

8.3.4ODBC的工作流程8.3.5小結第100頁/共139頁8.3.3ODBCAPI基礎ODBC應用程序接口的一致性API一致性API一致性級別有核心級、擴展1級、擴展2級語法一致性語法一致性級別有最低限度SQL語法級、核心SQL語法級、擴展SQL語法級第101頁/共139頁ODBCAPI基礎(續)一、函數概述二、句柄及其屬性三、數據類型第102頁/共139頁一、函數概述ODBC3.0標準提供了76個函數接口:分配和釋放環境句柄、連接句柄、語句句柄;連接函數(SQLDriverconnect等);與信息相關的函數(如獲取描述信息函數SQLGetinfo、SQLGetFuction);事務處理函數(如SQLEndTran);執行相關函數(SQLExecdirect、SQLExecute等);編目函數,ODBC3.0提供了11個編目函數如SQLTables、SQLColumn等,應用程序可以通過對編目函數的調用來獲取數據字典的信息如權限、表結構等

第103頁/共139頁函數概述(續)ODBC1.0和ODBC2.x、ODBC3.x函數使用上有很多差異MFCODBC對較復雜的ODBCAPI進行了封裝,提供了簡化的調用接口第104頁/共139頁二、句柄及其屬性句柄是32位整數值,代表一個指針ODBC3.0中句柄分類:環境句柄連接句柄語句句柄描述符句柄第105頁/共139頁句柄及其屬性(續)應用程序句柄之間的關系

應用程序句柄之間的關系

第106頁/共139頁句柄及其屬性(續)1.每個ODBC應用程序需要建立一個ODBC環境,分配一個環境句柄,存取數據的全局性背景如環境狀態、當前環境狀態診斷、當前在環境上分配的連接句柄等;2.一個環境句柄可以建立多個連接句柄,每一個連接句柄實現與一個數據源之間的連接;第107頁/共139頁句柄及其屬性(續)3.在一個連接中可以建立多個語句句柄,它不只是一個SQL語句,還包括SQL語句產生的結果集以及相關的信息等;4.在ODBC3.0中又提出了描述符句柄的概念,它是描述SQL語句的參數、結果集列的元數據集合。第108頁/共139頁三、數據類型ODBC數據類型:SQL數據類型:用于數據源C數據類型:用于應用程序的C代碼應用程序可以通過SQLGetTypeInfo來獲取不同的驅動程序對于數據類型的支持情況第109頁/共139頁數據類型(續)SQL數據類型C數據類型SQL數據類型數據源之間轉換應用程序變量傳送到語句參數(SQLBindparameter)C數據類型從結果集列中返回到應用程序變量(SQLBindcol)應用程序變量之間轉換SQL數據類型和C數據類型之間的轉換規則第110頁/共139頁8.3ODBC編程8.3.1數據庫互連概述8.3.2ODBC工作原理概述8.3.3ODBCAPI基礎8.3.4ODBC的工作流程8.3.5小結第111頁/共139頁8.3.4ODBC的工作流程ODBC的工作流程:第112頁/共139頁ODBC的工作流程(續)[例13]將KingbaseES數據庫中Student表的數據備份到SQLSERVER數據庫中。該應用涉及兩個不同的RDBMS中的數據源使用ODBC來開發應用程序,只要改變應用程序中連接函數(SQLConnect)的參數,就可以連接不同RDBMS的驅動程序,連接兩個數據源第113頁/共139頁ODBC的工作流程(續)

在應用程序運行前,已經在KingbaseES和SQLSERVER中分別建立了STUDENT關系表

CREATETABLEStudent

(SnoCHAR(9)PRIMARYKEY,

SnameCHAR(20)UNQUESsexCHAR(2),

SageSMALLINT,

SdeptCHAR(20));第114頁/共139頁ODBC的工作流程(續)應用程序要執行的操作是:在KingbaseES上執行SELECT*FROMSTUDENT;把獲取的結果集,通過多次執行

INSERTINTOSTUDENT(Sno,Sname,Ssex,Sage,Sddept)VALUES(?,?,?,?,?);插入到SQLSERVER的STUDENT表中第115頁/共139頁ODBC的工作流程(續)操作步驟:

一、配置數據源 二、初始化環境 三、建立連接 四、分配語句句柄 五、執行SQL語句 六、結果集處理 七、中止處理第116頁/共139頁一、配置數據源配置數據源兩種方法:⑴運行數據源管理工具來進行配置;⑵使用DriverManager提供的ConfigDsn函數來增加、修

改或刪除數據源在[例13]中,采用了第一種方法創建數據源。因為要同時用到KingbaseES和SQLServer,所以分別建立兩個數據源,將其取名為KingbaseESODBC和SQLServer。第117頁/共139頁配置數據源(續)[例13]創建數據源的詳細過程#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第118頁/共139頁配置數據源(續)[例13]創建數據源---第一步:定義句柄和變量intmain(){ /*Step1定義句柄和變量*/ //以king開頭的表示的是連接KingbaseES的變量

//以server開頭的表示的是連接SQLSERVER的變量

SQLHENVkinghenv,serverhenv; //環境句柄

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;第119頁/共139頁二、初始化環境沒有和具體的驅動程序相關聯,由DriverManager來進行控制,并配置環境屬性應用程序通過調用連接函數和某個數據源進行連接后,DriverManager才調用所連的驅動程序中的SQLAllocHandle,來真正分配環境句柄的數據結構第120頁/共139頁初始化環境代碼[例13]創建數據源---第二步:初始化環境

/*Step2初始化環境*/ 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);第121頁/共139頁三、建立連接應用程序調用SQLAllocHandle分配連接句柄,通過SQLConnect、SQLDriverConnect或SQLBrowseConnect與數據源連接SQLConnect連接函數,輸入參數為:配置好的數據源名稱用戶ID口令

[例13]中KingbaseESODBC為數據源名字,SYSTEM為用戶名,MANAGER為用戶密碼

第122頁/共139頁建立連接代碼[例13]創建數據源---第三步:建立連接/*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;第123頁/共139頁四、分配語句句柄處理任何SQL語句之前,應用程序還需要首先分配一個語句句柄語句句柄含有具體的SQL語句以及輸出的結果集等信息[例13]中分配了兩個語句句柄:一個用來從KingbaseES中讀取數據產生結果集(kinghstmt)一個用來向SQLSERVER插入數據(serverhstmt)應用程序還可以通過SQLtStmtAttr來設置語句屬性(也可以使用默認值)[例13]中結果集綁定的方式為按列綁定

第124頁/共139頁分配語句句柄代碼[例13]創建數據源---第四步/*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);第125頁/共139頁五、執行SQL語句應用程序處理SQL語句的兩種方式:預處理(SQLPrepare、SQLExecute適用于語句的多次執行)直接執行(SQLExecdirect)

如果SQL語句含有參數,應用程序為每個參數調用SQLBindParameter,并把它們綁定至應用程序變量

應用程序可以直接通過改變應用程序緩沖區的內容從而在程序中動態的改變SQL語句的具體執行第126頁/共139頁執行SQL語句(續)應用程序根據語句的類型進行的處理有結果集的語句(select或是編目函數),則進行結果集處理。沒有結果集的函數,可以直接利用本語句句柄繼續執行新的語句或是獲取行計數(本次執行所影響的行數)之后繼續執行。

在[例13]中,使用SQLExecdirect獲取KingbaseES中的結果集,并將結果集根據各列不同的數據類型綁定到用戶程序緩沖區在插入數據時,采用了預編譯的方式,首先通過SQLPrepare來預處理SQL語句,將每一列綁定到用戶緩沖區應用程序可以直接修改結果集緩沖區的內容

第127頁/共139頁程序源碼[例13]創建數據源---第五步:執行SQL語句/*Step5:兩種方式執行語句*//*預編譯帶有參數的語句*/ret=SQLPrepare(serverhstmt,"INSERTINTOSTUDENT(SNO,SNAME,SSEX,SAGE,SDEPT)VALUES(?,?,?,?,?)",SQL_NTS);if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO){ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,SNO_LEN,0

溫馨提示

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

評論

0/150

提交評論