溫馨提示×

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

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

MySQL創(chuàng)建存儲(chǔ)程序的方法

發(fā)布時(shí)間:2021-03-26 10:16:36 來源:億速云 閱讀:136 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

小編給大家分享一下MySQL創(chuàng)建存儲(chǔ)程序的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

簡(jiǎn)單地說,存儲(chǔ)過程就是一條或者多條SQL語(yǔ)句的組合,可視為批文件,但是其作用又不僅限于批處理。

(1)創(chuàng)建存儲(chǔ)過程
(2)創(chuàng)建存儲(chǔ)函數(shù)
(3)變量的使用
(4)定義條件和處理程序
(5)光標(biāo)的使用
(6)流程控制的使用


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

創(chuàng)建存儲(chǔ)過程需要使用create procedure 語(yǔ)句,基本語(yǔ)法格式如下:

create procedure sp_name( [ proc_parameter ] )[ characteristics ... ] routine_body

create procedure 為用來創(chuàng)建存儲(chǔ)函數(shù)的關(guān)鍵字;sp_name為存儲(chǔ)過程的名稱;proc_parameter為存儲(chǔ)過程的參數(shù)列表,列表形式如下:

[in | out | inout] param_name type
  • in表示輸入?yún)?shù)

  • out表示輸出參數(shù)

  • inout表示既可以輸入也可以輸出

  • param_name表示參數(shù)名稱;type表示參數(shù)的類型

characteristics指定存儲(chǔ)過程的特征,有以下取值:

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

  • [not] deterministic: 指明存儲(chǔ)過程執(zhí)行的結(jié)果是否正確。deterministic表示每次執(zhí)行存儲(chǔ)過程時(shí),相同的輸入會(huì)得到相同的輸出;而not deterministic表示相同的輸入可能得到不同的輸出。默認(rèn)為not deterministic。

  • {contains SQL | no SQL | reads SQL date | modifies SQL date } :指明子程序使用SQL語(yǔ)句的限制。contains SQL表明子程序包含SQL語(yǔ)句;no SQL表明子程序不包含SQ;reads SQL data 表明子程序包含讀數(shù)據(jù)的語(yǔ)句;modifies SQL data表明子程序包含寫數(shù)據(jù)的語(yǔ)句。默認(rèn)為contatins SQL。

  • SQL security {definer | invoker}:指明誰(shuí)有權(quán)限來執(zhí)行。definer表示只有定義者才能執(zhí)行;invoker表示擁有權(quán)限的調(diào)用者可以執(zhí)行。默認(rèn)為definer。

  • comment ‘string’:注釋信息,可以用來描述存儲(chǔ)過程或函數(shù)。

routine_body是SQL代碼的內(nèi)容,可以用begin…end來表示SQL代碼的開始和結(jié)束。

【例1】創(chuàng)建查看fruits表的存儲(chǔ)過程,代碼語(yǔ)句如下:

create procedure proc()
	BEGIN
	select * from fruits;
	END ;

這個(gè)代碼創(chuàng)建了一個(gè)查看fruits表的存儲(chǔ)過程,代碼執(zhí)行過程如下:

mysql> delimiter //mysql> create procedure Proc()
    -> begin
    -> select * from fruits;
    -> end //Query OK, 0 rows affected (0.36 sec)mysql> delimiter ;
  • 提示:“delimiter //“語(yǔ)句的作用是將MySQL的結(jié)束符設(shè)置為//,因?yàn)镸ySQL默認(rèn)語(yǔ)句結(jié)束符號(hào)為分號(hào)”;”,這樣做是為了避免與存儲(chǔ)過程中SQL語(yǔ)句結(jié)束符相沖突。存儲(chǔ)過程定義完之后再使用"delimiter ;“恢復(fù)默認(rèn)結(jié)束符。使用delimiter命令時(shí),應(yīng)避免使用反斜杠”",因?yàn)榉葱备苁荕ySQL中的轉(zhuǎn)義字符。

【例2】創(chuàng)建名稱為CountProc的存儲(chǔ)過程,代碼如下:

create procedure CountProc (OUT paraml int)beginselect count(*) into paraml from fruits;end;

上述代碼創(chuàng)建了一個(gè)獲取fruits表記錄條數(shù)的存儲(chǔ)過程,名稱是CountProc,count(*)計(jì)算后把結(jié)果放入?yún)?shù)paraml中。代碼的執(zhí)行結(jié)果如下:

