定義條件和處理程序
定義條件和處理程序是事先定義程序執(zhí)行過程中可能遇到的問題。并且可以在處理程序中定義解決這些問題的辦法。這種方式可以提前預(yù)測(cè)可能出現(xiàn)的問題,并提出解決辦法。這樣可以增強(qiáng)程序處理問題的能力,避免程序異常停止。MySQL中都是通過DECLARE關(guān)鍵字來定義條件和處理程序。本小節(jié)中將詳細(xì)講解如何定義條件和處理程序。
定義條件
MySQL中可以使用DECLARE關(guān)鍵字來定義條件。其基本語法如下:
DECLARE
condition_name //條件的名稱
CONDITION FOR
condition_value //表示條件的類型
條件的類型:sqlstate_value參數(shù)和mysql_error_code參數(shù)都可以表示MySQL的錯(cuò)誤。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。
下面定義"ERROR 1146 (42S02)"這個(gè)錯(cuò)誤,名稱為can_not_find。可以用兩種不同的方法來定義,代碼如下:
//方法一:使用sqlstate_value
DECLARE can_not_find CONDITION FOR SQLSTATE '42S02' ;
//方法二:使用mysql_error_code
DECLARE can_not_find CONDITION FOR 1146 ;
定義處理程序
MySQL中可以使用DECLARE關(guān)鍵字來定義處理程序。其基本語法如下:
DECLARE
handler_type //指明錯(cuò)誤的處理方式
HANDLER FOR
condition_value[,...] //指明錯(cuò)誤類型
sp_statement //表示一些存儲(chǔ)過程或函數(shù)的執(zhí)行語句
handler_type參數(shù)指明錯(cuò)誤的處理方式,該參數(shù)有3個(gè)取值。這3個(gè)取值分別是CONTINUE、EXIT和UNDO。CONTINUE表示遇到錯(cuò)誤不進(jìn)行處理,繼續(xù)向下執(zhí)行;EXIT表示遇到錯(cuò)誤后馬上退出;UNDO表示遇到錯(cuò)誤后撤回之前的操作,MySQL中暫時(shí)還不支持這種處理方式。
注意:通常情況下,執(zhí)行過程中遇到錯(cuò)誤應(yīng)該立刻停止執(zhí)行下面的語句,并且撤回前面的操作。但是,MySQL中現(xiàn)在還不能支持UNDO操作。因此,遇到錯(cuò)誤時(shí)最好執(zhí)行EXIT操作。如果事先能夠預(yù)測(cè)錯(cuò)誤類型,并且進(jìn)行相應(yīng)的處理,那么可以執(zhí)行CONTINUE操作。
condition_value參數(shù)指明錯(cuò)誤類型,該參數(shù)有6個(gè)取值。sqlstate_value和mysql_error_code與條件定義中的是同一個(gè)意思。condition_name是DECLARE定義的條件名稱。SQLWARNING表示所有以01開頭的sqlstate_value值。NOT FOUND表示所有以02開頭的sqlstate_value值。SQLEXCEPTION表示所有沒有被SQLWARNING或NOT FOUND捕獲的sqlstate_value值。
下面是定義處理程序的幾種方式。代碼如下:
//方法一:捕獲sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'
SET @info='CAN NOT FIND';
//方法二:捕獲mysql_error_code
DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND';
//方法三:先定義條件,然后調(diào)用
DECLARE can_not_find CONDITION FOR 1146 ;
DECLARE CONTINUE HANDLER FOR can_not_find SET
@info='CAN NOT FIND';
//方法四:使用SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';
//方法五:使用NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND';
//方法六:使用SQLEXCEPTION
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
上述代碼是6種定義處理程序的方法。
第一種方法是捕獲sqlstate_value值。如果遇到sqlstate_value值為42S02,執(zhí)行CONTINUE操作,并且輸出"CAN NOT FIND"信息。
第二種方法是捕獲mysql_error_code值。如果遇到mysql_error_code值為1146,執(zhí)行CONTINUE操作,并且輸出"CAN NOT FIND"信息。
第三種方法是先定義條件,然后再調(diào)用條件。這里先定義can_not_find條件,遇到1146錯(cuò)誤就執(zhí)行CONTINUE操作。
第四種方法是使用SQLWARNING。SQLWARNING捕獲所有以01開頭的sqlstate_value值,然后執(zhí)行EXIT操作,并且輸出"ERROR"信息。
第五種方法是使用NOT FOUND。NOT FOUND捕獲所有以02開頭的sqlstate_value值,然后執(zhí)行EXIT操作,并且輸出"CAN NOT FIND"信息。
第六種方法是使用SQLEXCEPTION。SQLEXCEPTION捕獲所有沒有被SQLWARNING或NOT FOUND捕獲的sqlstate_value值,然后執(zhí)行EXIT操作,并且輸出"ERROR"信息。