SQL中的異常處理


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 ;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM