在游標(biāo)里面我們有簡要的介紹了一個NOT FOUND這個條件處理(錯誤、異常處理)的情況,條件處理涉及到兩個語句,一個是DECLARE...CONDITION,另一個是DECLARE....HANDLER。在游標(biāo)的例子中是使用了一個DECLARE....HANDLER。先來看看DECLARE....HANDLER。 1、DECLARE....HANDLER語句 這個語句用于但數(shù)據(jù)庫出現(xiàn)某種情況的時候(condition,大部分指發(fā)生某種錯誤時),來定義具體的處理辦法(handler);所以這里涉及到包括:a、就是個什么情況 b、如何處理它;下面是其格式
[sql] view plaincopy
a、condition_value [,condition_value],這個的話說明可以包括多種情況(方括弧表示可選的),也就是一個handler可以定義成針對多種情況進(jìn)行相應(yīng)的操作;另外condition_value可以包括的值有上面列出來的6種: 1、mysql_error_code,這個表示mysql的錯誤代碼,錯誤代碼是一個數(shù)字,完成是由mysql自己定義的,這個值可以參考mysql數(shù)據(jù)庫錯誤代碼及信息。 2、SQLSTATE [VALUE] sqlstate_value,這個同錯誤代碼類似形成一一對應(yīng)的關(guān)系,它是一個5個字符組成的字符串,關(guān)鍵的地方是它從ANSI SQL和ODBC這些標(biāo)準(zhǔn)中引用過來的,因此更加標(biāo)準(zhǔn)化,而不像上面的error_code完全是mysql自己定義給自己用的,這個和第一個類似也可以參考mysql數(shù)據(jù)庫錯誤代碼及信息。 3、condtion_name,這個是條件名稱,它使用DECLARE...CONDITION語句來定義,這個后面我們會介紹如何定義自己的condition_name。 4、SQLWARNING,表示SQLTATE中的字符串以‘01’起始的那些錯誤,比如Error: 5、NOT FOUND,表示SQLTATE中的字符串以‘02’起始的那些錯誤,比如Error: 6、SQLEXCEPTION,表示SQLSTATE中的字符串不是以'00'、'01'、'02' 起始的那些錯誤,這里'00'起始的SQLSTATE其實(shí)表示的是成功執(zhí)行而不是錯誤,另外兩個就是上面的4和5的兩種情況。 上面的6種情況其實(shí)可以分為兩類,一類就是比較明確的處理,就是對指定的錯誤情況進(jìn)行處理,包括1、2、3這三種方式;另一類是對對應(yīng)類型的錯誤的處理,就是對某一群錯誤的處理,包括4、5、6這三種方式。這個是介紹了condition_value。另外還要注意的一個內(nèi)容是MySQL在默認(rèn)情況下(也就是我們沒有定義處理錯誤的方法-handler)自己的錯誤處理機(jī)制:1、對于SQLWARNING和NOT FOUND的處理方法就是無視錯誤繼續(xù)執(zhí)行,所以在游標(biāo)的例子里面如果我們沒有對repeat的條件判斷的那個值做個no_more_products=1的handler來處理,那么循環(huán)就會一直下去。2、對于SQLEXCEPTION的話,其默認(rèn)的處理方法是在出現(xiàn)錯誤的地方就終止掉了。 b、statement,這個比較簡單就是當(dāng)出現(xiàn)某種條件/錯誤時,我們要執(zhí)行的語句,可以是簡單的如 SET var = value這樣的簡單的語句,也可以是復(fù)雜的多行的語句,多行的話可以使用BEGIN ..... END這里把語句包括在里面(這個好比delphi里面的情況,注意到我們的存儲過程也是多行的,所以也要BEGIN .... END)。 c、handler_action,這個表示當(dāng)執(zhí)行完上面的statement后,希望執(zhí)行怎樣的動作,這里包括CONTINUE、EXIT、UNDO,表示繼續(xù)、退出、撤銷(暫時不支持)。這邊就是兩種動作,其實(shí)這兩種動作在上面也說過了,CONTINUE就是一個是SQLWARNING和NOT FOUND的默認(rèn)處理方法,而EXIT就是SQLEXCEPTION的默認(rèn)處理方法。 來看個簡單的例子,這里創(chuàng)建一個對SQLSTATE的代碼為'23000'的錯誤(重復(fù)的主鍵)進(jìn)行處理的HANDLER,每次發(fā)生時我們對變量@x進(jìn)行增加1:
[sql] view plaincopy
測試比較簡單,這里我們數(shù)據(jù)庫里面本身就有記錄了,然后在Qurey browser中先輸入 SET @x = 0; 然后調(diào)用存儲過程下面是結(jié)果: 通過結(jié)果我們知道出現(xiàn)了兩次插入的記錄同原有的記錄出現(xiàn)主鍵重復(fù)的情況。當(dāng)然這個是由下面這個代碼觸發(fā)的。 INSERT INTO products values(1,default,default,default,default,default); 2、DECLARE...CONDITION語句 這個語句其實(shí)是為了讓我們的錯誤條件更加的清晰明了化的,對于上面的情況,像SQLSTATE '23000'這種表示是一種很不直觀的方法,要通過相應(yīng)的文檔去對應(yīng),閱讀起來比較不方便。而DECLARE....CONDITION可以對條件定義相對應(yīng)的名稱,看個例子就清楚了:
[sql] view plaincopy
|
|