異常處理可用在子程序中的通常流程控制。當咱們但願對sql執行過程當中出現的錯誤狀況進行處理,就能夠用到異常處理。如針對存儲過程 、觸發器或函數內部語句可能發生的錯誤或警告信息,須要進行相關異常或稱異常的捕獲,而後做出相應的處理。html
1、條件和處理程序mysql
一、DECLARE條件sql
語法:函數
DECLARE 條件名稱 CONDITION FOR 條件值ui
條件值有以下取值:spa
sqlstate_value參數和mysql_error_code參數均可以表示MySQL的錯誤。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。這個語句指定須要特殊處理的條件。它將一個名字和指定的錯誤條件關聯起來。這個名字能夠隨後被用在DECLARE HANDLER語句中。code
代碼:server
-- 一:使用sqlstate_value DECLARE can_not_find CONDITION FOR SQLSTATE '42S02' ; -- 二:使用mysql_error_code DECLARE can_not_find CONDITION FOR 1146 ;
二、DECLARE處理程序htm
語法:
DECLARE 處理類型 HANDLER FOR 參數錯誤類型[,...] sp_statementblog
處理類型有以下取值:
參數錯誤類型有以下取值:
代碼:
-- 一:捕獲sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='CAN NOT FIND'; -- 二:捕獲mysql_error_code DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND'; -- 三:先定義條件,而後調用 DECLARE can_not_find CONDITION FOR SQLSTATE '42S02' ; -- DECLARE can_not_find CONDITION FOR 1146 ; DECLARE CONTINUE HANDLER FOR can_not_find SET @info='CAN NOT FIND'; -- 四:使用SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; -- 方法五:使用NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND'; -- 六:使用SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
2、實例
向表中插入重複的一條記錄,因爲id相同,會產生異常,此時咱們能夠進行異常處理。
1 -- ---------------------------- 2 -- Table structure for course 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `course`; 5 CREATE TABLE `course` ( 6 `id` int(11) NOT NULL, 7 `name` varchar(255) NOT NULL, 8 `score` int(11) NOT NULL, 9 PRIMARY KEY (`id`) 10 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 11 12 13 DROP PROCEDURE IF EXISTS proc_test_exce; 14 CREATE PROCEDURE proc_test_exce( 15 IN uid INT(11), 16 IN uname VARCHAR(255), 17 IN uscore INT(11), 18 OUT result INT(11) 19 ) 20 BEGIN 21 -- DECLARE EXIT HANDLER FOR SQLSTATE '23000' set result = -1; 22 DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set result=-1; 23 START TRANSACTION; 24 INSERT INTO course (id, name, score) VALUES(uid, uname, uscore); 25 set result = 1; 26 COMMIT; 27 END; 28 29 -- id 相同則返回-1 30 CALL proc_test_exce(3 ,'中文', 34, @result); 31 SELECT @result;
連續執行CALL proc_test_exce(3 ,'中文', 34, @result);兩次,第一次reuslt返回1,第二次返回-1。由於id衝突,執行到24行,就不會再退出,不會再往下執行,而會執行22行。因此第二次返回的是-1。