異常處理可用在子程式中的一般流程控制。當我們希望對sql執行過程中出現的錯誤情況進行處理,就可以用到異常處理。如針對存儲過程 、觸發器或函數内部語句可能發生的錯誤或警告資訊,需要進行相關異常或稱異常的捕獲,然後作出相應的處理。
一、條件和處理程式
1、DECLARE條件
文法:
DECLARE 條件名稱 CONDITION FOR 條件值
條件值有如下取值:
SQLSTATE [VALUE] sqlstate_value
mysql_error_code
sqlstate_value參數和mysql_error_code參數都可以表示MySQL的錯誤。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。這個語句指定需要特殊處理的條件。它将一個名字和指定的錯誤條件關聯起來。這個名字可以随後被用在DECLARE HANDLER語句中。
代碼:
2、DECLARE處理程式
DECLARE 處理類型 HANDLER FOR 參數錯誤類型[,...] sp_statement
處理類型有如下取值:
CONTINUE :錯誤不進行處理,繼續向下執行。
EXIT :遇到錯誤後馬上退出。
UNDO : 遇到錯誤後撤回之前的操作,MySQL中暫時還不支援這種處理方式。
參數錯誤類型有如下取值:
SQLSTATE [VALUE] qlstate_value :這種格式是專門為ANSI SQL 和 ODBC以及其他的标準. 并不是所有的MySQL ERROR CODE 都映射到SQLSTATE。
condition_name :DECLARE條件的條件名稱
SQLWARNING :對所有以01開頭的SQLSTATE代碼的速記。
NOT FOUND :是對所有以02開頭的SQLSTATE代碼的速記,當然也可以代表一個遊标到達資料集的末尾。
SQLEXCEPTION :是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。
代碼:
二、執行個體
向表中插入重複的一條記錄,由于id相同,會産生異常,此時我們可以進行異常處理。
連續執行CALL proc_test_exce(3 ,'中文', 34, @result);兩次,第一次reuslt傳回1,第二次傳回-1。因為id沖突,執行到24行,就不會再退出,不會再往下執行,而會執行22行。是以第二次傳回的是-1。