最近由於有同事編寫了存儲函數,需要進行驗證,但是對存儲過程一直不是很了解,所以抽時間了解了一下存儲過程的基本語法。本篇文章主要包括介紹了存儲過程的5個小語法:declare語句的變量、定義條件、處理程序、光標、流程控制構造。在找了很久的資料后,其實發現最實在的資料就是官方的參考手冊。我參考的是MySQL5.1參考手冊官方簡體中文版.chm。
存儲過程:為以后的使用而保存的一條或多條Mysql語句的集合。
DECLARE 語句:不同項目局域到一個子程序:局部變量、條件、處理程序、光標。DECLARE僅被用在BEGIN..END復合語句里,且必須在復合語句的開頭,在其他任何語句之前。
1、存儲程序中的變量:DECLARE局部變量、變量SET語句、SELECT...INTO語句
1.1 DECLARE局部變量語法: DECLARE var_name[,....] type [DEFAULT value]
這個語句給變量提供一個默認值,請包含一個default子句,值可以被指定為一個表達式,不需要為一個常數。
如果沒有default子句,初始值為NULL.
局部變量的作用范圍在它被聲明的BEGIN...END塊內。
1.2 變量SET語句語法:SET var_name = expr [, var_name = expr] ....
1.3 SELECT...INTO語句語法:SELECT col_name[,....] INTO var_name[,...] table_expr
這個select語法把選定的列直接存儲到變量。
比如:select id,data into x,y from test.t1 limit 1
存儲程序中的變量最終轉化為一張圖,如果這張表看懂了,基本不用看上面的文字,如圖:
2、條件和處理程序:DECLARE 條件、DECLARE處理程序
2.1 DECLARE條件
DECLARE條件語法:DECLARE condition_name CONDITION FOR condition_value
Condition_value:
SQLSTATE [VALUE] sqlstate_value | mysql_error_code
這個語句指定需要特殊處理的條件,它將一個名字和指定的錯誤條件關聯起來,隨后會用在declare handler語句中。
2.2 DECLARE處理程序
DECLARE處理程序:DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
這個語句指定每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,指定的語句被執行。
Handler_type包含:CONTINUE | EXIT | UNDO
——對於CONTINUE 處理程序,當前子程序的執行在執行處理程序語句之后繼續,即遇到錯誤不處理,繼續執行
——對於EXIT 處理程序,當前BEGIN...END符合語句的執行被終止,即遇到錯誤立即退出。
——UNDO處理程序類型語句還不被支持,即遇到錯誤立馬回退。
Condition_value包含:SQLSTATE [VALUE] sqlstate_value
|condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
這個語句指定每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,指定的語句被執行。
——SQLWARNING是對所有以01開頭的SQLSTATE代碼的速記
——NOT FOUND 是對所有以02開頭的SQLSTATE代碼的速記
——SQLEXCEPTION是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記
參考博文: https://blog.csdn.net/mytt_10566/article/details/80555250
2.3 光標(游標)
光標:內存中的一塊區域,存放的是select的結果。
光標在存儲程序和函數內被支持。
光標必須在聲明處理程序之前被聲明,並且變量和條件必須在聲明光標或處理程序之前被聲明。
聲明光標:DECLARE cursor_name CURSOR FOR select_statement
這個語句聲明一個光標,也可以在子程序中定義多個光標,但是一個塊中的每一個光標必須有唯一的名字。
Select語句不能有into語句。
光標open語句:open cursor_name
這個語句打開先前聲明的光標。
光標fetch語句:FETCH cursor_name INTO var_name [, var_name] ...
這個語句用指定的打開光標讀取下一行(如果有下一行的話),並且前進光標指針。
光標close語句:CLOSE cursor_name
這個語句關閉先前打開的光標,如果未被明確地關閉,關閉在它被聲明的復合語句的末尾被關閉。
2.4 流程控制構造
IF條件語句:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
IF實現了一個基本的條件構造,如果search_condition求值為真,相應的SQL列表被執行。如果沒有search_condition匹配,在ELSE子句里的語句列表被執行。Statement_list可以包括一個或多個語句。
CASE條件語句:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
OR:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
存儲程序的CASE語句實現一個復雜的條件構造。如果search_condition求值為真,相應的SQL被執行。如果沒有搜索條件匹配,在ELSE子句里的語句被執行。
LOOP循環語句:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP允許某特定語句或語句群的重復執行,實現一個簡單的循環構造。在循環內的語句一直重復直循環被退出,退出通常伴隨着一個LEAVE語句。
LEAVE退出語句:LEAVE label
這個語句被用來退出任何被標注的流程控制構造。它和BEGIN...END或循環一起被使用。
ITEARTE再次循環語句:ITEARTE label
ITEARTE 只可以出現在LOOP、REPEAT和WHILE語句內。ITERATE意思為:再次循環。
REPEAT 循環語句:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
REPEAT語句內的語句或語句群被重復,直至search_condition 為真。
REPEAT 語句可以被標注。 除非begin_label也存在,end_label才能被用,如果兩者都存在,它們必須是一樣的。
WHILE 循環語句:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
WHILE語句內的語句或語句群被重復,直至search_condition 為真。
WHILE語句可以被標注。 除非begin_label也存在,end_label才能被用,如果兩者都存在,它們必須是一樣的。
IF、CASE、LOOP、WHILE、ITERATE、LEAVE構造被完全實現。
這些構造可能每個包含要么一個單獨語句,要么是使用BEGIN...END復合語句的一塊語句。
anyway,流程控制構造說了那么多,其實最重要的就是包含條件語句、循環語句、退出語句。如果大家不想看那么多文字,只需要看懂下面的圖,就能很清晰的了解流程控制構造的一些基本內容。
條件語句IF和CASE語句的流程圖:
循環語句、退出語句示例圖: