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. java代码运行linux shell操作

    1.Java调用shell  Java语言以其跨平台性和简易性而著称,在Java里面的lang包里(java.lang.Runtime)提供了一个允许Java程序与该程序所运行的环境交互的接口,这就是 ...

  2. 【LintCode】删除链表中的元素

    问题分析: 声明当前指针和上一个指针即可. 问题求解: public class Solution { public ListNode removeElements(ListNode head, in ...

  3. 精通Web Analytics 2.0 (3) 第一章:网站分析的新奇世界

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第一章:Web Analytics 2.0的新奇世界 多年以来,我们很清楚的知道,网站分析能够真正的改革网络上业务的完成方式.那 ...

  4. matlab之meshgrid()函数

    以最常见的一个用法为例: [X,Y]=meshgrid(xgv, ygv) xgv是一个(一维的,行)向量,ygv也是. 产生的X和Y,规格相同,都是二维向量,高度为size(ygv,2),宽度为si ...

  5. 【BZOJ-2503】相框 并查集 + 分类讨论

    2503: 相框 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 31[Submit][Status][Discuss] Desc ...

  6. 【BZOJ-1218】激光炸弹 前缀和 + 枚举

    1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1778  Solved: 833[Submit][Statu ...

  7. BZOJ1070 [SCOI2007]修车

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  8. [SourceControl 有关SVN的目录:trunk、branches、tags]

    原文链接:http://techlife.blog.51cto.com/212583/223704/

  9. A.Kaw矩阵代数初步学习笔记 8. Gauss-Seidel Method

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  10. AngularJs $q 承诺与延迟

    $q 一个帮助处理异步执行函数的服务.当他们做完处理时,使用它们的返回值(或异常). 受 Kris Kowa’s Q 的启发,这是一个实现promise/deferred对象的启用. $q的两种方式- ...