当前位置: 移动技术网 > IT编程>数据库>Mysql > mysql存储过程中的异常处理解析

mysql存储过程中的异常处理解析

2017年12月12日  | 移动技术网IT编程  | 我要评论

定义异常捕获类型及处理方法: 

  declare handler_action handler 
    for condition_value [, condition_value] ... 
    statement 
   
  handler_action: 
    continue 
   | exit 
   | undo 
   
  condition_value: 
    mysql_error_code 
   | sqlstate [value] sqlstate_value 
   | condition_name 
   | sqlwarning 
   | not found 
   | sqlexception  

这里面需要注意几点: 

a、condition_value [,condition_value],这个的话说明可以包括多种情况(方括弧表示可选的),也就是一个handler可以定义成针对多种情况进行相应的 操作;另外condition_value可以包括的值有上面列出来的6种:

1、mysql_error_code,这个表示mysql的错误代码,错误代码是一个数字,完成是由mysql自己定义的,这个值可以参考mysql数据库错误代码及信息。

2、sqlstate [value] sqlstate_value,这个同错误代码类似形成一一对应的关系,它是一个5个字符组成的字符串,关键的地方是它从ansi sql和odbc这些标准中引用过来的,因此更加标准化,而不像上面的error_code完全是mysql自己定义给自己用的,这个和第一个类似也可以 参考mysql数据库错误代码及信息。

3、condtion_name,这个是条件名称,它使用declare...condition语句来定义,这个后面我们会介绍如何定义自己的condition_name。

4、sqlwarning,表示sqltate中的字符串以‘01'起始的那些错误,比如error: 1311 sqlstate: 01000 (er_sp_uninit_var)

5、not found,表示sqltate中的字符串以‘02'起始的那些错误,比如error: 1329 sqlstate: 02000 (er_sp_fetch_no_data)

6、sqlexception,表示sqlstate中的字符串不是以'00'、'01'、'02' 起始的那些错误,这里'00'起始的sqlstate其实表示的是成功执行而不是错误,另外两个就是上面的4和5的两种情况。 

上面的6种情况其实可以分为两类:

一类就是比较明确的处理,就是对指定的错误情况进行处理,包括1、2、3这三种方式;

另一类是对对应类型的错误的 处理,就是对某一群错误的处理,包括4、5、6这三种方式。这个是介绍了condition_value。另外还要注意的一个内容是mysql在默认情况 下(也就是我们没有定义处理错误的方法-handler)自己的错误处理机制:

1、对于sqlwarning和not found的处理方法就是无视错误继续执行,所以在游标的例子里面如果我们没有对repeat的条件判断的那个值做个no_more_products=1的handler来处理,那么循环就会一直下去。

2、对于sqlexception的话,其默认的处理方法是在出现错误的地方就终止掉了。 

b、statement,这个比较简单就是当出现某种条件/错误时,我们要执行的语句,可以是简单的如 set  var = value这样的简单的语句,也可以是复杂的多行的语句,多行的话可以使用begin  .....  end这里把语句包括在里面(这个好比delphi里面的情况,注意到我们的存储过程也是多行的,所以也要begin .... end)。

c、handler_action,这个表示当执行完上面的statement后,希望执行怎样的动作,这里包括continue、exit、undo, 表示继续、退出、撤销(暂时不支持)。这边就是两种动作,其实这两种动作在上面也说过了,continue就是一个是sqlwarning和not found的默认处理方法,而exit就是sqlexception的默认处理方法。 

另: 

condition_name:命名条件 
mysql error code或者sqlstate code的可读性太差,所以引入了命名条件: 

语法: 

  declare condition_name condition for condition_value 
   
  condition_value: 
    sqlstate [value] sqlstate_value 
   | mysql_error_code  


使用: 

  # original 
  declare continue handler for 1216 mysql_statements; 
   
  # changed 
  declare foreign_key_error condition for 1216; 
  declare continue handler for foreign_key_error mysql_statements;
  

示例: 

  create procedure sp_add_location 
    (in_location  varchar(30), 
     in_address1  varchar(30), 
     in_address2  varchar(30), 
     zipcode    varchar(10), 
     out out_status varchar(30)) 
  begin 
    declare continue handler 
      for 1062 
      set out_status='duplicate entry'; 
   
    set out_status='ok'; 
    insert into locations 
      (location,address1,address2,zipcode) 
    values 
      (in_location,in_address1,in_address2,zipcode); 
  end; 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网