1,定義
與java中的異常一樣,都是用來定義在處理過程中遇到的問題以及相應的處理方式。
2,自定義異常及處理方式
1,自定義異常語句
DECLARE condition_name CONDITION FOR condition_value;
condition_name:是自己起的名字,最好見名知意。
condition_value:可以是SQLSTATE[VALUE] sqlstate_value也可以是mysql_error_value。
sqlstate_value是長度為5的字符串錯誤代碼。
mysql_error_value是數值類型的錯誤代碼。
2,自定義異常處理
DECLARE handler_type HANDLER FOR condition_value sp_statement;
handler_type:有三個取值
CONTINUE:遇到錯誤不進行處理,跳過錯誤繼續執行之后的代碼。
EXIT:遇到錯誤時馬上退出,不再執行之后的操作。
UNDO:遇到錯誤后撤回之前已經執行的操作,MySQL暫不支持該操作。
condition_value:錯誤名稱:有以下取值
condition_name:定義異常時取的名字
mysql_error_value:數值類型的錯誤代碼
SQLWARNING:對所有01開頭的SQLSTATE代碼的速記
NOT FOUND:對所有01開頭的SQLSTATE代碼的速記
SQLEXCEPTION:除SQLWARNING和NOT FOUND之外的SQLSTATE代碼的速記。
sp_statement:異常之后的處理。
3,實例展示
創建以下表格,將u_id設置為主鍵,並插入以下數據:
創建一個名為insert_user的存儲過程:
BEGIN set @x = 1; insert into users values(3,'zhaoliu',26); set @x = 2; insert into users values(4,'zhouqi',27); set @x = 3; END
通過使用用戶變量@x來查看代碼是否運行,調用存儲過程
call insert_user();
出現以下錯誤
其中數字1062就是mysql_error_code。對應的sqlstate_value是‘23000’,具體的對應方式可以看對應表。
查看@x的值
select @x;
可以看到u_id = 3的這條語句出現了異常。
接下來我們加入異常處理:
BEGIN #Routine body goes here... #方式一:直接異常處理 #declare exit HANDLER FOR 1062 set @x1 = 4; #方式二:先自定義異常,再使用異常處理 DECLARE error1 CONDITION for 1062; declare exit HANDLER FOR 1062 set @x1 = 4; -- 在這里handler_type先使用exit set @x = 1; insert into users values(3,'zhaoliu',26); set @x = 2; insert into users values(4,'zhouqi',27); set @x = 3; END
在這里為了檢驗效果,我們設置的對異常的處理是將@x1設置為4。
再次調用該存儲過程就不會報錯了
select @x,@x1;
查詢用戶變量
發現當出現異常時,程序會執行異常的處理並且退出該過程。
將過程中的handler_type改成continue,再次執行該過程,也不會出錯。
查詢用戶變量
發現對於異常處理之后,會繼續運行之后的代碼
查詢users表
異常的插入語句沒有執行,但是后面的沒有發生異常的語句執行了。