Mysql 存儲過程(變量、定義條件、處理程序、光標、流程控制構造)


       最近由於有同事編寫了存儲函數,需要進行驗證,但是對存儲過程一直不是很了解,所以抽時間了解了一下存儲過程的基本語法。本篇文章主要包括介紹了存儲過程的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語句的流程圖:

 

 

 

  

循環語句、退出語句示例圖:

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM