MySQL存储过程之异常处理

  当insert失败时,你可能希望将其错误信息记录在日志文件中,如出错原因,出错时间等.如下代码,先创建主键表及一外键表.然后抛入非主键表中的值时会失败:

 1 mysql> CREATE TABLE t2 (
 2              s1 INT, PRIMARY KEY (s1)
 3              ) engine=innodb;//
 4 mysql> CREATE TABLE t3 (
 5              s1 INT, KEY (s1),
 6              FOREIGN KEY (s1) REFERENCES t2 (s1)
 7              ) engine=innodb;//
 8 mysql> INSERT INTO t3 VALUES (5);//
 9 ...
10 ERROR 1216 (23000): Cannot add or update a child row: a foreign key  constraint fails (这里显示的是系统的出错信息)

  接下来,创建一个在插入动作出错时存储错误信息的表: CREATE TABLE error_log (error_message CHAR(80))// ,然后存储过程可如下编写:

1 CREATE PROCEDURE p22 (parameter1 INT)  
2 BEGIN
3     DECLARE EXIT HANDLER FOR 1216 INSERT INTO error_log VALUES (CONCAT('Time: ',current_date,'. Foreign Key Reference Failure For  Value = ',parameter1));
4     INSERT INTO t3 VALUES (parameter1);  
5 END;//

  以上代码第一句DECLARE EXIT HANDLER用来处理异常,意思是如果发生1215错误,则程序会在日志表中抛入一行.EXIT意思是当动作成功提交后退出该复合语句.

1. 异常处理的语法:

1 DECLARE{ EXIT | CONTINUE } HANDLER FOR { error-number | { SQLSTATE error-string } | condition } SQL statement 

  MySQL允许两种处理器:EXIT与CONTINUE,前者执行完错误处理代码后退出,后者仍可继续执行.

2. 定义条件异常处理:

1 CREATE PROCEDURE p24 ()  
2 BEGIN
3     DECLARE `Constraint Violation` CONDITION FOR SQLSTATE '23000';
4     DECLARE EXIT HANDLER FOR `Constraint Violation` ROLLBACK;
5     START TRANSACTION;
6     INSERT INTO t2 VALUES (1);
7     INSERT INTO t2 VALUES (1);
8     COMMIT;    
9 END; // 

  上面代码可给SQLSTATE或者错误代码其他名字,以便在处理中使用自定义的名字,对表t2主键插入相同值会导致SQLSTATE 23000(约束错误).

   DECLARE `Constraint Violation` CONDITION FOR SQLSTATE '23000'; 为指定的错误声明一个"条件",注意语法格式.

    DECLARE EXIT HANDLER FOR `Constraint Violation` ROLLBACK;  使用声明的"条件"定义异常处理

  也可如下使用预声明条件:

1  mysql> CREATE PROCEDURE p9 ()
2          -> BEGIN  
3          ->   DECLARE EXIT HANDLER FOR NOT FOUND BEGIN ... END; /* 找不到行 */
4          ->   DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ... END; /* 错误 */
5          ->   DECLARE EXIT HANDLER FOR SQLWARNING BEGIN ... END; /* 警告 */
6          -> END;//
原文地址:https://www.cnblogs.com/free-coder/p/4775806.html