码迷,mamicode.com
首页 > 其他好文 > 详细

使用DECLARE定义条件和处理程序

时间:2018-02-25 13:11:51      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:except   导致   ...   处理程序   执行   存在   存储过程   user   参数表   

定义条件和处理程序是事先定义程序执行过程中可能遇到的问题,并且可以在处理程序中定义解决这些问题的办法,可以简单理解

为异常处理,这种方式可以提前预测可能出现的问题,并提出解决办法,从而增强程序健壮性。避免程序异常停止,mysql

通过declare关键字定义条件和处理程序。

定义条件

mysql中可以使用declare关键字来定义条件,其基本语法如下:

-- 条件定义语法

declare           condition_name condition for condition_value

-- condition_value 的定义格式

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,

简单案例如下:

-- 定义主键重复错误

-- error 1062 (23000):duplicate entry ‘60‘ for key ‘primary‘

 -- 方法一:使用 sqlstate_value

declare primary_key_duplicate condition for sqlstate     ‘23000‘;

-- 方法二: 使用mysql_error_code

declare primary_key_duplicate condition for 1062;

定义处理程序

前面定义的处理条件,可以在定义处理程序中 使用,先了解一下定义语法:

declare handler_type HANDLER FOR

condition_value[,...] sp_statement

handler_type 参数的取值有三种:CONTINUE | EXIT | UNDO.

CONTINUE 表示遇到错误不进行处理,继续向下执行;

EXIT 表示遇到错误后马上退出;

UNDO 表示遇到错误后撤回之前的操作,但mysql中暂时还不支持这种处理方式。

我们需要注意的是,大多数情况下,执行过程中遇到错误应该立刻停止执行下面的语句,并且撤回前面的操作。由于mysql目前

并不支持UNDO操作。所以,遇到错误时最好执行EXIT操作。如果事先能够预测错误类型,并且进行相应的处理,那么就选择

CONTINUE 操作。

condition_value 参数指明错误类型,该参数有6个取值。语法如下:

-- condition_value 的取值:

SQLSTATE [VALUE] sqlstate_value

mysql_error_code

condition_name

SQLWARNING

SQLEXCEPTION

sqlstate_value 参数和mysql_error_code参数都可以ysql的错误。如常见的error 1146(42s02)中,sqlstate_value值是42s02,

mysql_error_code值是1146.与条件中参数是一样的。

condition_name 是DECLARE定义的条件名称,就前面定义条件语句

NOT FOUND表示所有以02开头的sqlstate_value值。

SQLEXCEPTION表示所有没有被SQLWARNING或 NOT FOUND捕获的sqlstate_value值。

sp_statement 参数表示要执行存储过程或函数语句。

一下定义了如何捕获和处理异常的简单例子

-- 捕获sqlstate_value值。如果遇到sqlstate_value值为42s02,执行CONTINUE操作,并且设置用户变量info。

DECLARE CONTIUNE HANDLER FOR SQLSTATE ‘42s02‘ SET @info=‘CAN NOT FIND‘;

-- 捕获mysql_error_code,如果遇到mysql_error_code值为1146,执行CONTIUNE操作,并且设置用户变量info.

DECLARE CONTINUE  HANDLER FOR 1146 SET @INFO=‘CAN NOT FIND‘;

-- 先定义条件,然后定义处理程序调用

DECLARE can_not_find CONDITION FOR 1146;

-- 定义处理程序,并使用定义的can_not_find 条件

DECLARE CONTINUE HANDLER FOR can_not_find SET @INFO=‘CAN NOT FIND‘

-- SQLWARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT

DECLARE EXIT HANDLER FOR SQLWARNING SET @info=‘ERROR‘;

-- NOT FOUND 捕获所有以02开头的sqlstate_value值,然后执行EXIT操作,并且输出"CAN NOT FIND"信息

DECLARE EXIT HANDLER FOR FOUND SET @info=‘CAN NOT FIND‘;

-- SQLEXCEPTION 捕获所有没有被SQLWARNING或NOT FOUND 捕获的sqlstate_value 值,然后执行EXIT操作。

DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info=‘ERROR‘;

为了加深理解,下面我们编写一个存储过程用于添加用户,借此来了解定义处理程序的作用,如下:

DELIMITER //

create_procedure sp_insert_user()

begin

set @n=1; -- 设置用户变量,用于标识程序运行到哪一步停止

insert into user value(60,‘小米‘,‘xiaomi‘,null,1,null);

set @n=2;

insert into user value(61,‘小米2‘,‘xiaomi2‘,null,null);

set @n=3;

end

//

DELIMITER ;

-- 执行存储过程

call sp_insert_user();

-- 报错,因为主键60的用户已存在

ERROR 1062(23000):Duplicate entry ‘60‘ for key ‘PRIMARY‘

-- 查询标识,显然在第一步时遇到错误就停止了执行

select @n;

上述程序在执行完 set @n=1;后就出错了,因为出现了重复的主键值,也就是直接导致后面的程序也无法执行,现在我们编写一个处理程序,使用

存储过程中即使出现2300错误也继续执行,如下:

create procedure insert_user_2()

begin

--定义条件

DECLARE primary_key_exist 

 

使用DECLARE定义条件和处理程序

标签:except   导致   ...   处理程序   执行   存在   存储过程   user   参数表   

原文地址:https://www.cnblogs.com/simadongyang/p/8468728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!