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的可读性太差,所以引入了命名条件:

语法:

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

使用:

Java代码  
  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

Sql代码  
  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

Sql代码  
  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;

综合示例:

Sql代码  
  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

mysql存储过程之异常处理篇相关推荐

  1. mysql存储过程之异常处理篇_mysql存储过程之异常处理篇

    mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现 语法如下: DECLARE handler_type HANDLER FOR condition_value[, ...

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

    MySQL存储过程的异常处理 参考文章: (1)MySQL存储过程的异常处理 (2)https://www.cnblogs.com/geaozhang/p/6814567.html 备忘一下.

  3. mysql存储过程捕获错误处理_mysql存储过程之异常处理篇

    mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现 语法如下: DECLARE handler_type HANDLER FOR condition_value[, ...

  4. mysql存储过程 try_mysql存储过程之异常处理篇

    mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现 语法如下: DECLARE handler_type HANDLER FOR condition_value[, ...

  5. 关于MySQL存储过程异常处理的一点心得

    关于MySQL存储过程异常处理的一点心得 参考文章: (1)关于MySQL存储过程异常处理的一点心得 (2)https://www.cnblogs.com/lrl45/p/6037513.html ( ...

  6. MySql存储过程异常处理示例

    MySql存储过程异常处理示例 参考文章: (1)MySql存储过程异常处理示例 (2)https://www.cnblogs.com/lucienbao/archive/2012/06/07/mys ...

  7. mycat mysql 存储过程_MyCat 学习笔记 第十三篇.数据分片 之 通过HINT执行存储过程...

    1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  330 ...

  8. mysql 动态传入表名 存储过程_面试再问MySQL存储过程和触发器就把这篇文章给他...

    Mysql存储过程及触发器trigger 存储过程 一.一个简单的存储过程 1,一个简单的存储过程 delimiter $$create procedure testa()begin Select * ...

  9. mysql 事务sql_mysql存储过程之事务篇

    事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在MySQL服务器本身,而是与存 ...

  10. MySQL中的存储过程(详细篇)

    文章目录 概述 优点 缺点 MySQL存储过程的定义 存储过程的基本语句格式 存储过程的使用 定义一个存储过程 定义一个有参数的存储过程 定义一个流程控制语句 IF ELSE 定义一个条件控制语句 C ...

最新文章

  1. 虚拟机linux 8.04汉化,在虚拟机中快速安装 Ubuntu 18.04
  2. vue按钮字体大小设置_vue-elementui之按钮
  3. alter system flush shared_pool的作用 .
  4. redis 分页_Redis排行榜的设计与实现
  5. 【JavaScript框架封装】使用Prototype给Array,String,Function对象的方法扩充
  6. https://127.0.0.1:8080/test?param={%22..报错
  7. 【Java从0到架构师】项目实战 - 前后端分离、后端校验、Swagger、全局异常处理
  8. 量化策略回测唐安奇通道
  9. CPU负载均衡之cpufreq使用
  10. 2021全国大学生数学建模竞赛E题思路
  11. 设置windows自动登录
  12. 联想m7400更换墨粉盒怎么清零_联想M7400一体打印机换墨粉后如何清零?
  13. 典型飞行控制系统的回路构成
  14. 贱人工具箱使用技巧6——制作表格和表格居中
  15. HealthKit入门:第1部分
  16. 如何显示计算机窗口的状态栏,如何让电脑任务栏不显示打开的程序或窗口方法...
  17. 年度总结—2019-2020
  18. html中svg修改背景颜色,在用作背景图像时修改SVG填充颜色
  19. 语言-汉语-官话-中原官话:中原官话
  20. c语言日历时钟编程,基于DS1302的日历时钟(1602液晶显示DS1302时钟)C语言程序设计...

热门文章

  1. centos中多台主机免密登录_关于单点登录(SSO)数据共享(session和redis)的那点事?...
  2. 万花筒写轮眼动态息屏_用了这么久的iPhone,才知道原来息屏也能录像
  3. python turtle输出坐标_如何在Python/turtle中使用坐标列表绘制形状
  4. mac vi快速删除_Mac下Vim编辑快捷键小结
  5. GSON的用法(处理对象和JSON的相互转化)
  6. jsp开发项目中的问题解决
  7. redis常用的数据类型
  8. Nginx的安装、启动、停止命令
  9. ES6 var,const , let三者区别
  10. What is yield