1.自己定義一個新的錯誤類型與系統中的某個錯誤類型相對應.
1 #格式:DECLARE 錯誤名稱 CONDITION FOR 錯誤碼(或錯誤條件) 2 3 #舉例1:定義“Field_Not_Be_NULL”錯誤名與MySQL中違反非空約束的錯誤類型 4 #是“ERROR 1048 (23000)”對應。 5 #方式1:使用MySQL_error_code 6 DECLARE Field_Not_Be_NULL CONDITION FOR 1048; 7 8 #方式2:使用sqlstate_value 9 DECLARE Field_Not_Be_NULL CONDITION FOR SQLSTATE '23000';
1 #舉例2:定義"ERROR 1148(42000)"錯誤,名稱為command_not_allowed。 2 #方式1:使用MySQL_error_code 3 DECLARE command_not_allowed CONDITION FOR 1148; 4 5 #方式2:使用sqlstate_value 6 DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';
這些錯誤類型的編碼需要去查看編譯信息才能得到
格式:DECLARE 自定義錯誤名稱 CONDITION FOR 錯誤碼(根據系統報錯信息得到)
共有兩種方式:1.直接寫錯誤類型 2.SQLDATE '錯誤編碼'
2.定義處理程序
即在遇到對應的程序異常時,為其定義一個處理方式
常見的幾種錯誤類型:
1.SQLSTATE '字符串錯誤碼':表示長度為5的sqlstate_value類型的錯誤代碼
2.MySQL_error_code:匹配數值類型錯誤代碼
3.錯誤名稱:表示DECLARE...CONDITION定義的錯誤條件名稱
4.SQLWARNING:匹配所有以01開頭的SQLSTATE錯誤代碼
5.NOT FOUND:匹配所有以02開通的SQLSTATE錯誤代碼
6.SQLEXCEPTION:匹配所有沒被4或5捕獲的SQLSTATE錯誤代碼
常見的三種處理方式:
1.CONTINUE:直接無視所對應的錯誤,繼續向下執行
2.EXIT:遇見對應的錯誤則直接退出終止程序
3.UNDO:遇見對應的錯誤則將程序返回到錯誤發生前來進行執行(MySQL暫不支持該操作)
1 #舉例: 2 #方法1:捕獲sqlstate_value 3 DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info = 'NO_SUCH_TABLE'; 4 5 #方法2:捕獲mysql_error_value 6 DECLARE CONTINUE HANDLER FOR 1146 SET @info = 'NO_SUCH_TABLE'; 7 8 #方法3:先定義條件,再調用 9 DECLARE no_such_table CONDITION FOR 1146; 10 DECLARE CONTINUE HANDLER FOR no_such_table SET @info = 'NO_SUCH_TABLE'; 11 12 #方法4:使用SQLWARNING 13 DECLARE EXIT HANDLER FOR SQLWARNING SET @info = 'ERROR'; 14 15 #方法5:使用NOT FOUND 16 DECLARE EXIT HANDLER FOR NOT FOUND SET @info = 'NO_SUCH_TABLE'; 17 18 #方法6:使用SQLEXCEPTION 19 DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info = 'ERROR';
語句格式:
DECLARE 處理類型(CONTINUE/EXIT) HANDLER FOR 某種錯誤類型 SET @info = 'ERROR'(值可以任意,但應該取得有意義)
3.錯誤處理在程序中的使用
1 #重新定義存儲過程,體現錯誤的處理程序 2 DELIMITER // 3 4 CREATE PROCEDURE UpdateDataNoCondition() 5 BEGIN 6 #聲明處理程序 7 #處理方式1: 8 DECLARE CONTINUE HANDLER FOR 1048 SET @prc_value = -1; 9 #處理方式2: 10 #DECLARE CONTINUE HANDLER FOR sqlstate '23000' SET @prc_value = -1; 11 12 SET @x = 1; 13 UPDATE employees SET email = NULL WHERE last_name = 'Abel'; 14 SET @x = 2; 15 UPDATE employees SET email = 'aabbel' WHERE last_name = 'Abel'; 16 SET @x = 3; 17 END // 18 19 DELIMITER ;
1 DELIMITER // 2 3 CREATE PROCEDURE InsertDataWithCondition() 4 BEGIN 5 6 #處理程序 7 #方式1: 8 #declare exit handler for 1062 set @pro_value = -1; 9 #方式2: 10 #declare exit handler for sqlstate '23000' set @pro_value = -1; 11 #方式3: 12 #定義條件 13 DECLARE duplicate_entry CONDITION FOR 1062; 14 DECLARE EXIT HANDLER FOR duplicate_entry SET @pro_value = -1; 15 16 SET @x = 1; 17 INSERT INTO departments(department_name) VALUES('測試'); 18 SET @x = 2; 19 INSERT INTO departments(department_name) VALUES('測試'); 20 SET @x = 3; 21 END // 22 23 DELIMITER ;