MySQL定义条件和处理程序
发布时间:2020-12-12 02:21:45 所属栏目:MySql教程 来源:网络整理
导读:在程序的运行过程中可能会遇到问题,此时我们可以通过定义条件和处理程序来事先定义这些问题。 定义条件是指事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式和解决办法,保证存储过程和函数在遇到警告或错误时能继续执
在程序的运行过程中可能会遇到问题,此时我们可以通过定义条件和处理程序来事先定义这些问题。 定义条件是指事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式和解决办法,保证存储过程和函数在遇到警告或错误时能继续执行,从而增强程序处理问题的能力,避免程序出现异常被停止执行。 下面将详细讲解如何定义条件和处理程序。 1. 定义条件MySQL 中可以使用 DECLARE 关键字来定义条件。其基本语法如下:DECLARE condition_name CONDITION FOR condition_value condition value: SQLSTATE [VALUE] sqlstate_value | mysql_error_code其中:
例 1下面定义“ERROR 1146 (42S02)”这个错误,名称为 can_not_find。 可以用两种不同的方法来定义,代码如下://方法一:使用sqlstate_value DECLARE can_not_find CONDITION FOR SQLSTATE '42S02'; //方法二:使用 mysql_error_code DECLARE can_not_find CONDITION FOR 1146; 2. 定义处理程序MySQL 中可以使用 DECLARE 关键字来定义处理程序。其基本语法如下:DECLARE handler_type HANDLER FOR condition_value[...] sp_statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code其中,handler_type 参数指明错误的处理方式,该参数有 3 个取值。这 3 个取值分别是 CONTINUE、EXIT 和 UNDO。
注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的语句,并且撤回前面的操作。但是,MySQL 中现在还不能支持 UNDO 操作。因此,遇到错误时最好执行 EXIT 操作。如果事先能够预测错误类型,并且进行相应的处理,那么可以执行 CONTINUE 操作。 参数指明错误类型,该参数有 6 个取值:
sp_statement 参数为程序语句段,表示在遇到定义的错误时,需要执行的一些存储过程或函数。 例 2下面是定义处理程序的几种方式,代码如下://方法一:捕获 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 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';上述代码是 6 种定义处理程序的方法。
例 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 // Query OK,0 rows affected (0.02 sec) mysql> DELIMITER ; mysql> CALL handlerdemo(); Query OK,0 rows affected (0.01 sec) mysql> SELECT @X; +------+ | @X | +------+ | 3 | +------+ 1 row in set (0.00 sec)上述代码中,@X 是一个用户变量,执行结果 @X 等于 3,这表明 MySQL 执行到程序的末尾。 如果 DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1; 这一行不存在,第二个 INSERT 因 PRIMARY KEY 约束而失败之后,MySQL 可能已经采取 EXIT 策略,且 SELECT?@X 可能已经返回 2。注意:@X 表示用户变量,使用 SET 语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端所使用,当客户端退出时,该客户端连接的所有变量将自动释放。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |