为了账号安全,请及时绑定邮箱和手机立即绑定

【原创】MySQL 5.5 新增SIGNAL异常处理

标签:
MySQL


MySQL 从 5.0 开始支持存储过程,到现在最新版本5.5 已经好几个年头了。 虽然MYSQL的异常处理不是很完善,但是处理大多数的应用还是足够了。

异常处理的语句有如下几种:

1. DECLARE ... CONDITION.

2. DECLARE ... HANDLER.

3. RESIGNAL.

4. SIGNAL.

第一种,名为条件声明。

DECLARE condition_name CONDITION FOR condition_value

这里condition_name 为标准的变量命名, condition_value 为SQLSTATE 值 或者 MySQL 自身的ERROR CODE.

单独的condition 语句不能直接运行。 只能作为第二种的一部分。

第二种, 名为条件处理。

第一种声明好了,接下来自然要做相应的处理。

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

handler_action 代表处理的动作,目前有效的有两种, 继续和直接退出。

condition_value 有好几种,其中包括前面条件声明里的SQLSTATE, MYSQL EEROR CODE, condition_name 以及范围混淆的其他两种

SQLWARNING,SQLEXCEPTION. NOT FOUND表示任何不存在的WARNING或者ERROR。

第三种, 代表伪装系统的错误信息以及代码,刷新当前警告缓冲区域。

RESIGNAL [condition_value]

    [SET signal_information_item

    [, signal_information_item] ...]

condition_value:

    SQLSTATE [VALUE] sqlstate_value

  | condition_name

signal_information_item:

    condition_information_item_name = simple_value_specification

condition_information_item_name:

    CLASS_ORIGIN

  | SUBCLASS_ORIGIN

  | MESSAGE_TEXT

  | MYSQL_ERRNO

  | CONSTRAINT_CATALOG

  | CONSTRAINT_SCHEMA

  | CONSTRAINT_NAME

  | CATALOG_NAME

  | SCHEMA_NAME

  | TABLE_NAME

  | COLUMN_NAME

  | CURSOR_NAME

特别注意的是可以伪装的具体东西很多,包括错误代码(MYSQL自身的东东),错误内容,错误的数据库名,表名,列名等等。

第四种,SIGNAL和RESIGNAL差别不大,我们记住signal 不能单独运行,resignal可以单独运行。

SIGNAL condition_value

    [SET signal_information_item

    [, signal_information_item] ...]

condition_value:

    SQLSTATE [VALUE] sqlstate_value

  | condition_name

signal_information_item:

    condition_information_item_name = simple_value_specification

condition_information_item_name:

    CLASS_ORIGIN

  | SUBCLASS_ORIGIN

  | MESSAGE_TEXT

  | MYSQL_ERRNO

  | CONSTRAINT_CATALOG

  | CONSTRAINT_SCHEMA

  | CONSTRAINT_NAME

  | CATALOG_NAME

  | SCHEMA_NAME

  | TABLE_NAME

  | COLUMN_NAME

  | CURSOR_NAME

我们现在给几个例子。

不用RESIGNAL/SIGNAL。

DELIMITER $$ 

 

USE `t_girl`$$ 

 

DROP PROCEDURE IF EXISTS `sp_signal1`$$ 

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_signal1`( 

    IN f_id INT 

    ) 

BEGIN 

      DECLARE con1 TINYINT DEFAULT 0; 

      DECLARE con1 CONDITION FOR SQLSTATE '23000'; 

      DECLARE CONTINUE HANDLER FOR con1 

      BEGIN 

        SELECT 'Error Code : 22\r\nDuplicated!'; 

      END; 

      INSERT INTO user_info VALUES (f_id); 

    END$$ 

 

DELIMITER ; 

CALL sp_signal1(12);

query result

result

Error Code : 22

Duplicated!

用RESIGNAL/SIGNAL 重刷当前错误诊断区域。

DELIMITER $$ 

 

USE `t_girl`$$ 

 

DROP PROCEDURE IF EXISTS `sp_signal1`$$ 

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_signal1`( 

    IN f_id INT 

    ) 

BEGIN 

      DECLARE con1 TINYINT DEFAULT 0; 

      DECLARE con1 CONDITION FOR SQLSTATE '23000'; 

      DECLARE CONTINUE HANDLER FOR con1 

      BEGIN 

        resignal SET schema_name = 'action',  

             table_name = 'action_tb',  

             message_text = 'Duplicated!', 

                     mysql_errno = 22; 

/*        

    signal con1 SET schema_name = 'action',  

             table_name = 'action_tb',  

             message_text = 'Duplicated!', 

                     mysql_errno = 22; 

 

*/ 

 

      END; 

      INSERT INTO user_info VALUES (f_id); 

    END$$ 

 

DELIMITER ; 

CALL sp_signal1(12);

Query : call sp_signal1(12)

Error Code : 22

Duplicated!

Execution Time : 00:00:00:000

Transfer Time  : 00:00:00:000

Total Time     : 00:00:00:000

 

 

©著作权归作者所有:来自51CTO博客作者david_yeung的原创作品,如需转载,请注明出处,否则将追究法律责任

mysqlsignalstore procedureMySQL性能优化


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消