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

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代码 13259768_1.gif 13259768_2.png

13259768_3.gif

DECLARE condition_name CONDITION FOR condition_value

condition_value:

SQLSTATE [VALUE] sqlstate_value

| mysql_error_code

DECLARE condition_name CONDITION FOR condition_value

condition_value:

SQLSTATE [VALUE] sqlstate_value

| mysql_error_code

使用:

Java代码 13259768_1.gif 13259768_2.png

13259768_3.gif

# original

DECLARE CONTINUE HANDLER FOR1216MySQL_statements;

# changed

DECLARE foreign_key_error CONDITION FOR1216;

DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;

# original

DECLARE CONTINUE HANDLER FOR 1216 MySQL_statements;

# changed

DECLARE foreign_key_error CONDITION FOR 1216;

DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;

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

示例1:Duplicate entry Handler

Sql代码 13259768_1.gif 13259768_2.png

13259768_3.gif

CREATEPROCEDUREsp_add_location

(in_locationVARCHAR(30),

in_address1VARCHAR(30),

in_address2VARCHAR(30),

zipcodeVARCHAR(10),

OUTout_statusVARCHAR(30))

BEGIN

DECLARECONTINUEHANDLER

FOR1062

SETout_status='Duplicate Entry';

SETout_status='OK';

INSERTINTOlocations

(location,address1,address2,zipcode)

VALUES

(in_location,in_address1,in_address2,zipcode);

END;

CREATE PROCEDURE sp_add_location

(in_location VARCHAR(30),

in_address1 VARCHAR(30),

in_address2 VARCHAR(30),

zipcode VARCHAR(10),

OUT out_status VARCHAR(30))

BEGIN

DECLARE CONTINUE HANDLER

FOR 1062

SET out_status='Duplicate Entry';

SET out_status='OK';

INSERT INTO locations

(location,address1,address2,zipcode)

VALUES

(in_location,in_address1,in_address2,zipcode);

END;

示例2: Last Row Handler

Sql代码 13259768_1.gif 13259768_2.png

13259768_3.gif

CREATEPROCEDUREsp_not_found()

READS SQL DATA

BEGIN

DECLAREl_last_rowINTDEFAULT0;

DECLAREl_dept_idINT:

DECLAREc_deptCURSORFOR

SELECTdepartment_idFROMdepartments;

DECLARECONTINUEHANDLERFORNOTFOUNDSETl_last_row=1;

OPENc_dept;

dept_cursor: LOOP

FETCHc_deptINTOl_dept_id;

IF (l_last_row=1)THEN

LEAVE dept_cursor;

ENDIF;

ENDLOOP dept_cursor;

CLOSEc_dept;

END;

CREATE PROCEDURE sp_not_found()

READS SQL DATA

BEGIN

DECLARE l_last_row INT DEFAULT 0;

DECLARE l_dept_id INT:

DECLARE c_dept CURSOR FOR

SELECT department_id FROM departments;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row=1;

OPEN c_dept;

dept_cursor: LOOP

FETCH c_dept INTO l_dept_id;

IF (l_last_row=1) THEN

LEAVE dept_cursor;

END IF;

END LOOP dept_cursor;

CLOSE c_dept;

END;

综合示例:

Sql代码 13259768_1.gif 13259768_2.png

13259768_3.gif

CREATEPROCEDUREsp_add_department

(p_department_nameVARCHAR(30),

p_manager_surnameVARCHAR(30),

p_manager_firstnameVARCHAR(30),

p_locationVARCHAR(30),

OUTp_sqlcodeINT,

OUTp_status_messageVARCHAR(100))

BEGIN

/* STARTDeclareConditions */

DECLAREduplicate_key CONDITIONFOR1062;

DECLAREforeign_key_violated CONDITIONFOR1216;

/*ENDDeclareCOnditions */

/* STARTDeclarevariablesandcursors */

DECLAREl_manager_idINT;

DECLAREcsr_mgr_idCURSORFOR

SELECTemployee_idFROMemployees

WHEREsurname=UPPER(p_manager_surname)

ANDfirstname=UPPER(p_manager_firstname);

/*ENDDeclarevariablesandcursors */

/* STARTDeclareException Handlers */

DECLARECONTINUEHANDLERFORduplicate_key

BEGIN

SETp_sqlcode=1052;

SETp_status_message='Duplicate key error';

END;

DECLARECONTINUEHANDLERFORforeign_key_violated

BEGIN

SETp_sqlcode=1216;

SETp_status_message='Foreign key violated';

END;

DECLARECONTINUEHANDLERFORNOTFOUND

BEGIN

SETp_sqlcode=1329;

SETp_status_message='No record found';

END;

/*ENDDeclareException Handlers */

/* START Execution */

SETp_sqlcode=0;

OPENcsr_mgr_id;

FETCHcsr_mgr_idINTOl_manager_id;

IF p_sqlcode<>0THEN/* Failedtoget manager id */

SETp_status_message=CONCAT(p_status_message,' when fetching manager id');

ELSE/* Got manager id, we can tryandinsert*/

INSERTINTOdepartments (department_name, manager_id, location)

VALUES(UPPER(p_department_name), l_manager_id,UPPER(p_location));

IF p_sqlcode<>0THEN/* Failedtoinsertnew department */

SETp_status_message=CONCAT(p_status_message,' when inserting new department');

ENDIF;

ENDIF;

CLOSEcsr_mgr_id;

/*ENDExecution */

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ruby mysql 占位符_ruby操作常用数据库

使用Ruby DBI模块目录Ruby DBI模块为ruby程序访问数据库提供了一个与数据库无关的接口&#xff0c;就像perl的DBI模块一样。这篇文章将讲述如何编写基于DBI的ruby程序。这篇文章是对DBI规范文档(specification documents)的补充&#xff0c;而不是要替代规范文档&#xff0c;更…

threejs获取模型坐标_Threejs倒影实现解析

倒影是在自然界中非常常见的一种现象&#xff0c;例如水面倒影、镜子。我们都知道&#xff0c;眼睛之所以能够看到某个物体&#xff0c;是因为物体本身能够发光或者物体能够反射其它的物体所发的光&#xff0c;这些光进入到我们的眼里就形成了该物体影像。倒影形成也是一种光学…

遗传算法求函数最大值实验_小知识:什么是遗传算法

1 什么是遗传算法遗传算法(GeneticAlgorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型&#xff0c;是一种通过模拟自然进化过程搜索最优解的方法。其主要特点是直接对结构对象进行操作&#xff0c;不存在求导和函数连续性的限定&#xff1b;…

$dbms=mysql_Oracle dbms

Oracle dbms_random包的用法 Oracle dbms_random包的用法 1.dbms_random.value方法 dbms_random是一个可以生成随机数或者字符串的程序包。这个包有initialize()、seed()、terminate()、value()、normal()、random()、string()等几个函数&#xff0c;但value()是最常用Oracle d…

js定位div坐标存入mysql_JavaScript与Div 对层定位和移动获得坐标

1:移动图层 获得点的x轴y轴坐标&#xff0c;从而进行绝对定位(注意&#xff1a;竖拉框会影响 x 轴 y 轴坐标值)var x,y,z,downfalse,objfunction init(){objevent.srcElement //事件触发对象obj.setCapture() //设置属于当前对象的鼠标捕捉zobj.style.zIndex …

mysql 不指定 长度吗_mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?...

原先对mysql不太理解&#xff0c;但也没有报错。但理解的不够深入。这次补上。原来以为int(11)是指11个字节&#xff0c;int(10)就是10个字节。我错了。http://zhidao.baidu.com/link?urlpuYWaGBQNKNHgffO5kdvXshF3KmX8OuB4Mor3HXapbNHa8m1CdlF8PJTqVuKa1eKcEd6Bv2NKUr3I-KJr5…

python绘制折线图显示数据_漂亮图表也可用python信手拈来!一文教你学会用Python绘制堆积折线图...

今天&#xff0c;和大家聊聊关于Python绘图相关的东东哦&#xff0c;还是和大家继续深耕Python经典的matplotlib库哦&#xff01;好啦&#xff0c;咱们就开始吧&#xff01;首先&#xff0c;咱们聊聊如何在Python中去绘制经典的堆积折线图到这可能有些朋友可能会问了&#xff1…

python画图代码对比_Python实现代码差异对比分析

在写代码过程&#xff0c;有时需要对比查看两个代码文件的不同&#xff0c;肉眼查看费事费力&#xff0c;很难进行对比找出不同。例如&#xff0c;程序运行报错时&#xff0c;会对比自己先前写的代码或者参考别人代码&#xff0c;有哪些地方不对&#xff0c;此时便可以通过该程…

flyway配置mysql_Flyway快速上手教程

一、Flyway是什么官网解释地非常全面&#xff0c;可先大致阅读一下。简单地说&#xff0c;flyway是一个能对数据库变更做版本控制的工具。二、为什么要用Flyway在多人开发的项目中&#xff0c;我们都习惯了使用SVN或者Git来对代码做版本控制&#xff0c;主要的目的就是为了解决…

mysql主从 单点_MySQL主从复制虽好,能完美解决数据库单点问题吗?

一、单个数据库 服务器 的缺点数据库服务器存在单点问题&#xff1b;数据库服务器资源无法满足增长的读写请求&#xff1b;高峰时数据库连接数经常超过上限。二、如何解决单点问题增加额外的数据库服务器&#xff0c;组建数据库集群&#xff1b;同一集群中的数据库服务器需要具…

java ora 28040_Oracle 11g与112c中ORA-28040 错误解决

今天遇到一个连接192.168.56.102这个库报错Java.sql.SQLException: ORA-28040: No matching authentication protocolOracle 12C下查询此报错oralce:/oracle/db/app/12.1.0/db/network/admin> oerr ora 2804028040, 0000, "No matching authentication protocol"/…

java实验_Java实验报告(实验一)

课程&#xff1a;Java程序设计 班级&#xff1a; 1351姓名&#xff1a;王玮怡 学号&#xff1a;20135116成绩&#xff1a; 指导教师&#xff1a;娄嘉鹏 实验日期&#xff1a;2015.04.15实验密级&#xff1a; 预习程度&#…

java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?

上回我们说了下文件下载的方式有哪些&#xff0c;这次我们从不同的环境下简单来说说文件上传的方式有哪些。文件上传的方式Servlet2.5 方式Servlet3.0 方式SpringMVC 方式案例实操Servlet2.5 方式文件上传涉及到前台页面的编写和后台服务器端代码的编写&#xff0c;前台发送文件…

centos上如何装python_centos如何安装Python3

摘自&#xff1a;https://www.cnblogs.com/Mr-wangxd/p/7028285.htmlLinux下默认系统自带python2.6的版本&#xff0c;这个版本被系统很多程序所依赖&#xff0c;所以不建议删除&#xff0c;如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的&…

java 字节输出流_Java IO详解(三)------字节输入输出流

那么这篇博客我们讲的是字节输入输出流&#xff1a;InputStream、OutputSteam(下图红色长方形框内)&#xff0c;红色椭圆框内是其典型实现(FileInputSteam、FileOutStream)1、字节输出流&#xff1a;OutputStreampublic abstract class OutputStreamextends Objectimplements C…

java 缩略图 库_Thumbnailator:一个高质量Java缩略图开发库

February 24, 2020: Thumbnailator 0.4.11 has been released! See Changes for details.Thumbnailator is now available through Maven!What is Thumbnailator?Thumbnailator is a thumbnail generation library for Java.Why Thumbnailator?Making high-quality thumbnail…

java数据段 静态区_回顾一下基础,关于栈与堆,常量池,静态区

先来张简单的图:1.jpg------------------分割------------------------栈内存:1.操作比较快速.但是为私有.2.线程之间不共享.所以存放一些基本数据类型,局部变量(方法走完就回收了),3.对于引用数据类型的地址引用.堆内存:1.new出来的实例2.成员变量的值(如果是基本数据类型,比如…

java项目如何更改路径_Java修改eclipse中web项目的server部署路径问题

和MyEclipse不一样&#xff0c;在Eclipse中做的Web项目默认是不支持将项目发布到Web服务器上的&#xff0c;会发布到工作空间的某个目录&#xff0c;因此无法在外部启动Tomcat来运行Web项目&#xff0c;只有打开Eclipse中的服务器&#xff0c;才能运行Web项目。所以要对Eclipse…

java xpdf 转换成html_java将Word/Excel/PDF文件转换成HTML整理

项目开发过程中&#xff0c;需求涉及到了各种文档转换为HTML或者网页易显示格式&#xff0c;现在将实现方式整理如下&#xff1a;一、使用Jacob转换Word,Excel为HTML“JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32 libraries。”首先下载Jac…

mysql 出现 quot_MYSQL 新版出现 Client does_mysql _ 搞代码

mysql 帮助&#xff1a;A.2.3 Client does not support authentication protocolMySQL 4.1 and up uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older clients. If you upgrade the server to 4.1, attemp…