MySQL存儲過程課件_第1頁
MySQL存儲過程課件_第2頁
MySQL存儲過程課件_第3頁
MySQL存儲過程課件_第4頁
MySQL存儲過程課件_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

生物信息學(xué)數(shù)據(jù)庫設(shè)計(jì)第六章MySQL存儲過程生物信息學(xué)數(shù)據(jù)庫設(shè)計(jì)第六章MySQL存儲過程存儲過程的概念所謂的存儲過程就是存儲在數(shù)據(jù)庫當(dāng)中的可以執(zhí)行特定工作(查詢和更新)的一組SQL代碼的程序段。

與自定義函數(shù)的區(qū)別:

自定義函數(shù)有且只有一個返回值,就像普通的函數(shù)一樣,可以直接在表達(dá)式中嵌入調(diào)用。

存儲過程可以沒有返回值,也可以有任意個輸出參數(shù),必須單獨(dú)調(diào)用。

存儲過程的概念所謂的存儲過程就是存儲在數(shù)據(jù)庫當(dāng)中的可執(zhí)行的本質(zhì)都一樣。只是函數(shù)有如只能返回一個變量的限制。而存儲過程可以返回多個。而函數(shù)是可以嵌入在sql中使用的,可以在select中調(diào)用,而存儲過程不行。函數(shù)限制比較多,比如不能用臨時表,只能用表變量。還有一些函數(shù)不可用等等。而存儲過程的限制相對就比較少。

執(zhí)行的本質(zhì)都一樣。只是函數(shù)有如只能返回一個變量的限制。而存儲一般來說,存儲過程實(shí)現(xiàn)的功能要復(fù)雜一點(diǎn),而函數(shù)的實(shí)現(xiàn)的功能針對性比較強(qiáng)。

對于存儲過程來說可以返回參數(shù),而函數(shù)只能返回值或者表對象。存儲過程一般是作為一個獨(dú)立的部分來執(zhí)行,而函數(shù)可以作為查詢語句的一個部分來調(diào)用,由于函數(shù)可以返回一個表對象,因此它可以在查詢語句中位于FROM關(guān)鍵字的后面。一般來說,存儲過程實(shí)現(xiàn)的功能要復(fù)雜一存儲過程的優(yōu)點(diǎn)存儲過程只在創(chuàng)造時進(jìn)行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。

當(dāng)對數(shù)據(jù)庫進(jìn)行復(fù)雜操作時(如對多個表進(jìn)行Update、Insert、Query、Delete時),可將此復(fù)雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用。

存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量。

安全性高,可設(shè)定只有某此用戶才具有對指定存儲過程的使用權(quán)。存儲過程的優(yōu)點(diǎn)存儲過程只在創(chuàng)造時進(jìn)行編譯,以后每次執(zhí)行存儲過基本的創(chuàng)建、刪除語法CREATEPROCEDUREsp_name([proc_parameter[,...]])

[characteristic...]routine_body

默認(rèn)地,子程序與當(dāng)前數(shù)據(jù)庫關(guān)聯(lián)。要明確地把子程序與一個給定數(shù)據(jù)庫關(guān)聯(lián)起來,可以在創(chuàng)建子程序的時候指定其名字為db_name.sp_name。

sp_name存儲過程的名字proc_parameter指定參數(shù)為IN,OUT,或INOUTcharacteristic特征routine_body

包含合法的SQL過程語句。基本的創(chuàng)建、刪除語法CREATEPROCEDUREsp_in把數(shù)據(jù)從外部傳遞給存儲過程out從存儲過程內(nèi)部返回值給外部使用者inout把數(shù)據(jù)傳遞給存儲過程和將存儲過程的返回值傳遞給外部使用者in把數(shù)據(jù)從外部傳遞給存儲過程DROP{PROCEDURE|FUNCTION}[IFEXISTS]sp_name

這個語句被用來移除一個存儲程序或函數(shù)。即,從服務(wù)器移除一個制定的子程序。在MySQL5.1中,你必須有ALTERROUTINE權(quán)限才可用此子程序。這個權(quán)限被自動授予子程序的創(chuàng)建者。IFEXISTS子句是一個MySQL的擴(kuò)展。如果程序或函數(shù)不存在,它防止發(fā)生錯誤showprocedurestatus;查看存儲過程狀態(tài)MySQL存儲過程課件delimiter//DROPPROCEDUREIFEXISTSsp_test//CREATEPROCEDUREsp_test

/*存儲過程名*/(INinparmsINT,OUToutparamsvarchar(32))

/*輸入?yún)?shù)*/BEGIN/*語句塊頭*/DECLAREvarCHAR(10);/*變量聲明*/DECLAREnumint;IFinparms=1THEN/*IF條件開始*/SETvar='hello';/*賦值*/ELSESETvar='world';ENDIF;/*IF結(jié)束*/INSERTINTOt1VALUES(var);

/*SQL語句*/selectcount(*)fromt1intonum;SELECTnameFROMt1LIMITnum,1INTOoutparams;END//delimiter;

callsp_test(1,@out);Select@out;事先創(chuàng)建表createtablet1(idintnotnullauto_increment,namevarchar(45),primarykeypk_id(id));delimiter//存儲過程的變量聲明變量:DECLAREvar_name[,...]type[DEFAULTvalue]

這個語句被用來聲明局部變量。要給變量提供一個默認(rèn)值,需要包含一個DEFAULT子句。值可以被指定為一個表達(dá)式,不需要為一個常數(shù)。如果沒有DEFAULT子句,初始值為NULL。

局部變量的作用范圍在它被聲明的BEGIN...END塊內(nèi)。它可以被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。存儲過程的變量聲明變量:變量賦值變量賦值,SET語句:SETvar_name=expr[,var_name=expr]...也可以用語句代替SET來為用戶變量分配一個值。在這種情況下,分配符必須為:=而不能用=,因?yàn)樵诜荢ET語句中=被視為一個比較操作符,如下所示:

mysql>SET@t1=0,@t2=0,@t3=0;

mysql>SELECT@t1:=0,@t2:=0,@t3:=0;

對于使用select語句為變量賦值的情況,若返回結(jié)果為空,即沒有記錄,此時變量的值為上一次變量賦值時的值,如果沒有對變量賦過值,則為NULL。變量賦值變量賦值,SET語句:變量賦值,SELECT...INTO語句SELECTcol_name[,...]INTOvar_name[,...]table_expr這個SELECT語法把選定的列直接存儲到變量。因此,只有單一的行可以被取回。SELECTid,dataINTOx,yFROMtest.t1LIMIT1;變量賦值,SELECT...INTO語句BEGIN...END復(fù)合語句

[begin_label:]BEGIN[statement_list]END[end_label]

存儲子程序可以使用BEGIN...END復(fù)合語句來包含多個語句。statement_list代表一個或多個語句的列表。statement_list之內(nèi)每個語句都必須用分號(;)來結(jié)尾。

復(fù)合語句可以被標(biāo)記。除非begin_label存在,否則end_label不能被給出,并且如果二者都存在,他們必須是同樣的。

使用多重語句需要客戶端能發(fā)送包含語句定界符;的查詢字符串。這個符號在命令行客戶端被用delimiter命令來處理。改變查詢結(jié)尾定界符;(比如改變?yōu)?/)使得;可被用在子程序體中。BEGIN...END復(fù)合語句[begin_label:]流程控制IF語句IFsearch_conditionTHENstatement_list

[ELSEIFsearch_conditionTHENstatement_list]...

[ELSEstatement_list]ENDIF

IF實(shí)現(xiàn)了一個基本的條件構(gòu)造。如果search_condition求值為真,相應(yīng)的SQL語句列表被執(zhí)行。如果沒有search_condition匹配,在ELSE子句里的語句列表被執(zhí)行。statement_list可以包括一個或多個語句。

