900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 9 MySQL定义条件和处理程序

9 MySQL定义条件和处理程序

时间:2020-10-08 08:52:13

相关推荐

9 MySQL定义条件和处理程序

在程序的运行过程中可能会遇到问题,此时我们可以通过定义条件和处理程序来事先定义这些问题。

定义条件是指事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式和解决办法,保证存储过程和函数在遇到警告或错误时能继续执行,从而增强程序处理问题的能力,避免程序出现异常被停止执行。

下面将详细讲解如何定义条件和处理程序。

1. 定义条件

MySQL 中可以使用 DECLARE 关键字来定义条件。其基本语法如下:

DECLARE condition_name CONDITION FOR condition_valuecondition value:SQLSTATE [VALUE] sqlstate_value | mysql_error_code

其中:

condition_name 参数表示条件的名称;condition_value 参数表示条件的类型;sqlstate_value 参数和 mysql_error_code 参数都可以表示 MySQL 的错误。sqlstate_value表示长度为 5 的字符串类型错误代码,mysql_error_code 表示数值类型错误代码。例如 ERROR 1146(42S02)中,sqlstate_value 值是 42S02,mysql_error_code 值是 1146。

例 1

下面定义“ERROR 1146 (42S02)”这个错误,名称为 can_not_find。 可以用两种不同的方法来定义,代码如下:

//方法一:使用sqlstate_valueDECLARE can_not_find CONDITION FOR SQLSTATE '42S02';

//方法二:使用 mysql_error_codeDECLARE can_not_find CONDITION FOR 1146;

2. 定义处理程序

MySQL 中可以使用DECLARE关键字来定义处理程序。其基本语法如下:

DECLARE handler_type HANDLER FOR condition_value[...] sp_statementhandler_type:CONTINUE | EXIT | UNDOcondition_value:SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code

其中,handler_type 参数指明错误的处理方式,该参数有 3 个取值。这 3 个取值分别是 CONTINUE、EXIT 和 UNDO。

CONTINUE 表示遇到错误不进行处理,继续向下执行;EXIT 表示遇到错误后马上退出;UNDO 表示遇到错误后撤回之前的操作,MySQL 中暂时还不支持这种处理方式。

注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的语句,并且撤回前面的操作。但是,MySQL 中现在还不能支持 UNDO 操作。因此,遇到错误时最好执行 EXIT 操作。如果事先能够预测错误类型,并且进行相应的处理,那么可以执行 CONTINUE 操作。

参数指明错误类型,该参数有 6 个取值:

sqlstate_value:包含 5 个字符的字符串错误值;condition_name:表示 DECLARE 定义的错误条件名称;SQLWARNING:匹配所有以 01 开头的 sqlstate_value 值;NOT FOUND:匹配所有以 02 开头的 sqlstate_value 值;SQLEXCEPTION:匹配所有没有被 SQLWARNING 或 NOT FOUND 捕获的 sqlstate_value 值;mysql_error_code:匹配数值类型错误代码。

sp_statement 参数为程序语句段,表示在遇到定义的错误时,需要执行的一些存储过程或函数。

例 2

下面是定义处理程序的几种方式,代码如下:

//方法一:捕获 sqlstate_valueDECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='CAN NOT FIND';

//方法二:捕获 mysql_error_codeDECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND';

//方法三:先定义条件,然后调用DECLARE can_not_find CONDITION FOR 1146;DECLARE CONTINUE HANDLER FOR can_not_find SET @info='CAN NOT FIND';

//方法四:使用 SQLWARNINGDECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';

//方法五:使用 NOT FOUNDDECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND';

//方法六:使用 SQLEXCEPTIONDECLARE 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”信息。

例 3

定义条件和处理顺序,具体的执行过程如下:

mysql> CREATE TABLE t8(s1 INT,PRIMARY KEY(s1));Query OK, 0 rows affected (0.07 sec)

mysql> DELIMITER //mysql> CREATE PROCEDURE handlerdemo()-> BEGIN-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;-> SET @X=1;-> INSERT INTO t8 VALUES(1);-> SET @X=2;-> INSERT INTO t8 VALUES(1);-> SET @X=3;-> END //

mysql> DELIMITER ;mysql> CALL handlerdemo();

mysql> SELECT @X;+------+| @X |+------+| 3 |+------+

上述代码中,@X 是一个用户变量,执行结果 @X 等于 3,这表明 MySQL 执行到程序的末尾。

如果DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;这一行不存在,第二个 INSERT 因 PRIMARY KEY 约束而失败之后,MySQL 可能已经采取 EXIT 策略,且 SELECT @X 可能已经返回 2。

注意:@X 表示用户变量,使用 SET

语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端所使用,当客户端退出时,该客户端连接的所有变量将自动释放。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。