版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)庫系統(tǒng)概論AnIntroductiontoDatabaseSystem
第八章數(shù)據(jù)庫編程第八章數(shù)據(jù)庫編程8.1嵌入式SQL8.2存儲(chǔ)過程8.3ODBC編程8.1嵌入式SQLSQL語言提供了兩種不同的使用方式:交互式嵌入式為什么要引入嵌入式SQLSQL語言是非過程性語言事務(wù)處理應(yīng)用需要高級(jí)語言這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語句要做某些必要的擴(kuò)充8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動(dòng)態(tài)SQL8.1.6小結(jié)8.1.1嵌入式SQL的處理過程主語言嵌入式SQL是將SQL語句嵌入程序設(shè)計(jì)語言中,被嵌入的程序設(shè)計(jì)語言,如C、C++、Java,稱為宿主語言,簡(jiǎn)稱主語言。處理過程預(yù)編譯方法嵌入式SQL的處理過程(續(xù))主語言程序含ESQL語句RDBMS的預(yù)處理程序ESQL語句轉(zhuǎn)換為函數(shù)調(diào)用主語言編譯程序目標(biāo)語言程序ESQL基本處理過程嵌入式SQL的處理過程(續(xù))為了區(qū)分SQL語句與主語言語句,所有SQL語句必須加前綴EXECSQL,以(;)結(jié)束:EXECSQL<SQL語句>;8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL與主語言的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動(dòng)態(tài)SQL8.1.6小結(jié)8.1.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到高級(jí)語言中混合編程,程序中會(huì)含有兩種不同計(jì)算模型的語句SQL語句描述性的面向集合的語句負(fù)責(zé)操縱數(shù)據(jù)庫高級(jí)語言語句過程性的面向記錄的語句負(fù)責(zé)控制程序流程它們之間應(yīng)該如何通信?嵌入式SQL語句與主語言之間的通信(續(xù))數(shù)據(jù)庫工作單元與源程序工作單元之間的通信:1.SQL通信區(qū)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息使主語言能夠據(jù)此控制程序流程2.主變量主語言向SQL語句提供參數(shù)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進(jìn)一步處理3.游標(biāo)解決集合性操作語言與過程性操作語言的不匹配一、SQL通信區(qū)SQLCA:SQLCommunicationAreaSQLCA是一個(gè)數(shù)據(jù)結(jié)構(gòu)SQLCA的用途SQL語句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息
描述系統(tǒng)當(dāng)前工作狀態(tài)描述運(yùn)行環(huán)境這些信息將送到SQL通信區(qū)SQLCA中應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句SQL通信區(qū)SQLCA使用方法:定義SQLCA
用EXECSQLINCLUDESQLCA定義使用SQLCASQLCA中有一個(gè)存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯(cuò)應(yīng)用程序每執(zhí)行完一條SQL語句之后都應(yīng)該測(cè)試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理二、主變量主變量嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)在SQL語句中使用的主語言程序變量簡(jiǎn)稱為主變量(HostVariable)主變量(續(xù))
主變量的類型輸入主變量:應(yīng)用程序?qū)ζ滟x值,SQL語句引用輸出主變量:SQL語句賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序一個(gè)主變量有可能既是輸入主變量又是輸出主變量主變量(續(xù))
指示變量:一個(gè)主變量可以附帶一個(gè)指示變量(IndicatorVariable)什么是指示變量:是一個(gè)整型變量,用來“指示”所指主變量的值或條件,如指示輸入主變量是否為空置,檢測(cè)輸出主變量是否空置。主變量(續(xù))
在SQL語句中使用主變量和指示變量的方法1)說明主變量和指示變量BEGINDECLARESECTION ......... .........(說明主變量和指示變量) .........ENDDECLARESECTION主變量(續(xù))
2)使用主變量說明之后的主變量可以在SQL語句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn)為了與數(shù)據(jù)庫對(duì)象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(hào)(:)作為標(biāo)志3)使用指示變量
指示變量前也必須加冒號(hào)標(biāo)志必須緊跟在所指主變量之后主變量(續(xù))
在SQL語句之外(主語言語句中)使用主變量和指示變量的方法可以直接引用,不必加冒號(hào)三、游標(biāo)(cursor)為什么要使用游標(biāo)
SQL語言與主語言具有不同數(shù)據(jù)處理方式SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式游標(biāo)(續(xù))游標(biāo)游標(biāo)是系統(tǒng)為用戶開設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果每個(gè)游標(biāo)區(qū)都有一個(gè)名字用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理四、建立和關(guān)閉數(shù)據(jù)庫連接建立數(shù)據(jù)庫連接
EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];
target是要連接的數(shù)據(jù)庫服務(wù)器:常見的服務(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ù)庫連接
EXECSQLDISCONNECT[connection];程序運(yùn)行過程中可以修改當(dāng)前連接:
EXECSQLSETCONNECTIONconnection-name|DEFAULT;8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動(dòng)態(tài)SQL8.1.6小結(jié)8.1.3不用游標(biāo)的SQL語句不用游標(biāo)的SQL語句的種類說明性語句數(shù)據(jù)定義語句數(shù)據(jù)控制語句查詢結(jié)果為單記錄的SELECT語句非CURRENT形式的增刪改語句不用游標(biāo)的SQL語句(續(xù))一、查詢結(jié)果為單記錄的SELECT語句
二、非CURRENT形式的增刪改語句一、查詢結(jié)果為單記錄的SELECT語句這類語句不需要使用游標(biāo),只需要用INTO子句指定存放查詢結(jié)果的主變量
[例2]根據(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語句(續(xù))(1)INTO子句、WHERE子句和HAVING短語的條件表達(dá)式中均可以使用主變量(2)查詢返回的記錄中,可能某些列為空值NULL,可用指示變量表示。指示變量只能用于INTO字句中。(3)如果查詢結(jié)果實(shí)際上并不是單條記錄,而是多條記錄,則程序出錯(cuò),RDBMS會(huì)在SQLCA中返回錯(cuò)誤信息查詢結(jié)果為單記錄的SELECT語句(續(xù))[例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形式的增刪改語句在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量[例4]修改某個(gè)學(xué)生選修1號(hào)課程的成績(jī)。
EXECSQLUPDATESCSETGrade=:newgrade
/*修改的成績(jī)已賦給主變量*/WHERESno=:givensno;/*學(xué)號(hào)賦給主變量givensno*/非CURRENT形式的增刪改語句(續(xù))[例5]將計(jì)算機(jī)系全體學(xué)生年齡置NULL值。
Sageid=-1;
EXECSQLUPDATEStudentSETSage=:Raise:SageidWHERESdept=‘CS’;將指示變量Sageid賦一個(gè)負(fù)值后,無論主變量Raise為何值,RDBMS都會(huì)將CS系所有學(xué)生的年齡置空值
。等價(jià)于:
EXECSQLUPDATEStudentSETSage=NULLWHERESdept='CS';非CURRENT形式的增刪改語句(續(xù))[例6]某個(gè)學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已賦給主變量stdname。
EXECSQLDELETEFROMSCWHERESno=(SELECTSnoFROMStudentWHERESname=:stdname);非CURRENT形式的增刪改語句(續(xù))[例7]某個(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ù)值
8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動(dòng)態(tài)SQL8.1.6小結(jié)8.1.4使用游標(biāo)的SQL語句必須使用游標(biāo)的SQL語句查詢結(jié)果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句使用游標(biāo)的SQL語句(續(xù))一、查詢結(jié)果為多條記錄的SELECT語句二、CURRENT形式的UPDATE和DELETE語句一、查詢結(jié)果為多條記錄的SELECT語句使用游標(biāo)的步驟1.說明游標(biāo)2.打開游標(biāo)3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄
4.關(guān)閉游標(biāo)1.說明游標(biāo)使用DECLARE語句語句格式
EXECSQLDECLARE<游標(biāo)名>CURSORFOR<SELECT語句>;功能是一條說明性語句,這時(shí)DBMS并不執(zhí)行SELECT指定的查詢操作。2.打開游標(biāo)使用OPEN語句語句格式
EXECSQLOPEN<游標(biāo)名>;功能打開游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中第一條記錄3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄
使用FETCH語句語句格式
EXECSQLFETCH[[NEXT|PRIOR|FIRST|LAST]FROM]<游標(biāo)名>INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...;推進(jìn)游標(biāo)指針并取當(dāng)前記錄(續(xù))功能指定方向推動(dòng)游標(biāo)指針,然后將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理NEXT|PRIOR|FIRST|LAST:指定推動(dòng)游標(biāo)指針的方式
NEXT:向前推進(jìn)一條記錄
PRIOR:向回退一條記錄
FIRST:推向第一條記錄
LAST:推向最后一條記錄缺省值為NEXT4.關(guān)閉游標(biāo)使用CLOSE語句語句格式
EXECSQLCLOSE<游標(biāo)名>;功能關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源說明游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果相聯(lián)系二、CURRENT形式的UPDATE語句和DELETE語句CURRENT形式的UPDATE語句和DELETE語句的用途面向集合的操作一次修改或刪除所有滿足條件的記錄CURRENT形式的UPDATE語句和DELETE語句(續(xù))如果只想修改或刪除其中某個(gè)記錄用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄從中進(jìn)一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之UPDATE語句和DELETE語句中的子句:
WHERECURRENTOF<游標(biāo)名>表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄CURRENT形式的UPDATE語句和DELETE語句(續(xù))不能使用CURRENT形式的UPDATE語句和DELETE語句:當(dāng)游標(biāo)定義中的SELECT語句帶有UNION或ORDERBY子句該SELECT語句相當(dāng)于定義了一個(gè)不可更新的視圖程序?qū)嵗?查詢某個(gè)系全體學(xué)生的信息。要查詢的系名由用戶在程序運(yùn)行過程中指定,放在主變量deptname中。
……
EXECSQL
BEGINDECLARESECTION;
……
/*說明主變量deptname,HSno,HSname,HSsex,HSage等*/
……
EXECSQLENDDECLARESECTION;
……
gets(deptname);/*為主變量deptname賦值*/
……44
EXECSQL
DECLARESXCURSORFOR
SELECTSno,Sname,Ssex,Sage
FROMStudent
WHERESdept=:deptname;
EXECSQL
OPENSX;
WHILE(1)/*用循環(huán)逐條處理結(jié)果集中的記錄*/
{
EXECSQL
FETCHSXINTO:HSno,:HSname,:HSsex,:HSage;
if(sqlca.sqlcode<>SUCCESS)/*若所有查詢結(jié)果均已處理完或出現(xiàn)錯(cuò)誤,則退出循環(huán)*/
break;
printf(“%s,%s,%c,%d”,HSno,HSname,HSsex,HSage)};
EXECSQL
CLOSESX;
……45例5.31刪除不及格的成績(jī),60~69分的成績(jī)改為70分,再顯示該學(xué)生的成績(jī)信息While(1){EXECSQLFETCHFROMscxINTO :sno,:cno,:g;
If(nomoretuples)break;
If(g<60)execsqldeletefromscwherecurrentofscx;Else{if(g<70){EXECSQLUPDATEscSETSCORE=70WHERECURRENTOFscx;g=70;}
Printf(“%s,%s,%d\n”,sno,cno,g);}}46卷游標(biāo)的定義和推進(jìn)上節(jié)的游標(biāo)只能沿查詢結(jié)果中元組順序從頭到尾一行行推進(jìn),且不能返回卷游標(biāo)(scrollcursor)可進(jìn)退自如推進(jìn)EXECSQLDECLARE<游標(biāo)名>SCROLLCURSORFORSELECT語句
ENDEXEC47推進(jìn)如下:EXECSQLFETCH{NEXTPRIORFIRSTLASTRELATIVE(整數(shù))
ABSOLUTE(整數(shù))}FROM<游標(biāo)名>INTO<變量表>ENDEXEC48五、程序?qū)嵗齕例1]依次檢查某個(gè)系的學(xué)生記錄,交互式更新某些學(xué)生年齡。EXECSQLBEGINDECLARESECTION;/*主變量說明開始*/ chardeptname[64]; charHSno[64]; charHSname[64]; charHSsex[64];
int
HSage;
int NEWAGE;EXECSQLENDDECLARESECTION;/*主變量說明結(jié)束*/longSQLCODE;EXECSQLINCLUDEsqlca;/*定義SQL通信區(qū)*/程序?qū)嵗ɡm(xù))int
main(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對(duì)應(yīng)語句的執(zhí)行結(jié)果*/ FROMStudent WHERESDept=:deptname; EXECSQLOPENSX;/*打開游標(biāo)SX便指向查詢結(jié)果的第一行*/程序?qū)嵗ɡm(xù))for(;;) /*用循環(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("UPDATE
AGE(y/n)?");/*詢問用戶是否要更新該學(xué)生的年齡*/ do{
scanf("%c",&yn); }
while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y');
程序?qū)嵗ɡm(xù))
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;/*斷開數(shù)據(jù)庫連接*/}嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動(dòng)態(tài)SQL8.1.6小結(jié)
8.1.5動(dòng)態(tài)SQL靜態(tài)嵌入式SQL靜態(tài)嵌入式SQL語句能夠滿足一般要求無法滿足要到執(zhí)行時(shí)才能夠確定要提交的SQL語句動(dòng)態(tài)嵌入式SQL允許在程序運(yùn)行過程中臨時(shí)“組裝”SQL語句支持動(dòng)態(tài)組裝SQL語句和動(dòng)態(tài)參數(shù)兩種形式一、使用SQL語句主變量SQL語句主變量:程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行使用SQL語句主變量(續(xù))[例9]創(chuàng)建基本表TESTEXECSQLBEGINDECLARESECTION;constchar*stmt="CREATETABLEtest(a
int);";/*SQL語句主變量*/EXECSQLENDDECLARESECTION;......EXECSQLEXECUTEIMMEDIATE:stmt; /*執(zhí)行語句*/二、動(dòng)態(tài)參數(shù)動(dòng)態(tài)參數(shù)SQL語句中的可變?cè)厥褂脜?shù)符號(hào)(?)表示該位置的數(shù)據(jù)在運(yùn)行時(shí)設(shè)定和主變量的區(qū)別動(dòng)態(tài)參數(shù)的輸入不是編譯時(shí)完成綁定而是通過(prepare)語句準(zhǔn)備主變量和執(zhí)行(execute)時(shí)綁定數(shù)據(jù)或主變量來完成動(dòng)態(tài)參數(shù)(續(xù))使用動(dòng)態(tài)參數(shù)的步驟:
1.聲明SQL語句主變量。
2.準(zhǔn)備SQL語句(PREPARE)。
EXECSQLPREPARE<語句名>FROM<SQL語句主變量>;
動(dòng)態(tài)參數(shù)(續(xù))使用動(dòng)態(tài)參數(shù)的步驟(續(xù)):
3.執(zhí)行準(zhǔn)備好的語句(EXECUTE)
EXECSQLEXECUTE<語句名>[INTO<主變量表>][USING< 主變量或常量>];動(dòng)態(tài)參數(shù)(續(xù))[例10]向TEST中插入元組。EXECSQLBEGINDECLARESECTION;constchar*stmt="INSERTINTOtestVALUES(?);";/*聲明SQL主變量*/EXECSQLENDDECLARESECTION;......EXECSQLPREPAREmystmtFROM:stmt;/*準(zhǔn)備語句*/......EXECSQLEXECUTEmystmtUSING100;/*執(zhí)行語句*/EXECSQLEXECUTEmystmtUSING200;/*執(zhí)行語句*/第八章數(shù)據(jù)庫編程8.1嵌入式SQL8.2存儲(chǔ)過程8.3ODBC編程8.2.1PL/SQL的塊結(jié)構(gòu)PL/SQL:SQL的擴(kuò)展增加了過程化語句功能基本結(jié)構(gòu)是塊塊之間可以互相嵌套每個(gè)塊完成一個(gè)邏輯操作控制結(jié)構(gòu)(續(xù))一、條件控制語句
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語句可以嵌套
控制結(jié)構(gòu)(續(xù))二、循環(huán)控制語句
LOOP,WHILE-LOOP和FOR-LOOP
1.最簡(jiǎn)單的循環(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)(續(xù))二、循環(huán)控制語句(續(xù))2.WHILE-LOOPWHILEconditionLOOP
Sequence_of_statements; ENDLOOP;每次執(zhí)行循環(huán)體語句之前,首先對(duì)條件進(jìn)行求值如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語句序列。如果條件為假,則跳過循環(huán)并把控制傳遞給下一個(gè)語句3.FOR-LOOP FORcountIN[REVERSE]bound1…bound2LOOP
Sequence_of_statements; ENDLOOP;控制結(jié)構(gòu)(續(xù))三、錯(cuò)誤處理:如果PL/SQL在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句SQL標(biāo)準(zhǔn)對(duì)數(shù)據(jù)庫服務(wù)器提供什么樣的異常處理做出了建議,要求PL/SQL管理器提供完善的異常處理機(jī)制8.2.4存儲(chǔ)過程PL/SQL塊類型:命名塊:編譯后保存在數(shù)據(jù)庫中,可以被反復(fù)調(diào)用,運(yùn)行速度較快。存儲(chǔ)過程和函數(shù)是命名塊匿名塊:每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存儲(chǔ)到數(shù)據(jù)庫中,也不能在其他的PL/SQL塊中調(diào)用存儲(chǔ)過程(續(xù))存儲(chǔ)過程:由PL/SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫服務(wù)器中,使用時(shí)只要調(diào)用即可。一、存儲(chǔ)過程的優(yōu)點(diǎn):
1.運(yùn)行效率高
2.降低了客戶機(jī)和服務(wù)器之間的通信量
3.方便實(shí)施企業(yè)規(guī)則二、存儲(chǔ)過程的用戶接口1.創(chuàng)建存儲(chǔ)過程:
CREATEProcedure過程名([參數(shù)1,參數(shù)2,...])AS <PL/SQL塊>;過程名:數(shù)據(jù)庫服務(wù)器合法的對(duì)象標(biāo)識(shí)參數(shù)列表:用名字來標(biāo)識(shí)調(diào)用時(shí)給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù)。默認(rèn)為輸入?yún)?shù)。過程體:是一個(gè)<PL/SQL塊>。包括聲明部分和可執(zhí)行語句部分
存儲(chǔ)過程的用戶接口(續(xù))createprocedureproc1asselectau_lname,au_fname,phone,addressfromauthorswherestate='CA'createprocedureproc2@lnamevarchar(40),@phonevarchar(12)outputasselect@phone=phonefromauthorswhereau_lname=@lnamedeclare@phonevarchar(12)execproc2'White',@phoneoutputselectphone=@phonego存儲(chǔ)過程的用戶接口(續(xù))重命名存儲(chǔ)過程
ALTERProcedure過程名1RENAMETO過程名2;存儲(chǔ)過程的用戶接口(續(xù))3.刪除存儲(chǔ)過程
DROPPROCEDURE過程名();第八章數(shù)據(jù)庫編程8.1嵌入式SQL8.2存儲(chǔ)過程8.3ODBC編程8.3ODBC編程ODBC優(yōu)點(diǎn):移植性好能同時(shí)訪問不同的數(shù)據(jù)庫共享多個(gè)數(shù)據(jù)資源8.3ODBC編程8.3.1數(shù)據(jù)庫互連概述8.3.2ODBC工作原理概述8.3.3ODBCAPI基礎(chǔ)8.3.4ODBC的工作流程8.3.5小結(jié)8.3.1數(shù)據(jù)庫互連概述ODBC產(chǎn)生的原因:由于不同的數(shù)據(jù)庫管理系統(tǒng)的存在,在某個(gè)RDBMS下編寫的應(yīng)用程序就不能在另一個(gè)RDBMS下運(yùn)行
許多應(yīng)用程序需要共享多個(gè)部門的數(shù)據(jù)資源,訪問不同的RDBMS
數(shù)據(jù)庫互連概述(續(xù))ODBC:是微軟公司開放服務(wù)體系(WindowsOpenServicesArchitecture,WOSA)中有關(guān)數(shù)據(jù)庫的一個(gè)組成部分提供了一組訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)APIODBC約束力:規(guī)范應(yīng)用開發(fā)規(guī)范RDBMS應(yīng)用接口8.3ODBC編程8.3.1數(shù)據(jù)庫互連概述8.3.2ODBC工作原理概述
8.3.3ODBCAPI基礎(chǔ)8.3.4ODBC的工作流程8.3.5小結(jié)8.3.2ODBC工作原理概述ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu):一、用戶應(yīng)用程序二、驅(qū)動(dòng)程序管理器三、數(shù)據(jù)庫驅(qū)動(dòng)程序四、ODBC數(shù)據(jù)源管理一、應(yīng)用程序ODBC應(yīng)用程序包括的內(nèi)容:
請(qǐng)求連接數(shù)據(jù)庫;向數(shù)據(jù)源發(fā)送SQL語句;為SQL語句執(zhí)行結(jié)果分配存儲(chǔ)空間,定義所讀取的數(shù)據(jù)格式;獲取數(shù)據(jù)庫操作結(jié)果,或處理錯(cuò)誤;進(jìn)行數(shù)據(jù)處理并向用戶提交處理結(jié)果;請(qǐng)求事務(wù)的提交和回滾操作;斷開與數(shù)據(jù)源的連接。
二、驅(qū)動(dòng)程序管理器
驅(qū)動(dòng)程序管理器:用來管理各種驅(qū)動(dòng)程序包含在ODBC32.DLL中管理應(yīng)用程序和驅(qū)動(dòng)程序之間的通信建立、配置或刪除數(shù)據(jù)源并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫ODBC驅(qū)動(dòng)程序主要功能:裝載ODBC驅(qū)動(dòng)程序選擇和連接正確的驅(qū)動(dòng)程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的合法性記錄ODBC函數(shù)的調(diào)用等三、數(shù)據(jù)庫驅(qū)動(dòng)程序ODBC通過驅(qū)動(dòng)程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫平臺(tái)的獨(dú)立性O(shè)DBC應(yīng)用程序不能直接存取數(shù)據(jù)庫其各種操作請(qǐng)求由驅(qū)動(dòng)程序管理器提交給某個(gè)RDBMS的ODBC驅(qū)動(dòng)程序通過調(diào)用驅(qū)動(dòng)程序所支持的函數(shù)來存取數(shù)據(jù)庫。數(shù)據(jù)庫的操作結(jié)果也通過驅(qū)動(dòng)程序返回給應(yīng)用程序。如果應(yīng)用程序要操縱不同的數(shù)據(jù)庫,就要?jiǎng)討B(tài)地鏈接到不同的驅(qū)動(dòng)程序上。
四、ODBC數(shù)據(jù)源管理
數(shù)據(jù)源:是最終用戶需要訪問的數(shù)據(jù),包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,是一種數(shù)據(jù)連接的抽象數(shù)據(jù)源對(duì)最終用戶是透明的ODBC給每個(gè)被訪問的數(shù)據(jù)源指定唯一的數(shù)據(jù)源名(DataSourceName,簡(jiǎn)稱DSN),并映射到所有必要的、用來存取數(shù)據(jù)的低層軟件在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫名等最終用戶無需知道DBMS或其他數(shù)據(jù)管理軟件、網(wǎng)絡(luò)以及有關(guān)ODBC驅(qū)動(dòng)程序的細(xì)節(jié)ODBC數(shù)據(jù)源管理(續(xù))例如,假設(shè)某個(gè)學(xué)校在MSSQLServer和KingbaseES上創(chuàng)建了兩個(gè)數(shù)據(jù)庫:學(xué)校人事數(shù)據(jù)庫和教學(xué)科研數(shù)據(jù)庫。學(xué)校的信息系統(tǒng)要從這兩個(gè)數(shù)據(jù)庫中存取數(shù)據(jù)為方便與兩個(gè)數(shù)據(jù)庫連接,為學(xué)校人事數(shù)據(jù)庫創(chuàng)建一個(gè)數(shù)據(jù)源名PERSON,為教學(xué)科研數(shù)據(jù)庫創(chuàng)建一個(gè)名為EDU的數(shù)據(jù)源。當(dāng)要訪問每一個(gè)數(shù)據(jù)庫時(shí),只要與PERSON和EDU連接即可,不需要記住使用的驅(qū)動(dòng)程序、服務(wù)器名稱、數(shù)據(jù)庫名
A中使用AccessDataSource連接到ACCESS通過設(shè)置AccessDataSource控件的DataFile屬性,以指定要連接的Access數(shù)據(jù)庫文件(.mdb文件)。
<asp:AccessDataSourceid="AccessDataSource1"DataFile="~/App_Data/Northwind.mdb"runat="server"SelectCommand="SELECT*FROMEmployees"></asp:AccessDataSource>注:符號(hào)“~”對(duì)應(yīng)于應(yīng)用程序根目錄。
871、連接到SQLServer數(shù)據(jù)庫例如:以集成方式連接到本地SQLServer的Northwind數(shù)據(jù)庫:"PersistSecurityInfo=False; IntegratedSecurity=true; InitialCatalog=Northwind; Server=(local)""PersistSecurityInfo=False;
Trusted_Connection=True;database=Northwind; server=(local)"IntegratedSecurit當(dāng)該值設(shè)置為false時(shí),將在連接中指定用戶ID和密碼;當(dāng)為tr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度烤漆房生產(chǎn)工藝改進(jìn)合同2篇
- 2024年企事業(yè)單位食堂餐飲承包與營養(yǎng)搭配服務(wù)合同3篇
- 2024年度水利工程信息化建設(shè)與運(yùn)維合同3篇
- 2024年度瓷磚行業(yè)品牌策劃與推廣合同范本二零二四版3篇
- 2024年全新版奢侈品質(zhì)押擔(dān)保及品牌授權(quán)合同3篇
- 內(nèi)蒙古大學(xué)創(chuàng)業(yè)學(xué)院《進(jìn)出口實(shí)務(wù)綜合實(shí)訓(xùn)(報(bào)關(guān))》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年園林綠化工程苗木移植及種植施工合同3篇
- 2024年度知識(shí)產(chǎn)權(quán)許可合同:萬達(dá)商業(yè)廣場(chǎng)商標(biāo)使用許可合同3篇
- 2024年農(nóng)業(yè)產(chǎn)業(yè)升級(jí)承包土地合作協(xié)議3篇
- 2024版地質(zhì)勘探成果保密與使用許可合同3篇
- 紅軍故事谷文昌事跡
- 北師大版 2024-2025學(xué)年四年級(jí)數(shù)學(xué)上冊(cè)典型例題系列數(shù)學(xué)好玩其二:數(shù)字編碼(編碼問題)專項(xiàng)練習(xí)(原卷版+解析)
- 安徽建筑大學(xué)C語言程序設(shè)計(jì)及答案
- 園林裝飾行業(yè)分析
- 構(gòu)建以客戶需求為中心的組織架構(gòu)
- 進(jìn)入國際市場(chǎng)的戰(zhàn)略
- 大學(xué)廣播與主持培養(yǎng)主持能力
- 日本干細(xì)胞行業(yè)分析
- 《老年冠心病慢病管理指南(2023版)》解讀
- 消防員職業(yè)發(fā)展規(guī)劃
- 健康龍江行動(dòng)監(jiān)測(cè)評(píng)估報(bào)告
評(píng)論
0/150
提交評(píng)論