zoukankan      html  css  js  c++  java
  • [轉]MySQL存储过程 ERROR Handler 异常处理

    FROM : http://www.111cn.net/database/110/44f4c8e26e35c649a9b42e2754a69e5d.htm

    MySQL存储过程 ERROR Handler 异常处理
     问题样例:当insert失败时,我希望将其记录在日志文件中,

           》》在这里需要创建一个主键表,以及一个外键表,我们使用的是Innodb ,因此外键关联检查是打开的,当我向外键表中插入
               非主键表中的值时,动作将会失败,创建的数据表如下:
        create table t2(s1 int primary key)engine=innodb;//
               create table t3(s1 int,
                          key(s1),
           foreign key (s1) references t2(s1))engine=innodb;//
        create table error_log(error_message char(80));//

    1. 建立一个过程,第一个语句 DECLARE EXIT HANDLER是用来处理异常的,意思是如果错误 1216发生,这个程序将会在错误记录表中插入一行,
       EXIT的意思是 当动作成功提交后推出这个复合语句。
         create procedure p22(parameter int)
           begin
              declare exit Handler for 1452
         insert into error_log values(concat('Time: ',current_date,'.Foreign key reference failure for value=',parameter));
              insert into t3 values(parameter);
           end;//

    2. 申明异常处理的语法 DECLARE HANDLER syntax:
           DECLARE {EXIT|CONTINUE} HANDLER FOR {error_number|{SQLSTATE error-string}|condition} SQL Statement
       上面就是错误处理的用法,也就是一段当程序出错后自动触发的代码,MYSQL允许两种处理器,一种是exit处理,另外一种是 continue处理,与exit
       不同的是在于他执行后,原主程序仍然继续运行,那么该复合语句就没有出口了。

    ----continue处理的例子:
          create table t4(s1 int primary key);//
          create procedure p23()
           begin
             declare continue handler for SQLSTATE '23000' set @x2=1;
      set @x=1;
      insert into t4 values (1);
      set @x=2;
      insert into t4 values(1);
      set @x=3;
             select @x, @x2;
           end;//
           call p23();//

    ---- rollback(回滚事务),定义自己的错误处理名字 declare '错误处理名' condition for SQLSTATE'23000';
          create procedure p24()
           begin
             declare ViolationSelf condition for SQLSTATE'23000';
      DECLARE EXIT HANDLER for ViolationSelf rollback;
      start transaction;
      insert into t2 values(1);
             insert into t2 values(1);
      commit;
           end;//


    /********************************************  Cursor游标  **********************************************************/

    游标实现功能的摘要: 声明游标, 打开游标,从游标里读取,关闭游标
          DECLARE cursor-name CURSOR FOR SELECT ······
          OPEN cursor-name;
          FETCH cursor-name INTO variable;
          CLOSE cursor-name;

    1. create procedure p25(out return_val int)
        begin
          DECLARE a,b,c int;
          DECLARE cur_1 CURSOR for select s1 from t;
          DECLARE continue handler for not found set b=1;
           open cur_1;
           set c=0;
           repeat
             fetch cur_1 into a;
      until b=1
           end repeat;
           close cur_1;
           set return_val=a;
        end;//

    2.    create procedure p25_1(out return_val int)
        begin
          DECLARE a,b,c int;
          DECLARE cur_1 CURSOR for select s1 from t;
          DECLARE continue handler for not found set b=1;
           open cur_1;
           set c=0;
           lable_1:loop
             fetch cur_1 into a;
      if b=1 then
               leave lable_1;
      end if;
      set c=c+1;
           end loop;
           close cur_1;
           set return_val=c;
        end;//

        create procedure p34(in va int)
        begin
           delete from t where s1=va;
        end;//

  • 相关阅读:
    Phantomjs 一些简单实用
    JAVA中关于数组的定义
    itextpdf JAVA 输出PDF文档
    MyBatis在insert插入操作时返回主键ID的配置
    卫士通加密机 控制台终端管理程序
    通过DOS、SHELL批处理命令加载Lib并编译和打包Java项目(或者运行项目)
    HTML单选按钮样式更换
    JAVA生成图片缩略图、JAVA截取图片局部内容
    JAVA笔记 之 Thread线程
    JAVA笔记 之 JDK新特性
  • 原文地址:https://www.cnblogs.com/Athrun/p/2119278.html
Copyright © 2011-2022 走看看