您的位置:首页 > 数据库 > MySQL

MySQL存储过程之异常处理

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

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


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

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


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

1. 异常处理的语法:

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


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

2. 定义条件异常处理:

CREATE PROCEDURE p24 ()
BEGIN
DECLARE `Constraint Violation` CONDITION FOR SQLSTATE '23000';
DECLARE EXIT HANDLER FOR `Constraint Violation` ROLLBACK;
START TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (1);
COMMIT;
END; //


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

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

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

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

mysql> CREATE PROCEDURE p9 ()
-> BEGIN
->   DECLARE EXIT HANDLER FOR NOT FOUND BEGIN ... END; /* 找不到行 */
->   DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ... END; /* 错误 */
->   DECLARE EXIT HANDLER FOR SQLWARNING BEGIN ... END; /* 警告 */
-> END;//
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: