文章出處

14.1.4  定義條件和處理程序

定義條件和處理程序是事先定義程序執行過程中可能遇到的問題。并且可以在處理程序中定義解決這些問題的辦法。這種方式可以提前預測可能出現的問題, 并提出解決辦法。這樣可以增強程序處理問題的能力,避免程序異常停止。MySQL中都是通過DECLARE關鍵字來定義條件和處理程序。本小節中將詳細講 解如何定義條件和處理程序。

1.定義條件

MySQL中可以使用DECLARE關鍵字來定義條件。其基本語法如下:

  1. DECLARE  condition_name  CONDITION  FOR  condition_value  
  2. condition_value:  
  3.       SQLSTATE [VALUE] sqlstate_value | mysql_error_code 

其中,condition_name參數表示條件的名稱;condition_value參數表示條件的類型;sqlstate_value參數和 mysql_error_code參數都可以表示MySQL的錯誤。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。

【示例14-6】 下面定義"ERROR 1146 (42S02)"這個錯誤,名稱為can_not_find。可以用兩種不同的方法來定義,代碼如下:

  1. //方法一:使用sqlstate_value  
  2. DECLARE  can_not_find  CONDITION  FOR  SQLSTATE  '42S02' ;  
  3. //方法二:使用mysql_error_code  
  4. DECLARE  can_not_find  CONDITION  FOR  1146 ; 

2.定義處理程序

MySQL中可以使用DECLARE關鍵字來定義處理程序。其基本語法如下:

  1. DECLARE handler_type HANDLER FOR 
    condition_value[,...] sp_statement  
  2. handler_type:  
  3.     CONTINUE | EXIT | UNDO  
  4. condition_value:  
  5.     SQLSTATE [VALUE] sqlstate_value |
    condition_name  | SQLWARNING  
  6.        | NOT FOUND  | SQLEXCEPTION  | mysql_error_code 

其中,handler_type參數指明錯誤的處理方式,該參數有3個取值。這3個取值分別是CONTINUE、EXIT和UNDO。CONTINUE表示遇到錯誤不進行處理,繼續向下執行;EXIT表示遇到錯誤后馬上退出;UNDO表示遇到錯誤后撤回之前的操作,MySQL中暫時還不支持這種處理方式。

注意:通常情況下,執行過程中遇到錯誤應該立刻停止執行下面的語句,并且撤回前面的操作。但是,MySQL中現在還不能支持UNDO操作。因此,遇到錯誤時最好執行EXIT操作。如果事先能夠預測錯誤類型,并且進行相應的處理,那么可以執行CONTINUE操作。

condition_value參數指明錯誤類型,該參數有6個取值。sqlstate_value和mysql_error_code與條件定義中的是同一個意思。condition_name是DECLARE定義的條件名稱。SQLWARNING表示所有以01開頭的sqlstate_value值。NOT FOUND表示所有以02開頭的sqlstate_value值。SQLEXCEPTION表示所有沒有被SQLWARNING或NOT FOUND捕獲的sqlstate_value值。sp_statement表示一些存儲過程或函數的執行語句。

【示例14-7】 下面是定義處理程序的幾種方式。代碼如下:

  1. //方法一:捕獲sqlstate_value  
  2. DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'
    SET @info='CAN NOT FIND';  
  3. //方法二:捕獲mysql_error_code  
  4. DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND';  
  5. //方法三:先定義條件,然后調用  
  6. DECLARE  can_not_find  CONDITION  FOR  1146 ;  
  7. DECLARE CONTINUE HANDLER FOR can_not_find SET 
    @info='CAN NOT FIND';  
  8. //方法四:使用SQLWARNING  
  9. DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';  
  10. //方法五:使用NOT FOUND  
  11. DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND';  
  12. //方法六:使用SQLEXCEPTION  
  13. DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR'; 

上述代碼是6種定義處理程序的方法。第一種方法是捕獲sqlstate_value值。如果遇到sqlstate_value值為42S02,執行CONTINUE操作,并且輸出"CAN NOT FIND"信息。第二種方法是捕獲mysql_error_code值。如果遇到mysql_error_code值為1146,執行CONTINUE操作,并且輸出"CAN NOT FIND"信息。第三種方法是先定義條件,然后再調用條件。這里先定義can_not_find條件,遇到1146錯誤就執行CONTINUE操作。第四種方法是使用SQLWARNING。SQLWARNING捕獲所有以01開頭的sqlstate_value值,然后執行EXIT操作,并且輸出"ERROR"信息。第五種方法是使用NOT FOUND。NOT FOUND捕獲所有以02開頭的sqlstate_value值,然后執行EXIT操作,并且輸出"CAN NOT FIND"信息。第六種方法是使用SQLEXCEPTION。SQLEXCEPTION捕獲所有沒有被SQLWARNING或NOT FOUND捕獲的sqlstate_value值,然后執行EXIT操作,并且輸出"ERROR"信息。

 

    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND set _err=1;
    作用是當遇到SQLEXCEPTION,SQLWARNING,NOT FOUND 錯誤時,設置_err=1并執行CONTINUE操作,即繼續執行后面的語句。

來源:http://book.51cto.com/art/201012/240978.htm

相關:Sqlstate詳解


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()