流程控制IF語句舉例:DELIMITER//CREATEPROCEDUREp1(INparameter1INT)BEGINDECLAREvariable1INT;SETvariable1=parameter1+1;IFvariable1=0THENINSERTINTOtVALUES(17);ENDIF;IFparameter1=0THENUPDATEtSETs1=s1+1;ELSEUPDATEtSETs1=s1+2;ENDIF;END//DELIMITER;舉例:CASE語句CASEcase_value

WHENwhen_valueTHENstatement_list

[WHENwhen_valueTHENstatement_list]...

[ELSEstatement_list]ENDCASEOr:CASE

WHENsearch_conditionTHENstatement_list

[WHENsearch_conditionTHENstatement_list]...

[ELSEstatement_list]ENDCASECASE語句存儲程序的CASE語句實(shí)現(xiàn)一個復(fù)雜的條件構(gòu)造。如果search_condition求值為真,相應(yīng)的SQL被執(zhí)行。如果沒有搜索條件匹配,在ELSE子句里的語句被執(zhí)行。舉例:CREATEPROCEDUREp2(INparameter1INT)BEGINDECLAREvariable1INT;SETvariable1=parameter1+1;CASEvariable1WHEN0THENINSERTINTOtVALUES(17);WHEN1THENINSERTINTOtVALUES(18);ELSEINSERTINTOtVALUES(19);ENDCASE;END//存儲程序的CASE語句實(shí)現(xiàn)一個復(fù)雜的條件構(gòu)造。如果searc循環(huán)語句WHILE…ENDWHILE舉例:

CREATEPROCEDUREp4()BEGINDECLAREvINT;SETv=0;WHILEv<5DOINSERTINTOtVALUES(v);SETv=v+1;ENDWHILE;END//循環(huán)語句循環(huán)語句LOOP…ENDLOOP舉例:CREATEPROCEDUREp5()BEGINDECLAREvINT;SETv=0;loop_label:LOOPINSERTINTOtVALUES(v);SETv=v+1;IFv>=5THENLEAVEloop_label;ENDIF;ENDLOOP;END//[begin_label:]LOOP

statement_listENDLOOP[end_label]LOOP允許某特定語句或語句群的重復(fù)執(zhí)行,實(shí)現(xiàn)一個簡單的循環(huán)構(gòu)造。在循環(huán)內(nèi)的語句一直重復(fù)直到循環(huán)被退出,退出通常伴隨著一個LEAVE語句。循環(huán)語句補(bǔ)充:迭代(ITERATE)語句CREATEPROCEDUREp7()BEGINDECLAREvINT;SETv=0;loop_label:LOOPIFv=3THENSETv=v+1;ITERATEloop_label;ENDIF;INSERTINTOtVALUES(v);SETv=v+1;IFv>=5THENLEAVEloop_label;ENDIF;ENDLOOP;END//補(bǔ)充:迭代(ITERATE)語句注釋語法:mysql存儲過程可使用兩種風(fēng)格的注釋雙模杠:--,該風(fēng)格一般用于單行注釋c風(fēng)格:/*注釋內(nèi)容*/,一般用于多行注釋使用權(quán)限:

CREATEROUTINE建立存儲過程ALTERROUTINE編輯和刪除存儲過程EXECUTE執(zhí)行存儲過程注釋語法:條件和異常處理程序DECLAREhandler_typeHANDLERFORcondition_value[,...]sp_statement

handler_type:

CONTINUE

|EXIT

condition_value:

SQLSTATE[VALUE]sqlstate_value

|condition_name

|SQLWARNING

|NOTFOUND

|SQLEXCEPTION這個語句指定每個可以處理一個或多個條件的處理程序。如果產(chǎn)生一個或多個條件,指定的語句被執(zhí)行。對一個CONTINUE處理程序,當(dāng)前子程序的執(zhí)行在執(zhí)行處理程序語句之后繼續(xù)。對于EXIT處理程序,當(dāng)前BEGIN...END復(fù)合語句的執(zhí)行被終止。條件和異常處理程序DECLAREhandler_typeSQLWARNING是對所有以01開頭的SQLSTATE代碼的速記。NOTFOUND是對所有以02開頭的SQLSTATE代碼的速記。SQLEXCEPTION是對所有沒有被SQLWARNING或NOTFOUND捕獲的SQLSTATE代碼的速記。聲明自定義條件:DECLAREcondition_nameCONDITIONFORcondition_valuecondition_value:SQLSTATE[VALUE]sqlstate_valueSQLWARNING是對所有以01開頭的SQLSTATE代碼舉例:CREATETABLEt2(s1int,primarykey(s1));delimiter//CREATEPROCEDUREhandlerdemo()BEGINDECLARECONTINUEHANDLERFORSQLSTATE'23000'SET@x2=1;

SET@x=1;INSERTINTOt2VALUES(1);SET@x=2;INSERTINTOt2VALUES(1);SET@x=3;END//delimiter;舉例:游標(biāo)聲明游標(biāo)DECLAREcursor_nameCURSORFORselect_statement這個語句聲明一個光標(biāo)。也可以在子程序中定義多個光標(biāo),但是一個塊中的每一個光標(biāo)必須有唯一的名字。打開游標(biāo)OPENcursor_name這個語句打開先前聲明的光標(biāo)。游標(biāo)FETCHFETCHcursor_nameINTOvar_name[,var_name]...這個語句用指定的打開光標(biāo)讀取下一行(如果有下一行的話),并且前進(jìn)光標(biāo)指針。

游標(biāo)聲明游標(biāo)關(guān)閉游標(biāo)CLOSECLOSEcursor_name這個語句關(guān)閉先前打開的光標(biāo)。如果未被明確地關(guān)閉,光標(biāo)在它被聲明的復(fù)合語句的末尾被關(guān)閉。游標(biāo)的特性:READONLY只讀,只能取值而不能賦值;NOTSCROOLABLE不可回滾,只能順序讀取;ASENSITIVE敏感,不能在已經(jīng)打開游標(biāo)的表上執(zhí)行update事務(wù);關(guān)閉游標(biāo)CLOSE舉例:createtablestu_sumscore(namechar(16),sum_scoreint);delimiter//CREATEPROCEDUREsp_cur()BEGINDECLAREdoneINTDEFAULT0;DECLAREv_id,v_nameCHAR(16);DECLAREv_subjectid,v_scoreINT;DECLAREcur1CURSORFORSELECTdistinctidFROMstu_grade;DECLARECONTINUEHANDLERFORSQLSTATE'02000'SETdone=1;

OPENcur1;REPEATFETCHcur1INTOv_id;SELECTSUM(SCORE)INTOv_scorefromstu_gradewhereid=v_id;SELECTnameINTOv_namefromstud_infowhereid=v_id;IFNOTdoneTHENINSERTINTOstu_sumscoreVALUES(v_name,v_score);ENDIF;UNTILdoneENDREPEAT;CLOSEcur1;/*CLOSEcur2;*/END//delimiter;舉例:作業(yè)利用存儲過程,統(tǒng)計(jì)每門課程的總成績,空值默認(rèn)為0;利用存儲過程,統(tǒng)計(jì)每門課程上課人數(shù),考試平均成績。作業(yè)利用存儲過程,統(tǒng)計(jì)每門課程的總成績,空值默認(rèn)為0;潛龍勿用

見龍?jiān)谔?,利見大?/p>

29潛龍勿用

見龍?jiān)谔铮姶笕?9生物信息學(xué)數(shù)據(jù)庫設(shè)計(jì)第六章MySQL存儲過程生物信息學(xué)數(shù)據(jù)庫設(shè)計(jì)第六章MySQL存儲過程存儲過程的概念所謂的存儲過程就是存儲在數(shù)據(jù)庫當(dāng)中的可以執(zhí)行特定工作(查詢和更新)的一組SQL代碼的程序段。

與自定義函數(shù)的區(qū)別:

自定義函數(shù)有且只有一個返回值,就像普通的函數(shù)一樣,可以直接在表達(dá)式中嵌入調(diào)用。

存儲過程可以沒有返回值,也可以有任意個輸出參數(shù),必須單獨(dú)調(diào)用。

存儲過程的概念所謂的存儲過程就是存儲在數(shù)據(jù)庫當(dāng)中的可執(zhí)行的本質(zhì)都一樣。只是函數(shù)有如只能返回一個變量的限制。而存儲過程可以返回多個。而函數(shù)是可以嵌入在sql中使用的,可以在select中調(diào)用,而存儲過程不行。函數(shù)限制比較多,比如不能用臨時表,只能用表變量。還有一些函數(shù)不可用等等。而存儲過程的限制相對就比較少。

執(zhí)行的本質(zhì)都一樣。只是函數(shù)有如只能返回一個變量的限制。而存儲一般來說,存儲過程實(shí)現(xiàn)的功能要復(fù)雜一點(diǎn),而函數(shù)的實(shí)現(xiàn)的功能針對性比較強(qiáng)。

對于存儲過程來說可以返回參數(shù),而函數(shù)只能返回值或者表對象。存儲過程一般是作為一個獨(dú)立的部分來執(zhí)行,而函數(shù)可以作為查詢語句的一個部分來調(diào)用,由于函數(shù)可以返回一個表對象,因此它可以在查詢語句中位于FROM關(guān)鍵字的后面。一般來說,存儲過程實(shí)現(xiàn)的功能要復(fù)雜一存儲過程的優(yōu)點(diǎn)存儲過程只在創(chuàng)造時進(jìn)行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。

當(dāng)對數(shù)據(jù)庫進(jìn)行復(fù)雜操作時(如對多個表進(jìn)行Update、Insert、Query、Delete時),可將此復(fù)雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用。

存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量。

安全性高,可設(shè)定只有某此用戶才具有對指定存儲過程的使用權(quán)。存儲過程的優(yōu)點(diǎn)存儲過程只在創(chuàng)造時進(jìn)行編譯,以后每次執(zhí)行存儲過基本的創(chuàng)建、刪除語法CREATEPROCEDUREsp_name([proc_parameter[,...]])

[characteristic...]routine_body

默認(rèn)地,子程序與當(dāng)前數(shù)據(jù)庫關(guān)聯(lián)。要明確地把子程序與一個給定數(shù)據(jù)庫關(guān)聯(lián)起來,可以在創(chuàng)建子程序的時候指定其名字為db_name.sp_name。

sp_name存儲過程的名字proc_parameter指定參數(shù)為IN,OUT,或INOUTcharacteristic特征routine_body

包含合法的SQL過程語句。基本的創(chuàng)建、刪除語法CREATEPROCEDUREsp_in把數(shù)據(jù)從外部傳遞給存儲過程out從存儲過程內(nèi)部返回值給外部使用者inout把數(shù)據(jù)傳遞給存儲過程和將存儲過程的返回值傳遞給外部使用者in把數(shù)據(jù)從外部傳遞給存儲過程DROP{PROCEDURE|FUNCTION}[IFEXISTS]sp_name

這個語句被用來移除一個存儲程序或函數(shù)。即,從服務(wù)器移除一個制定的子程序。在MySQL5.1中,你必須有ALTERROUTINE權(quán)限才可用此子程序。這個權(quán)限被自動授予子程序的創(chuàng)建者。IFEXISTS子句是一個MySQL的擴(kuò)展。如果程序或函數(shù)不存在,它防止發(fā)生錯誤showprocedurestatus;查看存儲過程狀態(tài)MySQL存儲過程課件delimiter//DROPPROCEDUREIFEXISTSsp_test//CREATEPROCEDUREsp_test

/*存儲過程名*/(INinparmsINT,OUToutparamsvarchar(32))

/*輸入?yún)?shù)*/BEGIN/*語句塊頭*/DECLAREvarCHAR(10);/*變量聲明*/DECLAREnumint;IFinparms=1THEN/*IF條件開始*/SETvar='hello';/*賦值*/ELSESETvar='world';ENDIF;/*IF結(jié)束*/INSERTINTOt1VALUES(var);

/*SQL語句*/selectcount(*)fromt1intonum;SELECTnameFROMt1LIMITnum,1INTOoutparams;END//delimiter;

callsp_test(1,@out);Select@out;事先創(chuàng)建表createtablet1(idintnotnullauto_increment,namevarchar(45),primarykeypk_id(id));delimiter//存儲過程的變量聲明變量:DECLAREvar_name[,...]type[DEFAULTvalue]

這個語句被用來聲明局部變量。要給變量提供一個默認(rèn)值,需要包含一個DEFAULT子句。值可以被指定為一個表達(dá)式,不需要為一個常數(shù)。如果沒有DEFAULT子句,初始值為NULL。

局部變量的作用范圍在它被聲明的BEGIN...END塊內(nèi)。它可以被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。存儲過程的變量聲明變量:變量賦值變量賦值,SET語句:SETvar_name=expr[,var_name=expr]...也可以用語句代替SET來為用戶變量分配一個值。在這種情況下,分配符必須為:=而不能用=,因?yàn)樵诜荢ET語句中=被視為一個比較操作符,如下所示:

mysql>SET@t1=0,@t2=0,@t3=0;

mysql>SELECT@t1:=0,@t2:=0,@t3:=0;

對于使用select語句為變量賦值的情況,若返回結(jié)果為空,即沒有記錄,此時變量的值為上一次變量賦值時的值,如果沒有對變量賦過值,則為NULL。變量賦值變量賦值,SET語句:變量賦值,SELECT...INTO語句SELECTcol_name[,...]INTOvar_name[,...]table_expr這個SELECT語法把選定的列直接存儲到變量。因此,只有單一的行可以被取回。SELECTid,dataINTOx,yFROMtest.t1LIMIT1;變量賦值,SELECT...INTO語句BEGIN...END復(fù)合語句

[begin_label:]BEGIN[statement_list]END[end_label]

存儲子程序可以使用BEGIN...END復(fù)合語句來包含多個語句。statement_list代表一個或多個語句的列表。statement_list之內(nèi)每個語句都必須用分號(;)來結(jié)尾。

復(fù)合語句可以被標(biāo)記。除非begin_label存在,否則end_label不能被給出,并且如果二者都存在,他們必須是同樣的。

使用多重語句需要客戶端能發(fā)送包含語句定界符;的查詢字符串。這個符號在命令行客戶端被用delimiter命令來處理。改變查詢結(jié)尾定界符;(比如改變?yōu)?/)使得;可被用在子程序體中。BEGIN...END復(fù)合語句[begin_label:]流程控制IF語句IFsearch_conditionTHENstatement_list

[ELSEIFsearch_conditionTHENstatement_list]...

[ELSEstatement_list]ENDIF

IF實(shí)現(xiàn)了一個基本的條件構(gòu)造。如果search_condition求值為真,相應(yīng)的SQL語句列表被執(zhí)行。如果沒有search_condition匹配,在ELSE子句里的語句列表被執(zhí)行。statement_list可以包括一個或多個語句。

流程控制IF語句舉例:DELIMITER//CREATEPROCEDUREp1(INparameter1INT)BEGINDECLAREvariable1INT;SETvariable1=parameter1+1;IFvariable1=0THENINSERTINTOtVALUES(17);ENDIF;IFparameter1=0THENUPDATEtSETs1=s1+1;ELSEUPDATEtSETs1=s1+2;ENDIF;END//DELIMITER;舉例:CASE語句CASEcase_value

WHENwhen_valueTHENstatement_list

[WHENwhen_valueTHENstatement_list]...

[ELSEstatement_list]ENDCASEOr:CASE

WHENsearch_conditionTHENstatement_list

[WHENsearch_conditionTHENstatement_list]...

[ELSEstatement_list]ENDCASECASE語句存儲程序的CASE語句實(shí)現(xiàn)一個復(fù)雜的條件構(gòu)造。如果search_condition求值為真,相應(yīng)的SQL被執(zhí)行。如果沒有搜索條件匹配,在ELSE子句里的語句被執(zhí)行。舉例:CREATEPROCEDUREp2(INparameter1INT)BEGINDECLAREvariable1INT;SETvariable1=parameter1+1;CASEvariable1WHEN0THENINSERTINTOtVALUES(17);WHEN1THENINSERTINTOtVALUES(18);ELSEINSERTINTOtVALUES(19);ENDCASE;END//存儲程序的CASE語句實(shí)現(xiàn)一個復(fù)雜的條件構(gòu)造。如果searc循環(huán)語句WHILE…ENDWHILE舉例:

CREATEPROCEDUREp4()BEGINDECLAREvINT;SETv=0;WHILEv<5DOINSERTINTOtVALUES(v);SETv=v+1;ENDWHILE;END//循環(huán)語句循環(huán)語句LOOP…ENDLOOP舉例:CREATEPROCEDUREp5()BEGINDECLAREvINT;SETv=0;loop_label:LOOPINSERTINTOtVALUES(v);SETv=v+1;IFv>=5THENLEAVEloop_label;ENDIF;ENDLOOP;END//[begin_label:]LOOP

statement_listENDLOOP[end_label]LOOP允許某特定語句或語句群的重復(fù)執(zhí)行,實(shí)現(xiàn)一個簡單的循環(huán)構(gòu)造。在循環(huán)內(nèi)的語句一直重復(fù)直到循環(huán)被退出,退出通常伴隨著一個LEAVE語句。循環(huán)語句補(bǔ)充:迭代(ITERATE)語句CREATEPROCEDUREp7()BEGINDECLAREvINT;SETv=0;loop_label:LOOPIFv=3THENSETv=v+1;ITERATEloop_label;ENDIF;INSERTINTOtVALUES(v);SETv=v+1;IFv>=5THENLEAVEloop_label;ENDIF;ENDLOOP;END//補(bǔ)充:迭代(ITERATE)語句注釋語法:mysql存儲過程可使用兩種風(fēng)格的注釋雙模杠:--,該風(fēng)格一般用于單行注釋c風(fēng)格:/*注釋內(nèi)容*/,一般用于多行注釋使用權(quán)限:

CREATEROUTINE建立存儲過程ALTERROUTINE編輯和刪除存儲過程EXECUTE執(zhí)行存儲過程注釋語法:條件和異常處理程序DECLAREhandler_typeHANDLERFORcondition_value[,...]sp_statement

handler_type:

CONTINUE

|EXIT

condition_value:

SQLSTATE[VALUE]sqlstate_value

|condition_name

|SQLWARNING

|NOTFOUND

|SQLEXCEPTION這個語句指定每個可以處理一個或多個條件的處理程序。如果產(chǎn)生一個或多個條件,指定的語句被執(zhí)行。對一個CONTINUE處理程序,當(dāng)前子程序的執(zhí)行在執(zhí)行處理程序語句之后繼續(xù)。對于EXIT處理程序,當(dāng)前BEGIN...END復(fù)合語句的執(zhí)行被終止。條件和異常處理程序DECLAREhandler_typeSQLWARNING是對所有以01開頭的SQLSTATE代碼的速記。NOTFOUND是對所有以02開頭的SQLSTATE代碼的速記。SQLEXCEPTION是對所有沒有被SQLWARNING或NOTFOUND捕獲的SQLSTATE代碼的速記。聲明自定義條件:DECLAREcondition_nameCO

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論