MySQL異常處理

壹頁書發表於2016-06-02

針對儲存過程 、觸發器或函式內部語句可能發生的錯誤或警告資訊,需要進行相關異常或稱 例外的捕捉,然後作出相應的處理,異常處理的方式如下:


DECLARE {CONTINUE | EXIT} HANDLER FOR {SQLSTATE sqlstate_code|  error code| condition_name} handler_actions


說明:
· Handler type (CONTINUE, EXIT) :處理型別,繼續或退出
· Handler condition (SQLSTATE, MySQL error code, named condition) :觸發條件
· Hander actions(錯誤觸發的操作) 
注意:a、 exit只退出當前的block。
         b、 如果定義了handler_action,會在continue或exit之前執行。 

發生錯誤的條件有

  · mysql錯誤程式碼

  · ANSI-standard SQLSTATE code.  具體可見:http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html

  · 命名條件,可自定可使用系統內建的SQLEXCEPTION, SQLWARNING,和 NOT FOUND.

當同時使用MySQl錯誤碼,標準SQLSTATE錯誤碼,命名條件(SQLEXCEPTION)來定義錯誤處理時,其捕獲順序是(只可捕獲一條錯誤):

MYSQL碼->SQLSTATE->命名條件

作用域:

begni..end內,哪果錯誤處理定義在begin ... end內,則在該begin...end之外的錯誤不會被捕獲。

它能夠捕獲其它儲過程的錯誤。

關於作用域,以如下過程為例
  1. drop table nums;    
  2. drop procedure pCreateNums;  
  3.     
  4. CREATE TABLE nums (  
  5.     id INT NOT NULL PRIMARY KEY,  
  6.     b INT NOT NULL  
  7. );    
  8.     
  9. delimiter $$    
  10. create procedure pCreateNums(cnt int)    
  11. begin  
  12.       
  13.     begin    
  14.     declare continue handler for sqlexception rollback;   
  15.         start transaction;    
  16.         insert into nums(id,b) values(cnt+1,1);        
  17.         insert into nums(id,b) values(cnt,null);    
  18.         insert into nums(id,b) values(cnt+2,1);        
  19.         commit;  
  20.     end;  
  21.     insert into nums values(100,100);    
  22.     select * from nums;  
  23. end $$    
  24. delimiter ;  
  25.   
  26. call pCreateNums(10);  

nums表b欄位為非空.
內部的begin end 由一個異常處理的定義,型別為continue
那麼在執行到下面sql的時候
  1.         insert into nums(id,b) values(cnt,null);    
觸發異常處理,回顧了之前的SQL
但是後面的SQL繼續執行.
外層的begin end塊也會執行.
結果如下:
mysql> call pCreateNums(10);
+-----+-----+
| id  | b   |
+-----+-----+
|  12 |   1 |
| 100 | 100 |
+-----+-----+
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

如果異常處理為Exit型別,則內層begin end 塊回滾,內層其餘SQL不再執行,
但是外層的SQL不受影響.因為異常處理是定義在內層的.
這就是異常處理的作用域.
結果如下:
mysql> call pCreateNums(10);
+-----+-----+
| id  | b   |
+-----+-----+
| 100 | 100 |
+-----+-----+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)

當然,如果異常處理定義在外層。他的作用域就是整個過程.

參考:
http://blog.csdn.net/seteor/article/details/17791855

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2112580/,如需轉載,請註明出處,否則將追究法律責任。