zoukankan      html  css  js  c++  java
  • 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;//
  • 相关阅读:
    大型系统的支撑
    应用系统开发思想的变迁
    面向对象基本特征的来历
    GC使用注意
    系统分层演变
    Oracle位图索引
    剪刀剪纸
    权限设计随笔(有空细化)
    Hibernate基础学习(六)—Hibernate二级缓存
    Hibernate基础学习(五)—对象-关系映射(下)
  • 原文地址:https://www.cnblogs.com/free-coder/p/4775806.html
Copyright © 2011-2022 走看看