




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
PAGE12PAGE12PAGE13PAGE13
課題存儲過程和函數(shù)(一)課時2課時(90min)教學目標知識技能目標:(1)了解存儲過程和函數(shù)的相關(guān)概念(2)掌握創(chuàng)建并調(diào)用存儲過程和函數(shù)的方法(3)掌握變量、條件和處理程序、游標及流程控制的使用素質(zhì)目標:(1)培養(yǎng)做事要了解全貌的習慣(2)了解數(shù)據(jù)庫前沿技術(shù),緊跟時代發(fā)展教學重難點教學重點:存儲過程和函數(shù)的相關(guān)概念教學難點:創(chuàng)建并調(diào)用存儲過程和函數(shù)的方法教學方法案例分析法、問答法、討論法、講授法、實踐法教學用具電腦、投影儀、多媒體課件、教材教學設(shè)計第1節(jié)課:→→→傳授新知(38min)第2節(jié)課:→傳授新知(20min)→課堂實訓(15min)→課堂小結(jié)(3min)→作業(yè)布置(2min)教學過程主要教學內(nèi)容及步驟設(shè)計意圖第一節(jié)課課前任務(wù)【教師】布置課前任務(wù),和學生負責人取得聯(lián)系,讓其提醒同學通過文旌課堂APP或其他學習軟件,預(yù)習本節(jié)課要學習的知識【學生】完成課前任務(wù)通過課前任務(wù),使學生預(yù)習本節(jié)課要學習的知識,增加學生的學習興趣考勤(2min)【教師】使用文旌課堂APP進行簽到【學生】班干部報請假人員及原因培養(yǎng)學生的組織紀律性,掌握學生的出勤情況問題導(dǎo)入(5min)【教師】提出以下問題:存儲過程和函數(shù)是什么,對比單條SQL語句有什么優(yōu)勢?·通過問題導(dǎo)入,引導(dǎo)學生主動思考,激發(fā)學生的學習興趣傳授新知(38min)【教師】通過學生的回答引入要講的知識,講解存儲過程和函數(shù)的相關(guān)概念,以及創(chuàng)建并調(diào)用存儲過程和函數(shù)的相關(guān)知識13.1存儲過程和函數(shù)概述通過前面章節(jié)的學習,相信用戶已經(jīng)能夠編寫操作單表或者多表的單條SQL語句,但是針對表的一個完整操作往往不是單條SQL語句就能實現(xiàn)的,而是需要一組SQL語句來實現(xiàn)。?【教師】隨機邀請學生回答以下問題:要完成一個購買商品的訂單的處理,一般需要考慮哪些問題??【學生】聆聽、思考、回答?【教師】總結(jié)學生的回答例如,要完成一個購買商品的訂單的處理,一般需要考慮以下幾步:(1)在生成訂單之前,首先需要查看商品庫存中是否有相應(yīng)商品;(2)如果商品庫存中不存在相應(yīng)商品,需要向供應(yīng)商訂貨;(3)如果商品庫存中存在相應(yīng)商品,需要預(yù)定商品,并修改庫存數(shù)量。對于上述完整操作,顯然不是單條SQL語句就能實現(xiàn)的。在實際應(yīng)用中,一個完整的操作會包含多條SQL語句,并且在執(zhí)行過程中還需要根據(jù)前面語句的執(zhí)行結(jié)果有選擇的執(zhí)行后面的語句。為此,可將一個完整操作中所包含的多條SQL語句創(chuàng)建為存儲過程或函數(shù),以方便應(yīng)用。存儲過程和函數(shù)可以簡單地理解為一組經(jīng)過編譯并保存在數(shù)據(jù)庫中的SQL語句的集合,可以隨時被調(diào)用。?【教師】隨機邀請學生回答以下問題:存儲過程和函數(shù)具有哪些優(yōu)點和缺點??【學生】聆聽、思考、回答?【教師】總結(jié)學生的回答存儲過程和函數(shù)具有以下優(yōu)點:允許標準組件式編程:存儲過程和函數(shù)在創(chuàng)建后可以在程序中被多次調(diào)用,有效提高了SQL語句的重用性、共享性和可移值性。較快的執(zhí)行速度:如果某一操作包含大量的事務(wù)處理代碼,并且被多次執(zhí)行,那么存儲過程要比批處理的執(zhí)行速度快很多。因為存儲過程是預(yù)編譯的,在首次運行一個存儲過程時,查詢優(yōu)化器會對其進行分析優(yōu)化,并將最終執(zhí)行計劃存儲在系統(tǒng)中,而批處理的事務(wù)處理語句在每次運行時都要進行編譯和優(yōu)化。減少網(wǎng)絡(luò)流量:對于大量的SQL語句,將其組織成存儲過程,會比一條一條地調(diào)用SQL語句要大大節(jié)省網(wǎng)絡(luò)流量,降低網(wǎng)絡(luò)負載。安全:數(shù)據(jù)庫管理員通過設(shè)置執(zhí)行某一存儲過程的權(quán)限,從而限制相應(yīng)數(shù)據(jù)的訪問權(quán)限,避免非授權(quán)用戶對數(shù)據(jù)的訪問,保證數(shù)據(jù)的安全。除上述優(yōu)點外,存儲過程和函數(shù)也存在一定的缺陷。首先,存儲過程和函數(shù)的編寫比單個SQL語句的編寫要復(fù)雜很多,需要用戶具有更高的技能和更豐富的經(jīng)驗;其次,在編寫存儲過程和函數(shù)時,需要創(chuàng)建這些數(shù)據(jù)庫對象的權(quán)限。13.2創(chuàng)建并調(diào)用存儲過程和函數(shù)?【教師】組織學生掃碼觀看“創(chuàng)建并調(diào)用存儲過程和函數(shù)”視頻(詳見教材),讓學生對相關(guān)知識有一個大致了解存儲程序可以分為存儲過程和函數(shù)。存儲過程和函數(shù)的操作主要包括創(chuàng)建存儲過程和函數(shù)、調(diào)用存儲過程和函數(shù)、查看存儲過程和函數(shù),以及修改和刪除存儲過程和函數(shù)。本節(jié)主要介紹如何創(chuàng)建和調(diào)用存儲過程和函數(shù)。13.2.1創(chuàng)建存儲過程創(chuàng)建存儲過程使用SQL語句CREATEPROCEDURE來實現(xiàn),其語法形式如下:CREATEPROCEDUREproc_name([proc_parameter[,…])[characteristic…]routine_body(1)CREATEPROCEDURE為創(chuàng)建存儲過程的關(guān)鍵字。(2)proc_name表示要創(chuàng)建的存儲過程名。(3)proc_parameter表示存儲過程的參數(shù),參數(shù)形式如下:[IN|OUT|INOUT]parameter_nameTYPE其中,IN表示輸入?yún)?shù),可把外界的數(shù)據(jù)傳遞到存儲過程當中;OUT表示輸出參數(shù),可把存儲過程的運算結(jié)果傳遞到外界;INOUT表示輸入輸出參數(shù),既可以把外界的數(shù)據(jù)傳遞到存儲過程當中,又可以把存儲過程的運算結(jié)果傳遞到外界;parameter_name表示參數(shù)名;TYPE表示參數(shù)的數(shù)據(jù)類型。【提示】需要注意的是,存儲過程的參數(shù)名不要與數(shù)據(jù)表中的字段名重復(fù),否則系統(tǒng)會報錯。(4)characteristic表示存儲過程的特性,可取值及其意義如下:LANGUAGESQL:表示存儲過程的routine_body部分使用SQL語言編寫,當前系統(tǒng)支持的語言為SQL。[NOT]DETERMINISTIC:DETERMINISTIC表示存儲過程的執(zhí)行結(jié)果是確定的,就是每次輸入相同的參數(shù)并執(zhí)行存儲過程后,得到的結(jié)果是相同的;默認為NOTDETERMINISTIC,表示執(zhí)行結(jié)果不確定,即相同的輸入可能得到不同的結(jié)果。{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}:指明子程序使用SQL語句的限制。CONTAINSSQL為默認值,表示子程序包含SQL語句,但不包含讀或?qū)憯?shù)據(jù)的語句;NOSQL表示子程序不包含SQL語句;READSSQLDATA表示子程序包含讀取數(shù)據(jù)的語句,但不包含寫數(shù)據(jù)的語句;MODIFIESSQLDATA表示子程序包含寫入數(shù)據(jù)的語句。SQLSECURITY{DEFINER|INVOKER}:指定可執(zhí)行存儲過程的用戶,DEFINER表示只有創(chuàng)建者才能執(zhí)行,INVOKER表示擁有權(quán)限的調(diào)用者可以執(zhí)行。COMMENT'string':表示存儲過程或者函數(shù)的注釋信息。(5)routine_body表示需要執(zhí)行的SQL語句的集合,可以使用BEGIN表示開始,使用END表示結(jié)束。【實例13-1】創(chuàng)建一個名為proc的簡單存儲過程,用于獲取goods表中的記錄數(shù)。在創(chuàng)建存儲過程前首先登錄MySQL,并選擇數(shù)據(jù)庫db_shop。然后執(zhí)行以下語句:mysql>DELIMITER$$mysql>CREATEPROCEDUREproc(OUTnumINT)->BEGIN->SELECTCOUNT(*)INTOnumFROMgoods;->END$$QueryOK,0rowsaffected(0.03sec)mysql>DELIMITER;【提示】“DELIMITER$$”的作用是將語句的結(jié)束符“;”修改為“$$”,這樣存儲過程中的SQL語句結(jié)束符“;”就不會被MySQL解釋成語句的結(jié)束而提示錯誤。在存儲過程創(chuàng)建完成后,應(yīng)使用“DELIMITER;”語句將結(jié)束符修改為默認結(jié)束符。13.2.2創(chuàng)建存儲函數(shù)創(chuàng)建存儲函數(shù)使用SQL語句CREATEFUNCTION來實現(xiàn),其語法形式如下:CREATEFUNCTIONfunc_name([parameter_name[,…])RETURNSTYPE[characteristic…]routine_bodyCREATEFUNCTION為創(chuàng)建存儲函數(shù)的關(guān)鍵字;func_name表示存儲函數(shù)名;parameter_name表示存儲函數(shù)參數(shù)名;TYPE表示函數(shù)返回值的數(shù)據(jù)類型;characteristic指定存儲函數(shù)的特性,取值與創(chuàng)建存儲過程時相同;routine_body表示函數(shù)體。【實例13-2】創(chuàng)建一個名為func的簡單存儲函數(shù),用于獲取goods表中的記錄數(shù)。在創(chuàng)建存儲函數(shù)前首先登錄MySQL,并選擇數(shù)據(jù)庫db_shop。SQL語句的執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATEFUNCTIONfunc()->RETURNSINT(11)->RETURN(SELECTCOUNT(*)FROMgoods)->$$QueryOK,0rowsaffected(0.03sec)mysql>DELIMITER;【提示】RETURNSTYPE子句對于存儲函數(shù)而言是必須存在的,如果RETURN子句返回值的數(shù)據(jù)類型與RETURNSTYPE子句指定的數(shù)據(jù)類型不同,MySQL會將返回值強制轉(zhuǎn)換為RETURNSTYPE子句指定的類型。13.2.3調(diào)用存儲過程和函數(shù)存儲過程必須使用關(guān)鍵字CALL調(diào)用,而存儲函數(shù)與MySQL內(nèi)置函數(shù)的調(diào)用相同,使用關(guān)鍵字SELECT。1.調(diào)用存儲過程通常使用關(guān)鍵字CALL調(diào)用存儲過程,其語法形式如下:CALLprocedure_name([parameter[,…]]);其中的parameter表示變量名,存儲過程的返回值將賦予該變量。【實例13-3】調(diào)用實例13-1創(chuàng)建的存儲過程proc(),查看其返回值。首先登錄MySQL,并選擇數(shù)據(jù)庫db_shop。SQL語句及其執(zhí)行結(jié)果如下:mysql>CALLproc(@num);QueryOK,1rowaffected(0.06sec)mysql>SELECT@num;++|@num|++|10|++1rowinset(0.01sec)上述語句中,使用CALLproc(@num);語句調(diào)用存儲過程后,系統(tǒng)會將返回值賦予變量@num;使用SELECT語句查看變量@num值,結(jié)果為10。調(diào)用存儲過程的執(zhí)行結(jié)果與直接執(zhí)行查詢語句SELECTCOUNT(*)FROMgoods;的執(zhí)行結(jié)果相同,但是存儲過程的好處在于處理邏輯都封裝在數(shù)據(jù)庫端,調(diào)用者不需要了解中間的處理邏輯,當處理邏輯發(fā)生變化時,只需要修改存儲過程即可,而對調(diào)用者的程序完全沒有影響。2.調(diào)用存儲函數(shù)通常使用關(guān)鍵字SELECT調(diào)用存儲函數(shù),其語法形式如下:SELECTfunction_name([parameter[,……]]);【實例13-4】調(diào)用實例13-2創(chuàng)建的存儲函數(shù)func(),查看其返回值。首先登錄MySQL,并選擇數(shù)據(jù)庫db_shop。然后創(chuàng)建存儲過程并定義變量,SQL語句及其執(zhí)行結(jié)果如下:mysql>SELECTfunc();++|func()|++|10|++1rowinset(0.04sec)其返回值同樣為10。13.2.4使用圖形化工具創(chuàng)建存儲過程和函數(shù)使用NavicatforMySQL也可以創(chuàng)建存儲過程和函數(shù),具體操作如下。步驟
1使用NavicatforMySQL連接MySQL后,雙擊需要操作的數(shù)據(jù)庫“test_db”,然后單擊“函數(shù)”按鈕。步驟
2單擊“新建函數(shù)”按鈕,選擇需要創(chuàng)建的類型,此處選擇創(chuàng)建存儲過程,如圖13-1所示。步驟
3在編輯區(qū)填寫存儲過程需要的參數(shù),單擊編輯區(qū)左下方的“+”按鈕可以添加參數(shù),單擊“-”按鈕可以刪除參數(shù),如果存儲過程沒有參數(shù),直接單擊“完成”按鈕即可……(詳見教材)【學生】聆聽、思考、記錄通過教師的講解和演示,使學生了解存儲過程和函數(shù)的相關(guān)概念,以及創(chuàng)建并調(diào)用存儲過程和函數(shù)的相關(guān)知識第二節(jié)課問題導(dǎo)入(5min)【教師】提出以下問題:什么是表達式?【學生】思考、舉手回答通過問題導(dǎo)入,引導(dǎo)學生主動思考,激發(fā)學生的學習興趣傳授新知(20min)【教師】通過學生的回答引入新知,講解存儲過程和函數(shù)的表達式的相關(guān)知識13.3關(guān)于存儲過程和函數(shù)的表達式?【教師】組織學生掃碼觀看“變量、條件和游標的使用”視頻(詳見教材),讓學生對相關(guān)知識有一個大致了解13.2
節(jié)介紹了存儲過程和函數(shù)的創(chuàng)建方法,本節(jié)詳細介紹存儲過程和函數(shù)中所包含的表達式語句。此處的表達式同其他高級語言中一樣,主要由變量、運算符和流程控制語句構(gòu)成。13.3.1變量變量是表達式中最基本的元素,可用于存儲臨時數(shù)據(jù)。本節(jié)簡單介紹變量的分類,以及在存儲過程和函數(shù)中應(yīng)用變量的方法。1.變量的分類?【教師】隨機邀請學生回答以下問題:變量有哪些類型??【學生】聆聽、思考、回答?【教師】總結(jié)學生的回答MySQL中的變量可分為以下三類。用戶變量(User-DefinedVariables):帶有前綴@,只能被定義它的用戶使用,作用于當前整個連接,當前連接斷開后,所定義的用戶變量會被全部釋放。用戶變量不用提前定義就可以直接使用。局部變量(LocalVariables):沒有前綴,一般用于SQL語句塊中,比如存儲過程的BEGIN…END中。其作用域僅限于該語句塊,在語句塊執(zhí)行完畢后,局部變量就會被釋放。局部變量使用前需要先通過DECLARE聲明。如沒有聲明,則初始值為NULL。系統(tǒng)變量(ServerSystemVariables):帶有前綴@@,MySQL有許多已經(jīng)設(shè)置默認值的系統(tǒng)變量。系統(tǒng)變量包含全局變量和會話變量。全局變量會影響整個服務(wù)器,而會話變量只影響個人客戶端連接。2.在存儲過程和函數(shù)中應(yīng)用變量局部變量可以在子程序中定義并應(yīng)用,其作用范圍是BEGIN…END語句塊。(1)定義變量。在存儲過程中使用DECLARE語句定義局部變量,其語法形式如下:DECLAREvar_name[,…]type[DEFAULTvalue];上述語句中,var_name為局部變量名稱,type為變量的數(shù)據(jù)類型,DEFAULTvalue是為變量指定的默認值。如果沒有DEFAULTvalue,初始值為NULL。例如,定義一個INT類型的變量,名稱為var1:DECLAREvar1INT;【提示】變量的定義必須在復(fù)合語句開頭,并且在任何其他語句前面。也就是說,DECLARE語句在存儲過程和函數(shù)中使用時,必須出現(xiàn)在BEGIN…END語句塊的最前面,并且變量名不區(qū)分大小寫。可以一次聲明多個相同類型的變量。(2)為變量賦值。定義變量之后,可以使用SET關(guān)鍵字為變量賦值,語法形式如下:SETvar_name=expr[,var_name=expr]…;為前面定義的變量var1賦值,具體如下:SETvar1=3;變量值可以為常量或者表達式。另外,也可以使用SELECT…INTO…查詢語句將查詢結(jié)果賦給變量,這要求查詢結(jié)果必須只有一行,具體語法形式如下:SELECTcol_name[,……]INTOvar_name[,……]FROMtable_name;col_name為字段名,var_name為變量名。【實例13-5】執(zhí)行SQL語句,定義變量并為其賦值。首先登錄MySQL,并選擇數(shù)據(jù)庫db_shop。SQL語句及其執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATEPROCEDUREproc1()->BEGIN->DECLAREvar1,var2,var3,g_idINT;->SETvar1=1,var2=2;->SETvar3=var1+var2;->SELECTidintog_idFROMgoodsWHEREid=1;->END$$QueryOK,0rowsaffected(0.10sec)mysql>DELIMITER;13.3.2定義條件和處理程序條件和處理程序是MySQL提供的一種異常處理機制,定義條件是事先定義程序執(zhí)行過程中可能會遇到的問題;定義處理程序是定義在遇到問題時執(zhí)行的相應(yīng)處理方法,并且保證存儲過程和函數(shù)在遇到問題時不終止。1.定義條件在MySQL中定義條件使用DECLARE…CONDITION語句,其語法形式如下:DECLAREcondition_nameCONDITIONFOR[condition_type];上述語句中,condition_name表示條件名。condition_type表示條件的類型,其可取值及其意義如下:mysql_error_code:表示數(shù)值類型錯誤代碼。sqlstate_value:表示長度為5的字符串類型錯誤代碼。下面以名為“not_found_database”的條件“ERROR1049(42000)”的定義為例,來看看這兩種形式的區(qū)別。使用mysql_error_code形式:DECLAREnot_found_databaseCONDITIONFOR1049;使用sqlstate_value形式:DECLAREnot_found_databaseCONDITIONFORSQLSTATE'42000';【提示】數(shù)值類型的錯誤代碼不要使用0,因為0表示成功而不是錯誤;字符串類型的錯誤代碼不要使用'00',因為'00'表示成功而不是錯誤。2.定義處理程序在定義條件之后,可以使用DECLARE…HANDLER語句定義處理程序,語法形式如下:DECLAREhandler_typeHANDLERFORcondition_value[...]statement下面簡單介紹上述語句中各組成部分及其意義。(1)handler_type為異常處理方式,可取值及其意義如下:CONTINUE:表示遇到錯誤不處理,程序繼續(xù)執(zhí)行。EXIT:表示遇到錯誤立即退出程序。UNDO:表示遇到錯誤后撤回之前的操作,目前MySQL暫不支持該操作。(2)condition_value表示錯誤值,可取值及其意義如下:mysql_error_code:表示數(shù)值類型的錯誤代碼。sqlstate_value:表示包含5個字符的字符串錯誤值。condition_name:表示使用DECLARE…CONDITION語句定義的條件名。SQLWARNING:匹配所有以01開頭的SQLSTATE錯誤代碼。NOTFOUND:匹配所有以02開頭的SQLSTATE錯誤代碼。SQLEXCEPTION:匹配所有未被SQLWARNING和NOTFOUND捕獲的SQLSTATE錯誤代碼。(3)statement為程序語句段,表示在遇到定義的異常條件時,需要執(zhí)行的存儲過程或函數(shù)。定義處理程序有以下6種方法:方法一:捕獲sqlstate_valueDECLARECONTINUEHANDLERFORSQLSTATE'42s02'SET@info='cannotfind';意義為,如果遇到sqlstate_value值為'42s02'的異常,執(zhí)行CONTINUE操作,并輸出“cannotfind”信息。方法二:捕獲mysql_error_codeDECLARECONTINUEHANDLERFOR1146SET@info='cannotfind';意義為,如果遇到mysql_error_code值為1146的異常,執(zhí)行CONTINUE操作,并輸出“cannotfind”信息。方法三:先定義條件,然后再調(diào)用條件DECLAREcan_not_findCONDITIONFOR1146;DECLARECONTINUEHANDLERFORcan_not_findSET@info='cannotfind';意義為,先定義can_not_find條件,遇到1146錯誤就執(zhí)行CONTINUE操作。方法四:使用SQLWARNINGDECLAREEXITHANDLERFORSQLWARNINGSET@info='error';意義為,捕獲所有以01開頭的sqlstate_value值,然后執(zhí)行EXIT操作,并輸出“error”信息。方法五:使用NOTFOUNDDECLAREEXITHANDLERFORNOTFOUNDSET@info='cannotfind';意義為,捕獲所有以02開頭的sqlstate_value值,然后執(zhí)行EXIT操作,并輸出“cannotfind”信息。方法六:使用SQLEXCEPTIONDECLAREEXITHANDLERFORSQLEXCEPTIONSET@info='error';意義為,捕獲所有沒有被SQLWARNING和NOTFOUND捕獲的sqlstate_value值,然后執(zhí)行EXIT操作,并輸出“error”信息。【實例13-6】執(zhí)行SQL語句,在存儲過程中定義條件和處理程序,體驗異常處理機制在存儲過程中的作用。步驟1登錄MySQL,并選擇任一數(shù)據(jù)庫,之后執(zhí)行以下SQL語句,創(chuàng)建t_handler表。CREATETABLEt_handler(s1INT,PRIMARYKEY(s1));步驟2在存儲過程和函數(shù)中定義條件和處理程序,SQL語句及其執(zhí)行結(jié)果如下。mysql>DELIMITER$$mysql>CREATEPROCEDUREhandlerdemo()->BEGIN->DECLARECONTINUEHANDLERFORSQLSTATE'23000'SET@x2=1;->SET@x=1;->INSERTINTOt_handlerVALUES(1);->SET@x=2;->INSERTINTOt_handlerVALUES(1);->SET@x=3;->END$$QueryOK,0rowsaffected(0.03sec)mysql>DELIMITER;步驟3調(diào)用存儲過程,查看變量x的值……(詳見教材)13.3.3游標的使用在存儲過程和函數(shù)中,當查詢語句返回多條記錄時,可以使用游標對結(jié)果集進行逐條讀取。本節(jié)介紹定義、打開、使用和關(guān)閉游標的方法。1.定義游標在MySQL中,使用DECLARE關(guān)鍵字來定義游標,其語法形式如下:DECLAREcursor_nameCURSORFORselect_statement;上述語句中,cursor_name表示游標名,select_statement表示SELECT語句,返回一個用于創(chuàng)建游標的結(jié)果集。2.打開游標打開游標的關(guān)鍵字為OPEN,其語法形式如下:OPENcursor_name;【提示】在打開一個游標時,游標并不指向第一條記錄,而是指向第一條記錄的前邊。3.使用游標使用游標的關(guān)鍵字是FETCH,其語法形式如下:FETCHcursor_nameINTOvar_name[,var_name]…上述語句的作用是將定義游標cursor_name時查詢出的數(shù)據(jù)賦予變量var_name。4.關(guān)閉游標關(guān)閉游標的關(guān)鍵字為CLOSE,其語法形式如下:CLOSEcursor_name;【實例13-7】創(chuàng)建存儲過程,并在存儲過程中使用游標。在創(chuàng)建存儲過程前首先登錄MySQL,并選擇數(shù)據(jù)庫db_shop。SQL語句及其執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATEPROCEDUREproc9(INflagVARCHAR(10),OUTgnameVARCHAR(30),OUTgpriceDECIMAL(7,2))->BEGIN->DECLAREg_idINT;->DECLAREg_nameVARCHAR(30);->DECLAREg_priceDECIMAL(7,2);->DECLAREg_cursorCURSORFORSELECTid,name,priceFROMdb_shop.goods;->DECLAREEXITHANDLERFORNOTFOUNDCLOSEg_cursor;->OPENg_cursor;->REPEAT->FETCHg_cursorINTOg_id,g_name,g_price;->IFg_id=flagTHEN->SELECTg_name,g_priceINTOgname,gprice;->ENDIF;->UNTILg_id=flag->ENDREPEAT;->CLOSEg_cursor;->END$$QueryOK,0rowsaffected(0.12sec)mysql>DELIMITER;調(diào)用存儲過程,查看結(jié)果:mysql>CALLproc9(5,@gname,@gprice);QueryOK,1rowaffected(0.06sec)mysql>SELECT@gname,@gprice;+++|@gname|@gprice|+++|果汁|2.50|+++1rowinset(0.01sec)13.3.4流程控制的使用?【教師】組織學生掃碼觀看“流程控制的使用”視頻(詳見教材),讓學生對相關(guān)知識有一個大致了解流程控制語句是指可以控制程序運行順序的指令,程序運行順序主要包括順序執(zhí)行、條件執(zhí)行和循環(huán)執(zhí)行。MySQL支持的流程控制語句包括IF語句、CASE語句、LOOP語句、REPEAT語句、WHILE語句、LEAVE語句、ITERATE語句和RETURN語句,下面逐一介紹。1.IF語句IF實現(xiàn)條件判斷,語句中可以包含多個判斷條件,系統(tǒng)會根據(jù)條件的結(jié)果是否為TRUE執(zhí)行相應(yīng)的操作,語法形式如下:IFsearch_conditionTHENstatement_list[ELSEIFsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDIF上述語句中,search_condition為判斷條件,statement_list為相應(yīng)操作,如果所有判斷條件均不為TRUE,則執(zhí)行ELSE子句中的操作。2.CASE語句CASE語句可以實現(xiàn)比IF語句更復(fù)雜的條件構(gòu)造,該語句有兩種使用形式。第1種語法形式如下:CASEcase_exprWHENwhen_valueTHENstatement_list[WHENwhen_valueTHENstatement_list]...[ELSEstatement_list]ENDCASE上述語句中,case_expr表示判斷條件的表達式,將此表達式與每個WHEN子句中的when_value值進行比較,直到與其中一個相等,此時,執(zhí)行相應(yīng)THEN子句中的statement_list。如果表達式與所有when_value值都不相等,則執(zhí)行ELSE子句中的statement_list。CASE語句的第2種語法形式如下:CASEWHENsearch_conditionTHENstatement_list[WHENsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDCASE上述語句中,系統(tǒng)會對每個WHEN子句中的search_condition表達式進行判斷,直到某個search_condition表達式為TRUE,此時將執(zhí)行其對應(yīng)的THEN子句中的statement_list。如果所有search_condition表達式的值都不為TRUE,則執(zhí)行ELSE子句中的statement_list。3.LOOP語句和LEAVE語句LOOP語句可以實現(xiàn)簡單的循環(huán),使得系統(tǒng)能夠重復(fù)執(zhí)行循環(huán)結(jié)構(gòu)內(nèi)的語句列表。該語句列表由一條或多條語句組成,每條語句使用分號(;)隔開。語法形式如下:[loop_label:]LOOPstatement_listENDLOOP[end_label]上述語句中,loop_label表示LOOP語句的標注名稱(可以省略),statement_list表示需要循環(huán)執(zhí)行的SQL語句。如果不在statement_list中增加退出循環(huán)的語句,LOOP語句可以實現(xiàn)簡單的死循環(huán)。使用LEAVE語句可以退出循環(huán)。語法形式如下:LEAVElabel;其中,label參數(shù)表示循環(huán)的標注名。4.REPEAT語句REPEAT語句可以實現(xiàn)一個帶條件判斷的循環(huán)結(jié)構(gòu)。語法形式如下:[repeat_label:]REPEATstatement_listUNTILsearch_conditionENDREPEAT[repeat_label]repeat_label表示REPEAT語句的標注名稱(可以省略),每次SQL語句statement_list執(zhí)行完畢后,會對條件search_condition進行判斷,如果結(jié)果為TRUE,循環(huán)終止,否則繼續(xù)執(zhí)行循環(huán)中的語句。5.WHILE語句WHILE語句同樣可以實現(xiàn)一個帶條件判斷的循環(huán)結(jié)構(gòu),但與REPEAT語句不同的是,WHILE語句會先對條件進行判斷,如果為TRUE,才會執(zhí)行需要循環(huán)的操作,否則終止循環(huán),語法形式如下:[while_label:]WHILEsearch_conditionDOstatement_listENDWHILE[while_label]上述語句中,while_label為WHILE語句的標注名稱,search_condition為判斷條件,statement_list為需要循環(huán)的操作。6.ITERATE
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/ZSESS 006.1-2023環(huán)保共性產(chǎn)業(yè)園建設(shè)和管理規(guī)范第1部分:總則
- 現(xiàn)代文學作品分析2025年考試試卷及答案
- 2025年文化產(chǎn)業(yè)管理考試題及答案設(shè)計
- T/XFBZ 009-2019安全標識警示校服
- 2025年社會企業(yè)管理本科生綜合考試試卷及答案
- 2025年高效能團隊管理知識考試試卷及答案
- 2025年農(nóng)業(yè)發(fā)展與鄉(xiāng)村振興考試試題及答案
- 居住中心的水系環(huán)境設(shè)計
- 2025年國際關(guān)系專業(yè)考前模擬試題及答案
- 兒童中暑預(yù)防與疾病管理
- 借款分期付款協(xié)議書
- 2025屆陜西省高三新高考全真模擬政治試題(原卷版+解析版)
- 南京2025年南京市市場監(jiān)督管理局所屬事業(yè)單位招聘編外筆試歷年參考題庫附帶答案詳解
- 護理員晨晚間護理課件
- 基站拆除合同協(xié)議書
- 降本增效理念在建筑中的應(yīng)用試題及答案
- 2025貴州中考:政治必考知識點
- 心率變異性與情緒狀態(tài)的相關(guān)性-洞察闡釋
- 門面房贈予合同協(xié)議
- GB/T 30819-2024機器人用諧波齒輪減速器
- DL-T5394-2021電力工程地下金屬構(gòu)筑物防腐技術(shù)導(dǎo)則
評論
0/150
提交評論