定義異常捕獲類型及處理方法:
| DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement handler_action: CONTINUE | EXIT | UNDO condition_value: mysql_error_code | SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | 
這里面需要注意幾點(diǎn):
a、condition_value [,condition_value],這個(gè)的話說明可以包括多種情況(方括弧表示可選的),也就是一個(gè)handler可以定義成針對(duì)多種情況進(jìn)行相應(yīng)的 操作;另外condition_value可以包括的值有上面列出來的6種:
1、mysql_error_code,這個(gè)表示mysql的錯(cuò)誤代碼,錯(cuò)誤代碼是一個(gè)數(shù)字,完成是由mysql自己定義的,這個(gè)值可以參考mysql數(shù)據(jù)庫錯(cuò)誤代碼及信息。
2、SQLSTATE [VALUE] sqlstate_value,這個(gè)同錯(cuò)誤代碼類似形成一一對(duì)應(yīng)的關(guān)系,它是一個(gè)5個(gè)字符組成的字符串,關(guān)鍵的地方是它從ANSI SQL和ODBC這些標(biāo)準(zhǔn)中引用過來的,因此更加標(biāo)準(zhǔn)化,而不像上面的error_code完全是mysql自己定義給自己用的,這個(gè)和第一個(gè)類似也可以 參考mysql數(shù)據(jù)庫錯(cuò)誤代碼及信息。
3、condtion_name,這個(gè)是條件名稱,它使用DECLARE...CONDITION語句來定義,這個(gè)后面我們會(huì)介紹如何定義自己的condition_name。
4、SQLWARNING,表示SQLTATE中的字符串以‘01'起始的那些錯(cuò)誤,比如Error: 1311 SQLSTATE: 01000 (ER_SP_UNINIT_VAR)
5、NOT FOUND,表示SQLTATE中的字符串以‘02'起始的那些錯(cuò)誤,比如Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)
6、SQLEXCEPTION,表示SQLSTATE中的字符串不是以'00'、'01'、'02' 起始的那些錯(cuò)誤,這里'00'起始的SQLSTATE其實(shí)表示的是成功執(zhí)行而不是錯(cuò)誤,另外兩個(gè)就是上面的4和5的兩種情況。 
上面的6種情況其實(shí)可以分為兩類:
一類就是比較明確的處理,就是對(duì)指定的錯(cuò)誤情況進(jìn)行處理,包括1、2、3這三種方式;
另一類是對(duì)對(duì)應(yīng)類型的錯(cuò)誤的 處理,就是對(duì)某一群錯(cuò)誤的處理,包括4、5、6這三種方式。這個(gè)是介紹了condition_value。另外還要注意的一個(gè)內(nèi)容是MySQL在默認(rèn)情況 下(也就是我們沒有定義處理錯(cuò)誤的方法-handler)自己的錯(cuò)誤處理機(jī)制:
1、對(duì)于SQLWARNING和NOT FOUND的處理方法就是無視錯(cuò)誤繼續(xù)執(zhí)行,所以在游標(biāo)的例子里面如果我們沒有對(duì)repeat的條件判斷的那個(gè)值做個(gè)no_more_products=1的handler來處理,那么循環(huán)就會(huì)一直下去。
2、對(duì)于SQLEXCEPTION的話,其默認(rèn)的處理方法是在出現(xiàn)錯(cuò)誤的地方就終止掉了。
b、statement,這個(gè)比較簡單就是當(dāng)出現(xiàn)某種條件/錯(cuò)誤時(shí),我們要執(zhí)行的語句,可以是簡單的如 SET var = value這樣的簡單的語句,也可以是復(fù)雜的多行的語句,多行的話可以使用BEGIN ..... END這里把語句包括在里面(這個(gè)好比delphi里面的情況,注意到我們的存儲(chǔ)過程也是多行的,所以也要BEGIN .... END)。
新聞熱點(diǎn)
疑難解答
圖片精選