new第四章 關(guān)系數(shù)據(jù)庫標準語言SQL(三)_第1頁
new第四章 關(guān)系數(shù)據(jù)庫標準語言SQL(三)_第2頁
new第四章 關(guān)系數(shù)據(jù)庫標準語言SQL(三)_第3頁
new第四章 關(guān)系數(shù)據(jù)庫標準語言SQL(三)_第4頁
new第四章 關(guān)系數(shù)據(jù)庫標準語言SQL(三)_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)據(jù)庫系統(tǒng)原理

第四章關(guān)系數(shù)據(jù)庫標準語言SQLAnIntroductiontoDatabaseSystem第四章

關(guān)系數(shù)據(jù)庫標準語言SQL4.1SQL概述4.2學(xué)生-課程數(shù)據(jù)庫4.3數(shù)據(jù)定義4.4數(shù)據(jù)查詢4.5數(shù)據(jù)更新4.6視圖4.7嵌入式SQL4.8*使用游標的SQL語句4.9*動態(tài)SQL4.10*PL/SQL與存儲過程AnIntroductiontoDatabaseSystem4.7嵌入式SQLSQL語言提供了兩種不同的使用方式:交互式嵌入式為什么要引入嵌入式SQLSQL語言是非過程性語言事務(wù)處理應(yīng)用需要高級語言AnIntroductiontoDatabaseSystem4.7嵌入式SQL4.7.1嵌入式SQL的一般形式4.7.2嵌入式SQL語句與主語言之間的通信4.7.3不使用游標的SQL語句AnIntroductiontoDatabaseSystem4.7.1嵌入式SQL的一般形式主語言嵌入式SQL是將SQL語句嵌入程序設(shè)計語言中,被嵌入的程序設(shè)計語言,如C、C++、Java,稱為宿主語言,簡稱主語言。處理過程預(yù)編譯方法AnIntroductiontoDatabaseSystem嵌入式SQL的處理過程(續(xù))主語言程序

+嵌入式SQL語句RDBMS的預(yù)處理程序ESQL語句轉(zhuǎn)換為函數(shù)調(diào)用主語言編譯程序目標語言程序ESQL基本處理過程AnIntroductiontoDatabaseSystem嵌入式SQL的處理過程(續(xù))為了區(qū)分SQL語句與主語言語句,所有SQL語句必須加前綴EXECSQL,以(;)結(jié)束:EXECSQL<SQL語句>;AnIntroductiontoDatabaseSystem4.7嵌入式SQL4.7.1嵌入式SQL的處理過程4.7.2嵌入式SQL與主語言的通信4.7.3不使用游標的SQL語句4.7.4使用游標的SQL語句4.7.5動態(tài)SQL4.7.6小結(jié)AnIntroductiontoDatabaseSystem4.7.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句SQL語句描述性的面向集合的語句負責(zé)操縱數(shù)據(jù)庫高級語言語句過程性的面向記錄的語句負責(zé)控制程序流程它們之間應(yīng)該如何通信?AnIntroductiontoDatabaseSystem嵌入式SQL語句與主語言之間的通信(續(xù))數(shù)據(jù)庫工作單元與源程序工作單元之間的通信:1.SQL通信區(qū)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息使主語言能夠據(jù)此控制程序流程2.主變量主語言向SQL語句提供參數(shù)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進一步處理3.游標解決集合性操作語言與過程性操作語言的不匹配AnIntroductiontoDatabaseSystem一、SQL通信區(qū)SQLCA:SQLCommunicationAreaSQLCA是一個數(shù)據(jù)結(jié)構(gòu)SQLCA的用途SQL語句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息

描述系統(tǒng)當前工作狀態(tài)描述運行環(huán)境這些信息將送到SQL通信區(qū)SQLCA中應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句AnIntroductiontoDatabaseSystemSQL通信區(qū)SQLCA使用方法:定義SQLCA

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

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

指示變量:一個主變量可以附帶一個指示變量(IndicatorVariable)指示變量的用途

判斷主變量是否為空。AnIntroductiontoDatabaseSystem主變量(續(xù))

在SQL語句中使用主變量和指示變量的方法1)說明主變量和指示變量BEGINDECLARESECTION ......... .........(說明主變量和指示變量) .........ENDDECLARESECTIONAnIntroductiontoDatabaseSystem主變量(續(xù))

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

指示變量前也必須加冒號標志必須緊跟在所指主變量之后AnIntroductiontoDatabaseSystem主變量(續(xù))

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

SQL語言與主語言具有不同數(shù)據(jù)處理方式SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標的概念,用來協(xié)調(diào)這兩種不同的處理方式AnIntroductiontoDatabaseSystem游標(續(xù))游標游標是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果每個游標區(qū)都有一個名字用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,交由主語言進一步處理AnIntroductiontoDatabaseSystem游標(續(xù))游標使用步驟(1)聲明游標

EXECSQLDECLARE<游標名>CURSORFOR<SELECT語句>;(2)打開游標

EXECSQLOPEN<游標名>AnIntroductiontoDatabaseSystem游標(續(xù))游標使用步驟(3)移動游標指針,然后取當前記錄

EXECSQLFETCH<游標名>INTO<主變量>[<指示變量>],[<主變量>[<指示變量>]];(4)關(guān)閉游標

EXECSQLCLOSE<游標名>AnIntroductiontoDatabaseSystem游標(續(xù))AnIntroductiontoDatabaseSystem4.7嵌入式SQL4.7.1嵌入式SQL的處理過程4.7.2嵌入式SQL語句與主語言之間的通信4.7.3不使用游標的SQL語句4.7.4使用游標的SQL語句4.7.5動態(tài)SQL4.7.6小結(jié)AnIntroductiontoDatabaseSystem4.7.3不用游標的SQL語句不用游標的SQL語句的種類說明性語句數(shù)據(jù)定義語句數(shù)據(jù)控制語句查詢結(jié)果為單記錄的SELECT語句AnIntroductiontoDatabaseSystem不用游標的SQL語句(續(xù))一、查詢結(jié)果為單記錄的SELECT語句二、非CURRENT形式的增刪改語句AnIntroductiontoDatabaseSystem一、查詢結(jié)果為單記錄的SELECT語句這類語句不需要使用游標,只需要用INTO子句指定存放查詢結(jié)果的主變量[例2]根據(jù)學(xué)生號碼查詢學(xué)生信息。假設(shè)已經(jīng)把要查詢的學(xué)生的學(xué)號賦給了主變量givensno。EXECSQLSELECTSno,Sname,Ssex,Sage,Sdept INTO:Hsno,:

Hname

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

EXECSQLSELECTSno,Cno,GradeINTO:Hsno,:Hcno,:Hgrade:Gradeid

/*指示變量Gradeid*/FROMSCWHERESno=:givensnoANDCno=:givencno;

如果Gradeid<0,不論Hgrade為何值,均認為該學(xué)生成績?yōu)榭罩?。AnIntroductiontoDatabaseSystem二、非CURRENT形式的增刪改語句在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量[例4]修改某個學(xué)生選修1號課程的成績。

EXECSQLUPDATESCSETGrade=:newgrade

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

Sageid=-1;

EXECSQLUPDATEStudentSETSage=:Raise:SageidWHERESdept=‘CS’;

將指示變量Sageid賦一個負值后,無論主變量Raise為何值,RDBMS都會將CS系所有學(xué)生的年齡置空值。等價于:

EXECSQLUPDATEStudentSETSage=NULLWHERESdept='CS';AnIntroductiontoDatabaseSystem非CURRENT形式的增刪改語句(續(xù))[例6]某個學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已賦給主變量stdname。

EXECSQLDELETEFROMSCWHERESno=(SELECTSnoFROMStudentWHERESname=:stdname);AnIntroductiontoDatabaseSystem非CURRENT形式的增刪改語句(續(xù))[例7]某個學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號已賦給主變量stdno,課程號已賦給主變量couno。

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

VALUES(:stdno,:couno,:gr:gradeid);

由于該學(xué)生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負值A(chǔ)nIntroductiontoDatabaseSystem第四章

關(guān)系數(shù)據(jù)庫標準語言SQL4.1SQL概述4.2學(xué)生-課程數(shù)據(jù)庫4.3數(shù)據(jù)定義4.4數(shù)據(jù)查詢4.5數(shù)據(jù)更新4.6視圖4.7嵌入式SQL4.8*使用游標的SQL語句4.9*動態(tài)SQL4.10*PL/SQL與存儲過程AnIntroductiontoDatabaseSystem4.8*使用游標的SQL語句4.8.1查詢結(jié)果為多條記錄的SELECT語句4.8.2CURRENT形式的UPDATE和DELETE語句AnIntroductiontoDatabaseSystem一、查詢結(jié)果為多條記錄的SELECT語句使用游標的步驟1.說明游標2.打開游標3.推進游標指針并取當前記錄4.關(guān)閉游標AnIntroductiontoDatabaseSystem1.說明游標使用DECLARE語句語句格式

EXECSQLDECLARE<游標名>CURSORFOR<SELECT語句>;功能是一條說明性語句,這時DBMS并不執(zhí)行SELECT指定的查詢操作。AnIntroductiontoDatabaseSystem2.打開游標使用OPEN語句語句格式

EXECSQLOPEN<游標名>;功能打開游標實際上是執(zhí)行相應(yīng)的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中這時游標處于活動狀態(tài),指針指向查詢結(jié)果集中第一條記錄AnIntroductiontoDatabaseSystem3.推進游標指針并取當前記錄

使用FETCH語句語句格式

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

NEXT:向前推進一條記錄

PRIOR:向回退一條記錄

FIRST:推向第一條記錄

LAST:推向最后一條記錄缺省值為NEXTAnIntroductiontoDatabaseSystem4.關(guān)閉游標使用CLOSE語句語句格式

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

WHERECURRENTOF<游標名>表示修改或刪除的是最近一次取出的記錄,即游標指針指向的記錄AnIntroductiontoDatabaseSystemCURRENT形式的UPDATE語句和DELETE語句(續(xù))不能使用CURRENT形式的UPDATE語句和DELETE語句:當游標定義中的SELECT語句帶有UNION或ORDERBY子句該SELECT語句相當于定義了一個不可更新的視圖

AnIntroductiontoDatabaseSystem第四章

關(guān)系數(shù)據(jù)庫標準語言SQL4.1SQL概述4.2學(xué)生-課程數(shù)據(jù)庫4.3數(shù)據(jù)定義4.4數(shù)據(jù)查詢4.5數(shù)據(jù)更新4.6視圖4.7嵌入式SQL4.8*使用游標的SQL語句4.9*動態(tài)SQL4.10*PL/SQL與存儲過程AnIntroductiontoDatabaseSystem

4.9動態(tài)SQL靜態(tài)嵌入式SQL靜態(tài)嵌入式SQL語句能夠滿足一般要求無法滿足要到執(zhí)行時才能夠確定要提交的SQL語句動態(tài)嵌入式SQL允許在程序運行過程中臨時“組裝”SQL語句支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式AnIntroductiontoDatabaseSystem動態(tài)SQL簡介(續(xù))一、使用SQL語句主變量二、動態(tài)參數(shù)AnIntroductiontoDatabaseSystem一、使用SQL語句主變量SQL語句主變量:程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行AnIntroductiontoDatabaseSystem使用SQL語句主變量(續(xù))[例9]創(chuàng)建基本表TESTEXECSQLBEGINDECLARESECTION;constchar*stmt="CREATETABLEtest(aint);";/*SQL語句主變量*/EXECSQLENDDECLARESECTION;......EXECSQLEXECUTEIMMEDIATE:stmt; /*執(zhí)行語句*/AnIntroductiontoDatabaseSystem二、動態(tài)參數(shù)動態(tài)參數(shù)SQL語句中的可變元素使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運行時設(shè)定和主變量的區(qū)別動態(tài)參數(shù)的輸入不是編譯時完成綁定而是通過(prepare)語句準備主變量和執(zhí)行(execute)時綁定數(shù)據(jù)或主變量來完成AnIntroductiontoDatabaseSystem動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟:

1.聲明SQL語句主變量。constchar*stmt="INSERTINTOtestVALUES(?);";

2.準備SQL語句(PREPARE)。

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

AnIntroductiontoDatabaseSystem動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟(續(xù)):

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

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

關(guān)系數(shù)據(jù)庫標準語言SQL4.1SQL概述4.2學(xué)生-課程數(shù)據(jù)庫4.3數(shù)據(jù)定義4.4數(shù)據(jù)查詢4.5數(shù)據(jù)更新4.6視圖4.7嵌入式SQL4.8*使用游標的SQL語句4.9*動態(tài)SQL4.10*PL/SQL與存儲過程AnIntroductiontoDatabaseSystem4.10*PL/SQL與存儲過程為了增強SQL語言的處理能力,為了提高數(shù)據(jù)庫系統(tǒng)的性能,許多數(shù)據(jù)庫廠家擴展了SQL語言的流程控制功能,使它成為過程性的SQL語言,如Sybase的T-SQL,Oracle的PL/SQL等。1996年,國際標準化組織把這部分功能加進了SQL92標準之中,這就是存儲過程。AnIntroductiontoDatabaseSystem4.10存儲過程4.10.1PL/SQL與存儲過程概述4.10.2PL/SQL的程序結(jié)構(gòu)4.10.3控制結(jié)構(gòu)4.10.4異常處理4.10.5存儲過程4.10.6游標4.10.7觸發(fā)器AnIntroductiontoDatabaseSystem4.10.1PL/SQL與存儲過程概述PL/SQL:(1)什么是PL/SQLPL/SQL是SQL過程化的擴展,也就是擴展了控制語句,使得SQL具有程序模塊結(jié)構(gòu)語言的特征,包括異常處理功能。(2)存儲過程存儲過程是由PL/SQL書寫的,經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中的過程。它們成為SQL服務(wù)器模塊,使用時只要調(diào)用即可。AnIntroductiontoDatabaseSystem4.10存儲過程4.10.1PL/SQL與存儲過程概述4.10.2PL/SQL的程序結(jié)構(gòu)4.10.3控制結(jié)構(gòu)4.10.4異常處理4.10.5存儲過程4.10.6游標4.10.7觸發(fā)器AnIntroductiontoDatabaseSystem4.10.2PL/SQL的程序結(jié)構(gòu)PL/SQL塊可以分為3部分,即聲明部分、可執(zhí)行部分和異常處理部分。其中執(zhí)行部分是必須的,其他兩個部分可選。AnIntroductiontoDatabaseSystem4.10.2PL/SQL的程序結(jié)構(gòu)PL/SOL塊的基本結(jié)構(gòu):

1.聲明部分

DECLARE ------變量、常量、游標、異常等定義的變量、常量等只能在該基本塊中使用當基本塊執(zhí)行結(jié)束時,定義就不再存在AnIntroductiontoDatabaseSystem變量常量的定義1).PL/SQL中定義變量的語法形式是:

變量名數(shù)據(jù)類型[[NOTNULL]:=初值表達式]

V1varchar2(20);2).常量的定義類似于變量的定義:

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

變量名稱:=表達式AnIntroductiontoDatabaseSystem4.10.2PL/SQL的程序結(jié)構(gòu)PL/SOL塊的基本結(jié)構(gòu)(續(xù)):

2.可執(zhí)行部分

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

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

END;AnIntroductiontoDatabaseSystem4.10.2PL/SQL的程序結(jié)構(gòu)PL/SOL塊的基本結(jié)構(gòu)(續(xù)):

3.異常處理部分

exception

這一部分是可選的,在這一部分中處理異?;蝈e誤,對異常處理的詳細討論在后面進行。AnIntroductiontoDatabaseSystem4.10.2PL/SQL的程序結(jié)構(gòu)例4-103

向課程Course表中插入10門課程基本信息,課程編號從0001到0010。DECLARECNONUMBER;BEGINCNO:=0001;LOOPINSERTINTOCourse(CNO)VALUES(TO_CHAR(CNO,'9999'));CNO:=CNO+1;EXITWHENCNO>0010;ENDLOOP;EXCEPTIONWHENOTHERSTHENDBMS_OUTPUT.PUT_LINE('ERROR');END;AnIntroductiontoDatabaseSystem4.10存儲過程4.10.1PL/SQL與存儲過程概述4.10.2PL/SQL的程序結(jié)構(gòu)4.10.3控制結(jié)構(gòu)4.10.4異常處理4.10.5存儲過程4.10.6游標4.10.7觸發(fā)器AnIntroductiontoDatabaseSystem4.10.3控制結(jié)構(gòu)PL/SQL

功能:一、條件控制語句二、循環(huán)控制語句三、錯誤處理AnIntroductiontoDatabaseSystem控制結(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語句可以嵌套

AnIntroductiontoDatabaseSystem控制結(jié)構(gòu)(續(xù))二、循環(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é)束。AnIntroductiontoDatabaseSystem控制結(jié)構(gòu)(續(xù))二、循環(huán)控制語句(續(xù))2.WHILE-LOOP

WHILEconditionLOOP

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;AnIntroductiontoDatabaseSystem控制結(jié)構(gòu)(續(xù))三、錯誤處理:如果PL/SQL在執(zhí)行時出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句AnIntroductiontoDatabaseSystem4.10存儲過程4.10.1PL/SQL與存儲過程概述4.10.2PL/SQL的程序結(jié)構(gòu)4.10.3控制結(jié)構(gòu)4.10.4異常處理4.10.5存儲過程4.10.6游標4.10.7觸發(fā)器AnIntroductiontoDatabaseSystem4.10.4異常處理異常處理分為系統(tǒng)預(yù)定義異常處理和自定義異常處理兩部分。系統(tǒng)預(yù)定義異常處理是針對PL/SQL程序編譯、執(zhí)行過程中發(fā)生的問題進行處理的程序。讀者可以嘗試修改正常運行的程序,并執(zhí)行修改后的程序,就可以發(fā)現(xiàn)調(diào)用了哪些異常處理。

AnIntroductiontoDatabaseSystem4.10.4異常處理例4-104

定義名為GRADEERROR的異常,在SC表中查找Sno等于0001的記錄,將他的成績存入變量tempGrade中,判斷tempGrade值,若不在0和100之間,說明該學(xué)生的成績值有問題,則激活異常處理,顯示相應(yīng)的提示信息。SETSERVEROUTPUTONDECLAREGRADEERROREXCEPTION;tempGradeNUMBER;BEGINSELECTGRADEINTOtempGradeFROMSCWHERESno='0001';IFtempGrade<0ORtempGrade>100THENRAISEGRADEERROR;ENDIF;EXCEPTIONWHENGRADEERRORTHENDBMS_OUTPUT.PUT_LINE('成績超出范圍');END;AnIntroductiontoDatabaseSystem4.10存儲過程4.10.1PL/SQL與存儲過程概述4.10.2PL/SQL的程序結(jié)構(gòu)4.10.3控制結(jié)構(gòu)4.10.4異常處理4.10.5存儲過程4.10.6游標4.10.7觸發(fā)器AnIntroductiontoDatabaseSystem存儲過程(續(xù))一、存儲過程的優(yōu)點二、存儲過程的用戶接口AnIntroductiontoDatabaseSystem存儲過程(續(xù))存儲過程:由PL/SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,使用時只要調(diào)用即可。一、存儲過程的優(yōu)點:

1.運行效率高

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

3.方便實施企業(yè)規(guī)則AnIntroductiontoDatabaseSystem存儲過程(續(xù))二、存儲過程的用戶接口:

1.創(chuàng)建存儲過程

2.執(zhí)行存儲過程

3.刪除存儲過程AnIntroductiontoDatabaseSystem二、存儲過程的用戶接口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í)行語句部分

AnIntroductiontoDatabaseSystem存儲過程的用戶接口(續(xù))[例11]利用存儲過程來實現(xiàn)下面的應(yīng)用:從一個賬戶轉(zhuǎn)指定數(shù)額的款項到另一個賬戶中。

CREATEPROCEDURETRANSFER(inAccountINT,

outAccountINT,amountFLOAT) ASDECLARE

totalDepositFLOAT; BEGIN/*檢查轉(zhuǎn)出賬戶的余額*/ SELECTtotalINTOtotalDeposit

FROMACCOUNTWHEREACCOUNTNUM=outAccount; IFtotalDepositISNULLTHEN/*賬戶不存在或賬戶中沒有存款*/ ROLLBACK; RETURN; ENDIF;AnIntroductiontoDatabaseSystem存儲過程的用戶接口(續(xù))

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;AnIntroductiontoDatabaseSystem存儲過程的用戶接口(續(xù))重命名存儲過程

ALTERProcedure過程名1RENAMETO過程名2;AnIntroductiontoDatabaseSystem存儲過程的用戶接口(續(xù))2.執(zhí)行存儲過程:

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

CALLProcedureTRANSFER(01003813828,01003815868,10000);

AnIntroductiontoDatabaseSystem存儲過程的用戶接口(續(xù))3.刪除存儲過程

DROPPROCEDURE過程名();AnIntroductiontoDatabaseSystem4.10存儲過程4.10.1PL/SQL與存儲過程概述4.10.2PL/SQL的程序結(jié)構(gòu)4.10.3控制結(jié)構(gòu)4.10.4異常處理4.10.5存儲過程4.10.6游標4.10.7觸發(fā)器AnIntroductiontoDatabaseSy

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論