[mysql]存储过程DECLARE ... HANDLER语法

泪湿孤枕 提交于 2019-12-05 23:21:22

###语法

DECLARE handler_action HANDLER
FOR condition_value [, condition_value] ...
statement

###解释

当发生 condition_value 的时候,执行 statement 语句,然后触发 handler_action 动作。

###参数

handler_action:

  • CONTINUE 继续
  • EXIT 退出
  • UNDO 目前不支持

condition_value:

  • mysql_error_code

    mysql错误码,如1051,所有的错误码都可以在这里找到 错误码大全

  • SQLSTATE [VALUE]

    sql语句状态码,同样可以在 错误码大全 这里找到

  • condition_name

    事先声明的条件名称,详细请参考 DECLARE ... CONDITION

  • SQLWARNING

    匹配所有以 01 开头的 SQLSTATE

  • NOT FOUND

    匹配所有以 02 开头的 SQLSTATE ,常和游标CURSOR结合,当获取不到下一条数据的时候会触发

  • SQLEXCEPTION

    所有不是以 '00', '01', 或 '02' 开头的 SQLSTATE,基本表示sql错误,事务回滚可以利用这个事件。

默认行为

如果触发SQLEXCEPTION,但没有相应的action,那么默认调用 EXIT 如果触发 SQLWARNING ,则相当于执行 CONTINUE action NOT FOUND如果是正常触发,那么相当于CONTINUE,否则EXIT

例子

事务控制

DECLARE t_error INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1 ; 

START TRANSACTION;
//执行若干sql...
IF t_error = 1 THEN ROLLBACK; END IF;
COMMIT;

结束游标遍历

DECLARE v_username VARCHAR(100) DEFAULT '';
DECLARE rs CURSOR FOR SELECT `username` FROM `user`;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _done = 1;

OPEN rs;
REPEAT
    FETCH rs INTO v_username;
UNTIL _done END REPEAT;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!