标签:style blog http color 使用 io for 数据
异常处理可用在子程序中的一般流程控制。当我们希望对sql执行过程中出现的错误情况进行处理,就可以用到异常处理。如针对存储过程 、触发器或函数内部语句可能发生的错误或警告信息,需要进行相关异常或称异常的捕获,然后作出相应的处理。
一、条件和处理程序
1、DECLARE条件
语法:
DECLARE 条件名称 CONDITION FOR 条件值
条件值有如下取值:
sqlstate_value参数和mysql_error_code参数都可以表示MySQL的错误。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。这个语句指定需要特殊处理的条件。它将一个名字和指定的错误条件关联起来。这个名字可以随后被用在DECLARE HANDLER语句中。
代码:
-- 一:使用sqlstate_value DECLARE can_not_find CONDITION FOR SQLSTATE ‘42S02‘ ; -- 二:使用mysql_error_code DECLARE can_not_find CONDITION FOR 1146 ;
2、DECLARE处理程序
语法:
DECLARE 处理类型 HANDLER FOR 参数错误类型[,...] sp_statement
处理类型有如下取值:
参数错误类型有如下取值:
代码:
-- 一:捕获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‘;
二、实例
向表中插入重复的一条记录,由于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。
标签:style blog http color 使用 io for 数据
原文地址:http://www.cnblogs.com/always-online/p/3924977.html