mysql> delimiter  //mysql> create procedure CountProc(OUT paraml int )
    -> begin
    -> select count(*) into paraml from fruits;
    -> end //Query OK, 0 rows affected (0.08 sec)mysql> delimiter ;
(2)創(chuàng)建存儲(chǔ)函數(shù)

創(chuàng)建存儲(chǔ)函數(shù),需要使用create function語(yǔ)句,基本語(yǔ)法如下:

create function func_name ( [ func_parameter] )
returns type
[characteristic ...] routine_body
  • create function為用來創(chuàng)建存儲(chǔ)函數(shù)的關(guān)鍵字

  • func_name表示存儲(chǔ)函數(shù)的名稱

  • func_parameter為存儲(chǔ)過程的參數(shù)列表,參數(shù)列表形式為:[in | out | inout] param_name type

其中,in表示輸入?yún)?shù),out表示輸出參數(shù),inout表示既可以輸入也可以輸出param_name表示參數(shù)名稱,type表示參數(shù)的類型;returns type語(yǔ)句表示函數(shù)返回?cái)?shù)據(jù)的類型;characteristic指定存儲(chǔ)函數(shù)的特性,取值與創(chuàng)建存儲(chǔ)過程時(shí)相同。

【例3】創(chuàng)建存儲(chǔ)函數(shù),名稱為NameByZip,該函數(shù)返回select語(yǔ)句的查詢結(jié)果,數(shù)值類型為字符串型,代碼如下:

create function NameByZip()returns char( 50)return(select s_name from suppliers where s_call ='48075');

代碼的執(zhí)行結(jié)果如下;

mysql> delimiter //mysql> create function NameByZip()
    -> returns char(50)
    -> return (select s_name from suppliers where s_call = '48075');
    -> //Query OK, 0 rows affected (0.06 sec)mysql> delimiter;

如果在存儲(chǔ)函數(shù)中的ruturn語(yǔ)句返回一個(gè)類型不同于函數(shù)的returns子句中指定類型的值,返回值將被強(qiáng)制為恰當(dāng)?shù)念愋汀?/p>

  • 注意:指定參數(shù)為in、out或inout只對(duì)procedure是合法的。(function中總是默認(rèn)為in參數(shù)。)returns子句只能對(duì)function做指定,對(duì)函數(shù)而言是強(qiáng)制的。它用來指定函數(shù)的返回類型,而且函數(shù)體必須包含一個(gè)return value語(yǔ)句。

(3)變量的使用

變量可以在子程序中聲明并使用,這些變量的作用范圍是在begin…end程序中的。

1.定義變量

在存儲(chǔ)過程中使用declar語(yǔ)句定義變量,語(yǔ)法格式如下:

declare var_name[,varname]... date_type [default value];

var_name為局部變量的名稱。default value子句給變量提供一個(gè)默認(rèn)值。值除了可以被聲明為一個(gè)常數(shù)之外,還可以被指定為一個(gè)表達(dá)式。如果沒有default子句,初始值為null。

【例4】定義名稱為myparam的變量,類型為int類型,默認(rèn)值為100,代碼如下:

declare myparam int default 100;

2.為變量賦值

set var_name = expr [,var_name = expr]...;

存儲(chǔ)程序中的set語(yǔ)句是一般set語(yǔ)句的擴(kuò)展版本。被參考變量可能是子程序內(nèi)聲明的變量,或者是全局服務(wù)器變量,如系統(tǒng)變量或者用戶變量。

【例5】聲明3個(gè)變量,分別為var1,var2和var3,數(shù)據(jù)類型為int,使用set為變量賦值,代碼如下:

declare var1,var2,var3 int;set var1 = 10, var2 =20;set var3 = var1 + var2;

MySQL中還可以通過select…into為一個(gè)或多個(gè)變量賦值,語(yǔ)句如下:

select col_name[,...] into var_name[,...] table_expr;

這個(gè)select語(yǔ)法把選定的列直接存儲(chǔ)到對(duì)應(yīng)位置的變量。col_name表示字段名稱;var_name表示定義的變量名稱;table_expr表示查詢條件表達(dá)式,包括表名稱和where子句。

【例6】聲明變量fruitname和fruitprice,通過select…into語(yǔ)句查詢指定記錄并為變量賦值,代碼如下:

declare fruitname char(50);declare fruitprice decimal(8,2);select f_name,f_price into fruitname,fruitpricefrom fruits where f_id='a1;
(4)定義條件和處理程序

特定條件需要特定處理。定義條件是事先定義程序執(zhí)行過程中遇到的問題,處理程序定義了在遇到這些問題時(shí)應(yīng)當(dāng)采取的處理方式,并且保證存儲(chǔ)過程或函數(shù)在遇到警告或錯(cuò)誤時(shí)能繼續(xù)執(zhí)行。這樣就增強(qiáng)了存儲(chǔ)程序處理問題的能力,避免程序異常停止運(yùn)行。

1.定義條件
定義條件使用declare語(yǔ)句,語(yǔ)法格式如下:

declare conditon_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。

這個(gè)語(yǔ)句指定需要特殊處理的條件。它將一個(gè)名字和指定的錯(cuò)誤條件關(guān)聯(lián)起來。這個(gè)名字可以隨后被用在定義處理程序的declare handler語(yǔ)句中。

【例7】定義"error 1148(42000)"錯(cuò)誤,名稱為command_not_allowed??梢杂脙煞N不同的方法來定義,代碼如下:

[方法一]:使用sqlstate_valuedeclare command_not_allowed condition for sqlstate '42000'[]方法二]:使用mysql_error_codedeclare command_not_allowed condition for 1148

2.定義處理程序

定義處理程序時(shí),使用declare語(yǔ)句的語(yǔ)法如下:

declare handler_type handler for condition_value[,...] sp_statement
handler_type:	continue|exit|undo

condition_value:
	sqlstate[value] sqlstate_value	|condition_name	|sqlwarning	|not found	|sqlexception	|mysql_error_code

其中,

  • handler_type為錯(cuò)誤處理方式,參數(shù)取3個(gè)值:continue、exit和undo。

  • continue表示遇到錯(cuò)誤不處理,繼續(xù)執(zhí)行;

  • exit遇到錯(cuò)誤馬上退出;

  • undo表示遇到錯(cuò)誤后撤回之前的操作,MySQL中暫時(shí)不支持這樣的操作。

condition_value表示錯(cuò)誤類型,可以有以下取值:

  • sqlstate[value] sqlstate_value包含5個(gè)字符串錯(cuò)誤值

  • condition_name表示declare condition定義的錯(cuò)誤條件名稱

  • sqlwarning匹配所有以01開頭的sqlstate錯(cuò)誤代碼

  • notfound 匹配所有以02開頭的sqlstate錯(cuò)誤代碼

  • sqlexception匹配所有沒有被sqlwarning或not found捕獲的sqlstate錯(cuò)誤代碼

  • mysql_error_code匹配數(shù)值類型錯(cuò)誤代碼

sp_statement參數(shù)為程序語(yǔ)句段,表示在遇到定義的錯(cuò)誤時(shí),需要執(zhí)行的存儲(chǔ)過程或函數(shù)。

【例8】定義處理程序的幾種方式如下:

方法1:捕獲sqlstate_valuedeclare continue handler for sqlstate '42S02' set @info='No_SUCH_TABLE';方法2:捕獲mysql_error_codedeclare continue handler for 1146 set @info='No_SUCH_TABLE';方法3:先定義條件,然后調(diào)用declare no_such_table condition for 1146;declare continue handler for NO_SUCH_TABLE SET @info='NO_SUCH_TABLE';方法4:使用sqlwarningdeclare exit handler for sqlwarning set @info='ERROR';方法5:使用not founddeclare exit handler for not found set @info=' NO_SUCH_TABLE ';方法6:使用sqlexceptiondeclare exit handler forsqlexception set @info='ERROR';

上述代碼是6種定義處理程序的方法。

第一種,捕獲sqlstate_value值。如果遇到sqlstate_value值為"42S02",執(zhí)行continue操作,并且輸出"NO_SUCH_TABLE"信息。
第二種,捕獲mysql_error_code值。如果遇到mysql_error_code值為1146,就執(zhí)行continue操作,并且輸出"NO_SUCH_TABLE"信息。
第三種,先定義條件再調(diào)用條件。這里先定義no_such_table條件,遇到1146錯(cuò)誤就執(zhí)行continue操作。
第四種,使用sqlwarning。sqlwarning捕獲所有以01開頭的sqlstate_value值,然后執(zhí)行exit操作,并且輸出"ERROE"信息。
第五種,使用not found。not found捕獲所有以02開頭的sqlstate_value值,然后執(zhí)行exit操作,并且輸出"NO_SUCH_TABLE"信息。
第六種,使用SQLEXCEPTION。sqlexception捕獲所有沒有被sqlwarning或not found捕獲的sqlstate_value值,然后執(zhí)行exit操作,并且輸出"ERROR"信息。

【例9】定義條件和處理程序,具體執(zhí)行的過程如下:

mysql> create table test.t(s1 int,primary key (s1));Query OK, 0 rows affected (0.14 sec)mysql> delimiter //mysql> create procedure handlerdemo()
    -> begin
    -> declare continue handler for sqlstate '23000' set @x2=1;
    -> set @x =1;
    -> insert into test.t values(1);
    -> set @x=2;
    -> insert into test.t values(1);
    -> set @x=3;
    -> end;
    -> //Query OK, 0 rows affected (0.06 sec)[調(diào)用存儲(chǔ)過程]mysql> delimiter ;mysql> call handlerdemo();Query OK, 0 rows affected (0.08 sec)[查看調(diào)用過程結(jié)果]mysql> select @x;+------+| @x   |+------+|    3 |+------+1 row in set (0.00 sec)

可以看到,@x 是一個(gè)用戶變量,執(zhí)行結(jié)果@x等于3,這表明MySQL被執(zhí)行到程序末尾。

  • "var_name"表示用戶變量,使用set語(yǔ)句為其賦值。用戶變量與連接有關(guān),一個(gè)客戶端定義的變量不能被其他客戶端看到或使用。當(dāng)客戶端退出時(shí),該客戶端連接的所有變量將自動(dòng)釋放。

(5)光標(biāo)的使用

MySQL中光標(biāo)只能在存儲(chǔ)過程和函數(shù)中使用。

查詢語(yǔ)句可能返回多條記錄,如果數(shù)據(jù)量非常大,需要在存儲(chǔ)過程和存儲(chǔ)函數(shù)中使用光標(biāo)來逐條讀取查詢結(jié)果集中的記錄。光標(biāo)必須在聲明處理程序之前被聲明,并且變量和條件還必須在聲明光標(biāo)或處理程序之前被聲明。

1.聲明光標(biāo)

MySQL中使用declare關(guān)鍵字來聲明光標(biāo),語(yǔ)法形式如下:

declare cursor_name cursor for select_statement

其中,cursor_name參數(shù)表示光標(biāo)的名稱;select_statement表示select語(yǔ)句的內(nèi)容,返回一個(gè)用于創(chuàng)建光標(biāo)的結(jié)果集。

【例10】聲明名稱為cursor_fruit的光標(biāo),代碼如下:

declare cursor_fruit cursor for select f_name,f_price from fruits;

該代碼中光標(biāo)名稱為cursor_fruit,select語(yǔ)句部分從fruits表匯總查詢出f_name和f_price字段的值。

2.打開光標(biāo)

open cursor_name{光標(biāo)名稱}

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

【例11】打開名稱為cursor_fruit的光標(biāo),代碼如下:

open cursor_fruit ;

3.使用光標(biāo)

使用光標(biāo)的語(yǔ)法格式:

fetch cursor_name into var_name [,var_name ] ... {參數(shù)名稱}

其中,cursor_name參數(shù)表示光標(biāo)的名稱;var_name表示將光標(biāo)中的select語(yǔ)句查詢出來的信息存入該參數(shù)中,var_name必須在聲明光標(biāo)之前就定義好。

【例12】使用名稱為cursor_fruit的光標(biāo)。將查詢出來的數(shù)據(jù)存入fruit_name和fruit_price兩個(gè)變量中,代碼如下:

fetch cursor_fruit into fruit_name,fruit_price;

4.關(guān)閉光標(biāo)
關(guān)閉光標(biāo)的語(yǔ)法格式:

close cursor_name(光標(biāo)名稱)

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

【例13】關(guān)閉名稱為cursor_fruit的光標(biāo),代碼如下:

close cursor_fruit;
(6)流程控制的使用

流程控制語(yǔ)句用來根據(jù)條件控制語(yǔ)句的執(zhí)行。MySQL中用來構(gòu)造控制流程的語(yǔ)句有IF語(yǔ)句、case語(yǔ)句、loop語(yǔ)句、leave語(yǔ)句、iterate語(yǔ)句、repeat語(yǔ)句和while語(yǔ)句。每個(gè)流程中可能包含一個(gè)單獨(dú)語(yǔ)句,或者是使用begin…end構(gòu)造的符合語(yǔ)句,構(gòu)造可以被嵌套。

1.if語(yǔ)句

