标签:
当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;//
标签:
原文地址:http://www.cnblogs.com/free-coder/p/4775806.html