mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现

语法如下:

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code

Handlers类型:

1, EXIT: 发生错误时退出当前代码块(可能是子代码块或者main代码块)
2, CONTINUE: 发送错误时继续执行后续代码

condition_value:

condition_value支持标准的SQLSTATE定义;

SQLWARNING是对所有以01开头的SQLSTATE代码的速记

NOT FOUND是对所有以02开头的SQLSTATE代码的速记

SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记

除了SQLSTATE值,MySQL错误代码也被支持

但是对于mysql而言,优先级如下:
MySQL Error code > SQLSTATE code > 命名条件

使用SQLSTATE还是MySQL Error Code?

1,SALSTATE是标准,貌似会更portable,但是实际上MySQL、DB2、Oracle等等的存储程序语法大相径庭,所以portable的优势不存在 
2,MySQL error code与SQLSTATE并不是一一对应的,比如很多MySQL error code都映射到同一SQLSTATE code(HY000)

当MySQL客户端碰到错误时,它会报告MySQL error code和相关的SQLSATE code:

mysql > CALL nosuch_sp();
ERROR 1305 (42000): PROCEDURE sqltune.nosuch_sp does not exist

具体的sqlsdate和mysql error code的对应可以在http://dev.mysql.com/doc/的MySQL reference manual的附录B找到完整的最新的error codes

condition_name:命名条件

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

语法:

  1. DECLARE condition_name CONDITION FOR condition_value
  2. condition_value:
  3. SQLSTATE [VALUE] sqlstate_value
  4. | mysql_error_code

使用:

  1. # original
  2. DECLARE CONTINUE HANDLER FOR 1216 MySQL_statements;
  3. # changed
  4. DECLARE foreign_key_error CONDITION FOR 1216;
  5. DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;

condition_name为错误代码起了个别名。

示例1:Duplicate entry Handler

  1. CREATE PROCEDURE sp_add_location
  2. (in_location    VARCHAR(30),
  3. in_address1    VARCHAR(30),
  4. in_address2    VARCHAR(30),
  5. zipcode        VARCHAR(10),
  6. OUT out_status VARCHAR(30))
  7. BEGIN
  8. DECLARE CONTINUE HANDLER
  9. FOR 1062
  10. SET out_status='Duplicate Entry';
  11. SET out_status='OK';
  12. INSERT INTO locations
  13. (location,address1,address2,zipcode)
  14. VALUES
  15. (in_location,in_address1,in_address2,zipcode);
  16. END;

示例2: Last Row Handler

  1. CREATE PROCEDURE sp_not_found()
  2. READS SQL DATA
  3. BEGIN
  4. DECLARE l_last_row INT DEFAULT 0;
  5. DECLARE l_dept_id INT:
  6. DECLARE c_dept CURSOR FOR
  7. SELECT department_id FROM departments;
  8. DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row=1;
  9. OPEN c_dept;
  10. dept_cursor: LOOP
  11. FETCH c_dept INTO l_dept_id;
  12. IF (l_last_row=1) THEN
  13. LEAVE dept_cursor;
  14. END IF;
  15. END LOOP dept_cursor;
  16. CLOSE c_dept;
  17. END;

综合示例:

    1. CREATE PROCEDURE sp_add_department
    2. (p_department_name     VARCHAR(30),
    3. p_manager_surname     VARCHAR(30),
    4. p_manager_firstname   VARCHAR(30),
    5. p_location            VARCHAR(30),
    6. OUT p_sqlcode         INT,
    7. OUT p_status_message  VARCHAR(100))
    8. BEGIN
    9. /* START Declare Conditions */
    10. DECLARE duplicate_key CONDITION FOR 1062;
    11. DECLARE foreign_key_violated CONDITION FOR 1216;
    12. /* END Declare COnditions */
    13. /* START Declare variables and cursors */
    14. DECLARE l_manager_id INT;
    15. DECLARE csr_mgr_id CURSOR FOR
    16. SELECT employee_id FROM employees
    17. WHERE surname=UPPER(p_manager_surname)
    18. AND firstname=UPPER(p_manager_firstname);
    19. /* END Declare variables and cursors */
    20. /* START Declare Exception Handlers */
    21. DECLARE CONTINUE HANDLER FOR duplicate_key
    22. BEGIN
    23. SET p_sqlcode=1052;
    24. SET p_status_message='Duplicate key error';
    25. END;
    26. DECLARE CONTINUE HANDLER FOR foreign_key_violated
    27. BEGIN
    28. SET p_sqlcode=1216;
    29. SET p_status_message='Foreign key violated';
    30. END;
    31. DECLARE CONTINUE HANDLER FOR NOT FOUND
    32. BEGIN
    33. SET p_sqlcode=1329;
    34. SET p_status_message='No record found';
    35. END;
    36. /* END Declare Exception Handlers */
    37. /* START Execution */
    38. SET p_sqlcode=0;
    39. OPEN csr_mgr_id;
    40. FETCH csr_mgr_id INTO l_manager_id;
    41. IF p_sqlcode<>0 THEN     /* Failed to get manager id */
    42. SET p_status_message=CONCAT(p_status_message,' when fetching manager id');
    43. ELSE                     /* Got manager id, we can try and insert */
    44. INSERT INTO departments (department_name, manager_id, location)
    45. VALUES(UPPER(p_department_name), l_manager_id, UPPER(p_location));
    46. IF p_sqlcode<>0 THEN /* Failed to insert new department */
    47. SET p_status_message=CONCAT(p_status_message, ' when inserting new department');
    48. END IF;
    49. END IF;
    50. CLOSE csr_mgr_id;
    51. /* END Execution */
    52. END
    53. 原文:http://wwty.iteye.com/blog/698239

mysql存储过程之异常处理篇的更多相关文章

  1. mysql存储过程之事务篇

    mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在M ...

  2. 详解MySQL存储过程的“异常处理”

    阅读目录:存储过程的异常处理 定义异常处理 单一异常处理程序 continue exit 多个异常处理程序 关于错误编号和SQLSTATE码 使用3个处理程序 忽略某一异常的处理 异常处理的命名 异常 ...

  3. MySQL存储过程的异常处理

    阅读目录:存储过程的异常处理 定义异常处理 单一异常处理程序 continue exit 多个异常处理程序 关于错误编号和SQLSTATE码 使用3个处理程序 忽略某一异常的处理 异常处理的命名 异常 ...

  4. MySQL 存储过程的异常处理

    mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc     ->     (p_first_ ...

  5. MySQL存储过程学习笔记

    MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.MySQL 5.0终于开始支持存储过程了. MySQL的关键字大小写通用.该学习笔记对关键字使用大写:变量名,表名使用小写. ...

  6. MYSQL 存储过程 多表更新异常捕捉和异常处理方式

    今天在做MYSQL 存储过程 多表更新的功能   多表更新时候注意事项 1.首先是确保多表更新能够一次执行,途中没有哪个表的sql语句错误 2.上线后修改表结构及字段,请注意检查是否影响mysql 过 ...

  7. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  8. MySql存储过程

    MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...

  9. mysql存储过程编写-入门案例-遁地龙卷风

    (-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...

随机推荐

  1. Redis 数据类型-List

    lpush/rpush/lrange 127.0.0.1:6379> LPUSH list01 1 2 3 4 5 (integer) 5 127.0.0.1:6379> LRANGE l ...

  2. ng-if else的使用

    <!DOCTYPE html> <html> <head> <script src="http://code.angularjs.org/1.2.0 ...

  3. Git 服务器搭建

    接下来我们将以 Centos 为例搭建 Git 服务器. 1.安装Git $ yum install curl-devel expat-devel gettext-devel openssl-deve ...

  4. C/C++ 程序的build过程

    (This article is under constant construction) DISCLAIMER: 本文的主要内容来自https://gcc.gnu.org/onlinedocs/gc ...

  5. [转]virtualenv and virtualenvwrapper

    转自 http://liuzhijun.iteye.com/blog/1872241 virtualenv virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能 ...

  6. 分布式服务框架Zookeeper

    协议介绍 zookeeper协议分为两种模式 崩溃恢复模式和消息广播模式 崩溃恢复协议是在集群中所选举的leader 宕机或者关闭 等现象出现 follower重新进行选举出新的leader 同时集群 ...

  7. Tarjan_LCA

    貌似求LCA使用倍增已经可以应付掉大多数需要LCA的题了.. 但是有些时候$O(MlogN)$的复杂度就不可接受了 Tarjan_LCA对于每个询问采用离线处理 总复杂度为$O(M+N)$ 这个复杂度 ...

  8. Form Submit表单提交

    <button type="button" ng-click="submit()"class="btn btn-block btn-danger ...

  9. Bitmap四种属性

    http://blog.csdn.net/rabbit_in_android/article/details/49967461 Bitmap: (1)     public Bitmap (int w ...

  10. 深入JVM-性能监控工具

    一.Linux下的性能监控工具 1.1 显式系统整体资源使用情况-top命令 top命令的输出可以分为两个部分:前半部分是系统统计信息,后半部分是进程信息. 在统计信息中,第一行是任务队列信息,他的结 ...