if語(yǔ)句包含多個(gè)條件判斷,根據(jù)判斷的結(jié)果為true或false執(zhí)行相應(yīng)的語(yǔ)句,語(yǔ)法格式如下:

if expr_condition then statement_list	[elseif expr_condition then statement_list]...
	[else statement_list]end if

如果expr_condition求值為真,相應(yīng)的SQL語(yǔ)句列表被執(zhí)行;如果沒有expr_condition匹配,則else子句里的語(yǔ)句列表被執(zhí)行。statement_list列表可包括一個(gè)或多個(gè)語(yǔ)句。

MySQL中還有一個(gè)if()函數(shù),它不同于這里描述的if語(yǔ)句。

【例14】if語(yǔ)句示例

if val is null
	then select ‘val is null’;
	else select 'val is not null';end if

該示例判斷val值是否為空,如果為空輸出字符串"val is null";否則輸出字符串"val is not null"。if語(yǔ)句都需要使用end if來結(jié)束。

2.case語(yǔ)句

case是另一個(gè)進(jìn)行條件判斷的語(yǔ)句,有兩種語(yǔ)句格式,第一種:

case case_expr	when when_value then statement_list	[when when_value then statement_list]...
	[else statement_list]end case
  • case_expr表示條件判斷的表達(dá)式,決定了哪一個(gè)when語(yǔ)句會(huì)被執(zhí)行

  • when_value表示表達(dá)式可能的值。

  • 如果某個(gè)when_value表達(dá)式和case_expr表達(dá)式結(jié)果相同,則執(zhí)行對(duì)應(yīng)的then關(guān)鍵字后面的statement_list中的語(yǔ)句。

  • statement_list表示不同when_value值的執(zhí)行語(yǔ)句。

【例15】使用case流程控制語(yǔ)句的第1種格式,判斷val值等于1、等于2或者兩者都不等,SQL語(yǔ)句如下:

case val	when 1 then select ‘val is 1’;	when 2 then select ‘val is 2’;	else select ‘val is not 1 or 2’;end case;

當(dāng)val值為1時(shí),輸出字符串"val is 1";當(dāng)val值為2時(shí),輸出字符串"val is 2";否則輸出字符串"val is not 1 or 2"。

case語(yǔ)句的第2種格式如下:

case
	when expr_condition then statement_list	[when expr_condition then statement_list]
	[else statement_list]end case
  • expr_condition表示條件判斷語(yǔ)句

  • statement_list表示不同條件的執(zhí)行語(yǔ)句

該語(yǔ)句中,when語(yǔ)句將被逐個(gè)執(zhí)行,直到某個(gè)expr_condition表達(dá)式為真,則執(zhí)行對(duì)應(yīng)then關(guān)鍵字后面的statement_list語(yǔ)句。如果沒有條件匹配,else子句里的語(yǔ)句被執(zhí)行。

注意:存儲(chǔ)程序中的case語(yǔ)句和case控制流程函數(shù)的區(qū)別:
存儲(chǔ)程序中的case語(yǔ)句不能有else null子句,并且用end case替代end來終止。

【例16】使用case流程控制語(yǔ)句的第2種格式,判斷val是否為空、小于0、大于0或者等于0,SQL語(yǔ)句如下:

case
	when val is null then select  ‘val is null’;
	when val < 0 then  select 'val is less than 0';
	when val > 0 then select 'val is greater than 0';
	else select 'val is 0';end case;

當(dāng)val值為空時(shí),輸出字符串"val is null";當(dāng)val值小于0時(shí),輸出字符串"val is less than 0";當(dāng)val值大于0時(shí),輸出字符串"val is greater than 0";否則輸出字符串"val is 0"。

3.loop語(yǔ)句

loop循環(huán)語(yǔ)句用來重復(fù)執(zhí)行某些語(yǔ)句,與if和case語(yǔ)句相比,loop只是創(chuàng)建一個(gè)循環(huán)操作過的過程,并不進(jìn)行條件判斷。退出循環(huán)過程使用leave子句。loop語(yǔ)法格式如下:

[loop_label:] loop
	statement_listend loop [loop_label]

loop_label表示loop語(yǔ)句的標(biāo)注名稱,該參數(shù)可省略。statement_list參數(shù)表示需要循環(huán)執(zhí)行的語(yǔ)句。

【例17】使用loop語(yǔ)句進(jìn)行循環(huán)操作,id值小于等于10之前,將重復(fù)執(zhí)行循環(huán)過程,SQL語(yǔ)句如下:

declare id int default 10add_loop:loopset id = id +1;
	if >=10 then leave add_loop;
	end if;end loop add_ loop;

該示例循環(huán)執(zhí)行id加1的操作。當(dāng)id值小于10時(shí),循環(huán)重復(fù)執(zhí)行。當(dāng)id值大于或等于10時(shí),使用leave語(yǔ)句退出循環(huán)。loop循環(huán)都以end loop結(jié)束。

4.leave語(yǔ)句

leave語(yǔ)句用來退出任何被標(biāo)注的流程控制構(gòu)造,leave語(yǔ)句基本格式如下:

leave label

其中,label參數(shù)表示循環(huán)的標(biāo)志。leave和begin…end或循環(huán)一起被使用。

【例18】使用leave語(yǔ)句退出循環(huán),代碼如下:

add_num:loopset @count=@count+1;if @count=50 then leave add_num;end loop add_num;

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

5.iterate語(yǔ)句

iterater label語(yǔ)句將執(zhí)行順序轉(zhuǎn)到語(yǔ)句段開頭處,語(yǔ)法格式如下:

iterate label

iterate只可以出現(xiàn)在loop、repeat和while語(yǔ)句內(nèi)。iterate的意思為"再次循環(huán)",label參數(shù)表示循環(huán)的標(biāo)志。iterate語(yǔ)句必須跟在循環(huán)標(biāo)志前面。

【例19】iterate語(yǔ)句示例:

create procedure doiterate()begin
 declare p1 int default 0;
 declare p1 int default 0;
 my_loop:loop;
 set p1 = p1 + 1;
 if p1 < 10 then iterate my_loop;
 elseif p1 > 20 then leave my_loop;
 end if;
 select 'p1 is between 10 and 20';end loop my_loop;end

首先定義p1=0,當(dāng)p1的值小于10時(shí)重復(fù)執(zhí)行p1加1操作;當(dāng)p1大于等于10并且小于等于20時(shí),打印消息"p1 is between 10 and 20";當(dāng)p1大于20時(shí),退出循環(huán)。

6.repeat語(yǔ)句

repeat語(yǔ)句創(chuàng)建一個(gè)帶條件判斷的循環(huán)過程,每次語(yǔ)句執(zhí)行完畢之后,會(huì)對(duì)條件表達(dá)式進(jìn)行判斷,若表達(dá)式為真,則循環(huán)結(jié)束;否則重復(fù)執(zhí)行循環(huán)中的語(yǔ)句。repeat語(yǔ)句的語(yǔ)法格式如下:

[repeat_label:] repeat
	statement_list
until expr_conditionend repeat [repeat_label]

repeat_label為repeat語(yǔ)句的標(biāo)注名稱,該參數(shù)可以省略;repeat語(yǔ)句內(nèi)的語(yǔ)句或語(yǔ)句群被重復(fù),直至expr_condition為真。

【例20】repeat語(yǔ)句示例,id值等于10之前,將重復(fù)執(zhí)行循環(huán)過程,代碼如下:

declare id int default 0;repeatset id = id + 1;
until id >= 10end repeat;

該示例循環(huán)執(zhí)行id加1的操作。當(dāng)id值小于10時(shí),循環(huán)重復(fù)執(zhí)行;當(dāng)id值大于或者等于10時(shí),退出循環(huán)。repeat循環(huán)都以end repeat結(jié)束。

7.while語(yǔ)句

while語(yǔ)句創(chuàng)建一個(gè)帶條件判斷的循環(huán)過程,與repeat不同,while在執(zhí)行語(yǔ)句執(zhí)行時(shí),先對(duì)指定的表達(dá)式進(jìn)行判斷,如果為真,就執(zhí)行循環(huán)內(nèi)的語(yǔ)句,否則退出循環(huán)。while語(yǔ)句的基本格式如下:

[while_label:] while expr_condition do
	statement_listend while [while_label]
  • while_label為while語(yǔ)句的標(biāo)注名稱

  • expr_condition為進(jìn)行判斷的表達(dá)式,如果表達(dá)式結(jié)果為真,while語(yǔ)句內(nèi)的語(yǔ)句或語(yǔ)句群被執(zhí)行,直至expr_condition為假,退出循環(huán)。

【例21】while語(yǔ)句示例,i值小于10時(shí),將重復(fù)執(zhí)行循環(huán)過程,代碼如下:

declare i int default 0;while i <10 doset i = i + 1;end while;

以上是“MySQL創(chuàng)建存儲(chǔ)程序的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(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