溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql存儲(chǔ)過(guò)程怎么理解

發(fā)布時(shí)間:2021-12-08 09:14:50 來(lái)源:億速云 閱讀:155 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“mysql存儲(chǔ)過(guò)程怎么理解”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“mysql存儲(chǔ)過(guò)程怎么理解”吧!

1、存儲(chǔ)過(guò)程的簡(jiǎn)介:

    我們常用的操作數(shù)據(jù)庫(kù)語(yǔ)言SQL語(yǔ)句在執(zhí)行的時(shí)候需要要先編譯,然后執(zhí)行,而存儲(chǔ)過(guò)程(Stored Procedure)是一組為了完成特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給定參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)調(diào)用執(zhí)行它。

    一個(gè)存儲(chǔ)過(guò)程是一個(gè)可編程的函數(shù),它在數(shù)據(jù)庫(kù)中創(chuàng)建并保存。它可以有SQL語(yǔ)句和一些特殊的控制結(jié)構(gòu)組成。當(dāng)希望在不同的應(yīng)用程序或平臺(tái)上執(zhí)行相同的函數(shù),或者封裝特定功能時(shí),存儲(chǔ)過(guò)程是非常有用的。數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程可以看做是對(duì)編程中面向?qū)ο蠓椒ǖ哪M。它允許控制數(shù)據(jù)的訪問(wèn)方式。

2、存儲(chǔ)過(guò)程的有點(diǎn):

(1).存儲(chǔ)過(guò)程增強(qiáng)了SQL語(yǔ)言的功能和靈活性。存儲(chǔ)過(guò)程可以用流控制語(yǔ)句編寫(xiě),有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。

(2).存儲(chǔ)過(guò)程允許標(biāo)準(zhǔn)組件是編程。存儲(chǔ)過(guò)程被創(chuàng)建后,可以在程序中被多次調(diào)用,而不必重新編寫(xiě)該存儲(chǔ)過(guò)程的SQL語(yǔ)句。而且數(shù)據(jù)庫(kù)專業(yè)人員可以隨時(shí)對(duì)存儲(chǔ)過(guò)程進(jìn)行修改,對(duì)應(yīng)用程序源代碼毫無(wú)影響。

(3).存儲(chǔ)過(guò)程能實(shí)現(xiàn)較快的執(zhí)行速度。如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲(chǔ)過(guò)程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過(guò)程是預(yù)編譯的。在首次運(yùn)行一個(gè)存儲(chǔ)過(guò)程時(shí)查詢,優(yōu)化器對(duì)其進(jìn)行分析優(yōu)化,并且給出最終被存儲(chǔ)在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的Transaction-SQL語(yǔ)句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,速度相對(duì)要慢一些。

(4).存儲(chǔ)過(guò)程能過(guò)減少網(wǎng)絡(luò)流量。針對(duì)同一個(gè)數(shù)據(jù)庫(kù)對(duì)象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語(yǔ)句被組織程存儲(chǔ)過(guò)程,那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲(chǔ)過(guò)程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語(yǔ)句,從而大大增加了網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載。

(5).存儲(chǔ)過(guò)程可被作為一種安全機(jī)制來(lái)充分利用。系統(tǒng)管理員通過(guò)執(zhí)行某一存儲(chǔ)過(guò)程的權(quán)限進(jìn)行限制,能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)的訪問(wèn)權(quán)限的限制,避免了非授權(quán)用戶對(duì)數(shù)據(jù)的訪問(wèn),保證了數(shù)據(jù)的安全。

3、關(guān)于mysql的存儲(chǔ)過(guò)程:

    存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)存儲(chǔ)的一個(gè)重要的功能,但是MySQL在5.0以前并不支持存儲(chǔ)過(guò)程,這使得MySQL在應(yīng)用上大打折扣。好在MySQL 5.0終于開(kāi)始已經(jīng)支持存儲(chǔ)過(guò)程,這樣即可以大大提高數(shù)據(jù)庫(kù)的處理速度,同時(shí)也可以提高數(shù)據(jù)庫(kù)編程的靈活性。

    同時(shí),要在mysql5.1以上版本創(chuàng)建子程序,必須具有CREATE ROUTINE權(quán)限,并且ALTER ROUTINE和EXECUTE權(quán)限被自動(dòng)授予它的創(chuàng)建者;

4、存儲(chǔ)過(guò)程的創(chuàng)建:

    (1)語(yǔ)法:

        CREATE PROCEDURE sp_name ([ proc_parameter ]) [ characteristics..] routine_body

         proc_parameter指定存儲(chǔ)過(guò)程的參數(shù)列表,列表形式如下:[IN|OUT|INOUT] param_name type

        其中in表示輸入?yún)?shù),out表示輸出參數(shù),inout表示既可以輸入也可以輸出;param_name表示參數(shù)名稱;type表示參數(shù)的類型該類型可以是MYSQL數(shù)據(jù)庫(kù)中的任意類型有以下取值:

        characteristic: 
            LANGUAGE SQL 
              | [NOT] DETERMINISTIC 
              | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 
              | SQL SECURITY { DEFINER | INVOKER } 
              | COMMENT 'string' 
            routine_body: 
           Valid SQL procedure statement or statements

        LANGUAGE SQL :說(shuō)明routine_body部分是由SQL語(yǔ)句組成的,當(dāng)前系統(tǒng)支持的語(yǔ)言為SQL,SQL是LANGUAGE特性的唯一值

        [NOT] DETERMINISTIC :指明存儲(chǔ)過(guò)程執(zhí)行的結(jié)果是否正確。DETERMINISTIC 表示結(jié)果是確定的。每次執(zhí)行存儲(chǔ)過(guò)程時(shí),相同的輸入會(huì)得到相同的輸出。[NOT] DETERMINISTIC 表示結(jié)果是不確定的,相同的輸入可能得到不同的輸出。如果沒(méi)有指定任意一個(gè)值,默認(rèn)為[NOT] DETERMINISTIC 

        CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA:指明子程序使用SQL語(yǔ)句的限制。

            CONTAINS SQL表明子程序包含SQL語(yǔ)句,但是不包含讀寫(xiě)數(shù)據(jù)的語(yǔ)句;

            NO SQL表明子程序不包含SQL語(yǔ)句;

            READS SQL DATA:說(shuō)明子程序包含讀數(shù)據(jù)的語(yǔ)句;

            MODIFIES SQL DATA表明子程序包含寫(xiě)數(shù)據(jù)的語(yǔ)句。

            默認(rèn)情況下,系統(tǒng)會(huì)指定為CONTAINS SQL

        SQL SECURITY { DEFINER | INVOKER } :指明誰(shuí)有權(quán)限來(lái)執(zhí)行。DEFINER 表示只有定義者才能執(zhí)行

INVOKER 表示擁有權(quán)限的調(diào)用者可以執(zhí)行。默認(rèn)情況下,系統(tǒng)指定為DEFINER 

        COMMENT 'string' :注釋信息,可以用來(lái)描述存儲(chǔ)過(guò)程或函數(shù)

        routine_body是SQL代碼的內(nèi)容,可以用BEGIN...END來(lái)表示SQL代碼的開(kāi)始和結(jié)束

   (2) 格式

        MySQL存儲(chǔ)過(guò)程創(chuàng)建的格式:CREATE PROCEDURE 過(guò)程名 ([過(guò)程參數(shù)[,...]])
[特性 ...] 過(guò)程體

    EG:

    DELIMITER //
    DROP PROCEDURE IF EXISTS simpleproc;
    CREATE PROCEDURE simpleproc (OUT param1 INT)
    BEGIN
    SELECT COUNT(*) INTO param1 FROM t_user;
    END //
    DELIMITER ;

我這是在使用Navicat for MySQL 上敲的,就不打算進(jìn)入mysql客戶端去敲了,個(gè)人覺(jué)得這個(gè)更方便快捷一點(diǎn);如果熟悉linux的童鞋估計(jì)就不這么認(rèn)為啦;

好了,廢話不多說(shuō),先解釋一下:(1)DELIMITER這個(gè)東西的作用就是告訴mysql,我的存儲(chǔ)過(guò)程的結(jié)束符號(hào)是//,所以在你的存儲(chǔ)過(guò)程中使用;不會(huì)被認(rèn)為是結(jié)束符號(hào);注:當(dāng)使用delimiter命令時(shí),你應(yīng)該避免使用反斜杠(‘\’)字符,因?yàn)槟鞘荕ySQL的 轉(zhuǎn)義字符(2)drop procedure if exists的意思跟我們建表時(shí)的語(yǔ)句是一樣的,如果存在這個(gè)存儲(chǔ)過(guò)程則刪除;(3)create procedure simpleproc (out param1 int) 的意思也很明確,就是創(chuàng)建這個(gè)過(guò)程,而且?guī)в幸粋€(gè)輸出參數(shù),注:在function中可以有return 語(yǔ)句,但是procedure是沒(méi)有的,但是也可以做到將結(jié)果傳回去,如上;(4) begin .... end 這中間包裹著的就是procedure的主程序,也就是主體部分;簡(jiǎn)而言之,把你要放在一起工作的sql都丟在這里就好;(5)DELIMITER;這個(gè)語(yǔ)句作為結(jié)束語(yǔ)句。目的是告訴mysql我現(xiàn)在不要使用//作為結(jié)束字符了,要換回;了;注:這個(gè)不止可是//,還可以是其他符號(hào);

5、變量

        DECLARE語(yǔ)句被用來(lái)把不同項(xiàng)目局域到一個(gè) 子程序:局部變量,條件和 處理程序 及光標(biāo);DECLARE僅被用在BEGIN ... END復(fù)合語(yǔ)句里,并且必須在復(fù)合語(yǔ)句的開(kāi)頭,在任何其它語(yǔ)句之前。光標(biāo)必須在聲明處理程序之前被聲明,并且變量和條件必須在聲明光標(biāo)或處理程序之前被聲明。

        declare 聲明局部變量:DECLARE var_name[,...] type [DEFAULT value];這個(gè)語(yǔ)句被用來(lái)聲明局部變量。要給變量提供一個(gè)默認(rèn)值,請(qǐng)包含一個(gè)DEFAULT子句。值可以被指定為一個(gè)表達(dá)式,不需要為一個(gè)常數(shù)。如果沒(méi)有DEFAULT子句,初始值為NULL。

        set 變量:SET var_name = expr [, var_name = expr] ...; 在存儲(chǔ)程序中的SET語(yǔ)句是一般SET語(yǔ)句的擴(kuò)展版本。被參考變量可能是子程序內(nèi)聲明的變量,或者是全局服務(wù)器變量。在存儲(chǔ)程序中的SET語(yǔ)句作為預(yù)先存在的SET語(yǔ)法的一部分來(lái)實(shí)現(xiàn)。這允許SET a=x, b=y, ...這樣的擴(kuò)展語(yǔ)法。其中不同的變量類型(局域 聲明變量及全局和集體變量)可以被混合起來(lái)。這也允許把局部變量和一些只對(duì)系統(tǒng)變量有意義的選項(xiàng)合并起來(lái)。在那種情況下,此選項(xiàng)被識(shí)別,但是被忽略了。

6、定義處理程序

    有時(shí)候程序是會(huì)出錯(cuò)的,但是你希望你的程序在出錯(cuò)的情況下繼續(xù)執(zhí)行,declare就可以幫助我們解決這樣的問(wèn)題;具體定義如下:特定條件需要特定處理。這些條件可以聯(lián)系到錯(cuò)誤,以及子程序中的一般流程控制。定義條件是事先定義程序執(zhí)行過(guò)程中遇到的問(wèn)題,處理程序定義了在遇到這些問(wèn)題時(shí)候應(yīng)當(dāng)采取的處理方式,并且保證存儲(chǔ)過(guò)程或函數(shù)在遇到警告或錯(cuò)誤時(shí)能繼續(xù)執(zhí)行。這樣可以增強(qiáng)存儲(chǔ)程序處理問(wèn)題的能力,避免程序異常停止運(yùn)行

    1、定義條件

           DECLARE condition_name CONDITION FOR[condition_type]

             [condition_type]:

            SQLSTATE[VALUE] sqlstate_value |mysql_error_code

            condition_name:表示條件名稱

            condition_type:表示條件的類型

            sqlstate_value和mysql_error_code都可以表示mysql錯(cuò)誤

            sqlstate_value為長(zhǎng)度5的字符串錯(cuò)誤代碼

            mysql_error_code為數(shù)值類型錯(cuò)誤代碼,例如:ERROR1142(42000)中,sqlstate_value的值是42000,

            mysql_error_code的值是1142

//方法一:使用sqlstate_value
DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000'

//方法二:使用mysql_error_code
DECLARE command_not_allowed CONDITION FOR SQLSTATE 1148

這個(gè)語(yǔ)句指定需要特殊處理?xiàng)l件。他將一個(gè)名字和指定的錯(cuò)誤條件關(guān)聯(lián)起來(lái)。

這個(gè)名字隨后被用在定義處理程序的DECLARE HANDLER語(yǔ)句中

    2、定義處理程序

            DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

                handler_type:
                |CONTINUE:對(duì)一個(gè)CONTINUE處理程序,當(dāng)前子程序的執(zhí)行在執(zhí)行 處理程序語(yǔ)句之后繼續(xù)。
                | EXIT :對(duì)于EXIT處理程序,當(dāng) 前BEGIN...END復(fù)合語(yǔ)句的執(zhí)行被終止。
                | UNDO :UNDO 處理程序類型語(yǔ)句還不被支持。 ·
            condition_value:
                SQLSTATE [VALUE] sqlstate_value
                | condition_name
                | SQLWARNING:SQLWARNING是對(duì)所有以01開(kāi)頭的SQLSTATE代碼的速記
                | NOT FOUND:NOT FOUND是對(duì)所有以02開(kāi)頭的SQLSTATE代碼的速記
                | SQLEXCEPTION:SQLEXCEPTION是對(duì)所有沒(méi)有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記
                | mysql_error_code

這個(gè)語(yǔ)句指定每個(gè)可以處理一個(gè)或多個(gè)條件的處理程序。如果產(chǎn)生一個(gè)或多個(gè)條件,指定的語(yǔ)句被執(zhí)行。
 

//方法一:捕獲sqlstate_value 
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
SET @info='CAN NOT FIND'; 


//方法二:捕獲mysql_error_code 
DECLARE CONTINUE HANDLER FOR 1148SET @info='CAN NOT FIND';

 
//方法三:先定義條件,然后調(diào)用 
DECLARE can_not_find CONDITION FOR 1146 ; 
DECLARE CONTINUE HANDLER FOR can_not_find SET 
set @info='CAN NOT FIND'; 


//方法四:使用SQLWARNING 
DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; 

//方法五:使用NOT FOUND 
DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND';
 
//方法六:使用SQLEXCEPTION 
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';

eg:

delimiter //
DROP PROCEDURE IF EXISTS sp2;
CREATE PROCEDURE sp2()
BEGIN
		DECLARE CONTINUE HANDLER for SQLSTATE '23000' set @info = 23000;
		SET @info = 1;
		INSERT INTO test.t_user VALUES (1,'test','test','test');
		SET @info = 2;
		INSERT INTO test.t_user VALUES (1,'test','test','test');		
		SET @info = 3;
END //
delimiter ;

-- 執(zhí)行以下sp2
call sp2();

-- 查詢以下@info 
SELECT @info;

--結(jié)果分析:如果程序沒(méi)有出錯(cuò),按照?qǐng)?zhí)行目的,結(jié)果@info = 3; 如果被捕獲了 '23000' 則結(jié)果是@23000; 

使用continue作為執(zhí)行handler_type的話,捕獲異常就繼續(xù)執(zhí)行;所以結(jié)果為3;
使用exit作為執(zhí)行handler_type的話,捕獲異常后直接結(jié)束,所以結(jié)果為23000;

7、光標(biāo)

        簡(jiǎn)單光標(biāo)在存儲(chǔ)程序和函數(shù)內(nèi)被支持。語(yǔ)法如同在嵌入的SQL中。光標(biāo)當(dāng)前是不敏感的,只讀的及不滾動(dòng)的。 不敏感意為服務(wù)器可以活不可以復(fù)制它的結(jié)果表。 光標(biāo)必須在聲明處理程序之前被聲明,并且變量和條件必須在聲明光標(biāo)或處理程序之前被聲明。
    

    1、聲明光標(biāo)

        DECLARE cursor_name CURSOR FOR select_statement

        這個(gè)語(yǔ)句聲明一個(gè)光標(biāo)。也可以在子程序中定義多個(gè)光標(biāo),但是一個(gè)塊中的每一個(gè)光標(biāo)必須有唯一的名字。 SELECT語(yǔ)句不能有INTO子句。

    2、打開(kāi)光標(biāo)

        OPEN cursor_name 這個(gè)語(yǔ)句打開(kāi)先前聲明的光標(biāo)。

    3、使用光標(biāo)  FETCH

        FETCH cursor_name INTO var_name [, var_name] ... 這個(gè)語(yǔ)句用指定的打開(kāi)光標(biāo)讀取下一行(如果有下一行的話),并且前進(jìn)光標(biāo)指針

    4、關(guān)閉光標(biāo)

        CLOSE cursor_name 這個(gè)語(yǔ)句關(guān)閉先前打開(kāi)的光標(biāo)。 如果未被明確地關(guān)閉,光標(biāo)在它被聲明的復(fù)合語(yǔ)句的末尾被關(guān)閉。

    2、流程控制構(gòu)造

1.IF語(yǔ)句

IF語(yǔ)句用來(lái)進(jìn)行條件判斷。根據(jù)是否滿足條件,將執(zhí)行不同的語(yǔ)句。其語(yǔ)法的基本形式如下:

IF search_condition THEN statement_list 
[ELSEIF search_condition THEN statement_list] ... 
[ELSE statement_list] 
END IF

其中,search_condition參數(shù)表示條件判斷語(yǔ)句;statement_list參數(shù)表示不同條件的執(zhí)行語(yǔ)句。

注意:MYSQL還有一個(gè)IF()函數(shù),他不同于這里描述的IF語(yǔ)句

下面是一個(gè)IF語(yǔ)句的示例。代碼如下:

delimiter //
DROP PROCEDURE IF EXISTS sp3;
CREATE PROCEDURE sp3()
BEGIN
	DECLARE age int DEFAULT 19;
	set @age1 = 0;
	SET @age2 = 0;
	set @age3 = 0;
	IF age>20 
		THEN SET @age1=age;  
	ELSEIF age=20 
		THEN SET @age2=age;  
	ELSE 
		SET @age3=-1;  
	END IF; 
END //
delimiter ;
call sp3();

該示例根據(jù)age與20的大小關(guān)系來(lái)執(zhí)行不同的SET語(yǔ)句。

如果age值大于20,那么將count1的值加1;如果age值等于20,那么將count2的值加1;

其他情況將count3的值加1。IF語(yǔ)句都需要使用END IF來(lái)結(jié)束。

2.CASE語(yǔ)句

CASE語(yǔ)句也用來(lái)進(jìn)行條件判斷,其可以實(shí)現(xiàn)比IF語(yǔ)句更復(fù)雜的條件判斷。CASE語(yǔ)句的基本形式如下:

CASE case_value 
WHEN when_value THEN statement_list 
[WHEN when_value THEN statement_list] ... 
[ELSE statement_list] 
END CASE

其中,case_value參數(shù)表示條件判斷的變量;

when_value參數(shù)表示變量的取值;

statement_list參數(shù)表示不同when_value值的執(zhí)行語(yǔ)句。

CASE語(yǔ)句還有另一種形式。該形式的語(yǔ)法如下:

CASE 
WHEN search_condition THEN statement_list 
[WHEN search_condition THEN statement_list] ... 
[ELSE statement_list] 
END CASE

其中,search_condition參數(shù)表示條件判斷語(yǔ)句;

statement_list參數(shù)表示不同條件的執(zhí)行語(yǔ)句。

下面是一個(gè)CASE語(yǔ)句的示例。代碼如下:

delimiter //
DROP PROCEDURE IF EXISTS sp4;
CREATE PROCEDURE sp4()
BEGIN
	DECLARE age int DEFAULT 19;
	set @age1 = 0;
	CASE age
		WHEN age > 20 THEN SET @age1 = age;
		WHEN age = 20 THEN SET @age1 = age-1;
		ELSE SET @age1 = -1;
	END CASE;
END //
delimiter ;
call sp4();
select @age1;

注意:這里的CASE語(yǔ)句和“控制流程函數(shù)”里描述的SQL CASE表達(dá)式的CASE語(yǔ)句有輕微不同。這里的CASE語(yǔ)句不能有ELSE NULL子句

并且用END CASE替代END來(lái)終止??!

3.LOOP語(yǔ)句

LOOP語(yǔ)句可以使某些特定的語(yǔ)句重復(fù)執(zhí)行,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的循環(huán)。

但是LOOP語(yǔ)句本身沒(méi)有停止循環(huán)的語(yǔ)句,必須是遇到LEAVE語(yǔ)句等才能停止循環(huán)。

LOOP語(yǔ)句的語(yǔ)法的基本形式如下:

[begin_label:] LOOP 
statement_list 
END LOOP [end_label]

其中,begin_label參數(shù)和end_label參數(shù)分別表示循環(huán)開(kāi)始和結(jié)束的標(biāo)志,這兩個(gè)標(biāo)志必須相同,而且都可以省略;(例子與leave結(jié)合一起寫(xiě))

4.LEAVE語(yǔ)句

LEAVE語(yǔ)句主要用于跳出循環(huán)控制。其語(yǔ)法形式如下:

LEAVE label

其中,label參數(shù)表示循環(huán)的標(biāo)志。

下面是一個(gè)LEAVE語(yǔ)句的示例。代碼如下:

delimiter //
DROP PROCEDURE IF EXISTS sp5;
CREATE PROCEDURE sp5()
BEGIN
	set @age = 0;
	add_age:LOOP
	  SET @age = @age + 1;
	if @age>1000 
      THEN LEAVE add_age;
	end IF;
	END LOOP add_age;
END //
delimiter ;
-- 調(diào)用
call sp5();

-- 查看結(jié)果
select @age;

該示例循環(huán)執(zhí)行count加1的操作。當(dāng)count的值等于100時(shí),則LEAVE語(yǔ)句跳出循環(huán)。

5.ITERATE語(yǔ)句

ITERATE語(yǔ)句也是用來(lái)跳出循環(huán)的語(yǔ)句。但是,ITERATE語(yǔ)句是跳出本次循環(huán),然后直接進(jìn)入下一次循環(huán)。

ITERATE語(yǔ)句只可以出現(xiàn)在LOOP、REPEAT、WHILE語(yǔ)句內(nèi)。

ITERATE語(yǔ)句的基本語(yǔ)法形式如下:

ITERATE label

其中,label參數(shù)表示循環(huán)的標(biāo)志。

下面是一個(gè)ITERATE語(yǔ)句的示例。代碼如下:

delimiter //
DROP PROCEDURE IF EXISTS sp6;
CREATE PROCEDURE sp6()
BEGIN
	DECLARE age int DEFAULT 0;
	DECLARE EXIT HANDLER FOR SQLSTATE '23000' SET age = 23000;
	add_fun:LOOP
		SET age = age + 1;
		IF age > 10
			THEN INSERT into t_user value(1, 'lennon', 'lennon', 'lennon');
		ELSEIF age > 5 && age < 10
			THEN ITERATE add_fun;
		ELSE 
			select age;
		END IF;
	END LOOP add_fun;
END //
delimiter ;
call sp6();

說(shuō)明:LEAVE語(yǔ)句和ITERATE語(yǔ)句都用來(lái)跳出循環(huán)語(yǔ)句,但兩者的功能是不一樣的。

LEAVE語(yǔ)句是跳出整個(gè)循環(huán),然后執(zhí)行循環(huán)后面的程序。而ITERATE語(yǔ)句是跳出本次循環(huán),然后進(jìn)入下一次循環(huán)。

使用這兩個(gè)語(yǔ)句時(shí)一定要區(qū)分清楚。

6.REPEAT語(yǔ)句

REPEAT語(yǔ)句是有條件控制的循環(huán)語(yǔ)句。當(dāng)滿足特定條件時(shí),就會(huì)跳出循環(huán)語(yǔ)句。REPEAT語(yǔ)句的基本語(yǔ)法形式如下:

[begin_label:] REPEAT 
statement_list 
UNTIL search_condition 
END REPEAT [end_label]

其中,statement_list參數(shù)表示循環(huán)的執(zhí)行語(yǔ)句;search_condition參數(shù)表示結(jié)束循環(huán)的條件,滿足該條件時(shí)循環(huán)結(jié)束。

下面是一個(gè)REPEAT語(yǔ)句的示例。代碼如下:

delimiter //
DROP PROCEDURE IF EXISTS sp7;
CREATE PROCEDURE sp7()
BEGIN
	set @age = 0;
	add_count:REPEAT
		set @age = @age + 1 ;
	UNTIL @age>100 END REPEAT add_count;
END //
delimiter ;

call sp7();

select @age;

該示例循環(huán)執(zhí)行count加1的操作,count值為100時(shí)結(jié)束循環(huán)。

REPEAT循環(huán)都用END REPEAT結(jié)束。

7.WHILE語(yǔ)句

WHILE語(yǔ)句也是有條件控制的循環(huán)語(yǔ)句。但WHILE語(yǔ)句和REPEAT語(yǔ)句是不一樣的。

WHILE語(yǔ)句是當(dāng)滿足條件時(shí),執(zhí)行循環(huán)內(nèi)的語(yǔ)句。

WHILE語(yǔ)句的基本語(yǔ)法形式如下:

[begin_label:] WHILE search_condition DO 
statement_list 
END WHILE [end_label]

其中,search_condition參數(shù)表示循環(huán)執(zhí)行的條件,滿足該條件時(shí)循環(huán)執(zhí)行;

statement_list參數(shù)表示循環(huán)的執(zhí)行語(yǔ)句。

下面是一個(gè)ITERATE語(yǔ)句的示例。代碼如下:

delimiter //
DROP PROCEDURE IF EXISTS sp8;
CREATE PROCEDURE sp8()
BEGIN
	set @age = 0;
	
	WHILE @age < 100 DO
		set @age = @age + 1 ;
	END WHILE;

END //
delimiter ;

call sp8();

select @age;

該示例循環(huán)執(zhí)行count加1的操作,count值小于100時(shí)執(zhí)行循環(huán)。

如果count值等于100了,則跳出循環(huán)。WHILE循環(huán)需要使用END WHILE來(lái)結(jié)束。

8、查看存儲(chǔ)過(guò)程

SHOW { PROCEDURE | FUNCTION } STATUS [ LIKE  ' pattern ' ] ;
SHOW CREATE { PROCEDURE | FUNCTION } sp_name ;
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=' sp_name ' ;

eg:

show PROCEDURE STATUS like 'sp6';

show CREATE PROCEDURE sp6;

SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='sp6' ;

感謝各位的閱讀,以上就是“mysql存儲(chǔ)過(guò)程怎么理解”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)mysql存儲(chǔ)過(guò)程怎么理解這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI