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,一经查实,立即删除!

相关文章

memlock mysql_mysql配置详解(不断更新)

1. back_log指定MySQL可能的连接数量。当MySQL主线程在很短的时间内得到非常多的连接请求&#xff0c;该参数就起作用&#xff0c;之后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在…

mysql c2_Mysql具有C2级安全性

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼those who are authorized for audit data. The TCB shall be able to record the following types of events: use of identificationand authentication mechanisms, introduction or objects into a users address space (e.g.,…

mysql orm c语言_【译】Simple MySQL ORM for C

一直不知道有ORM这种东西&#xff0c;直到和 海坡 交流后才接触。在项目中&#xff0c;需要将数据存储到数据库中&#xff0c;首先想到的是生成各种raw SQL的解决方法。但随着项目的进展&#xff0c;发现它很不灵活。譬如可能因为有新的需求&#xff0c;在数据库student表中添加…

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

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

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

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

aws java mysql_java - AWS EC2 / MySql - spring boot无法从datasource确定jdbc url - 堆栈内存溢出...

我有一个简单的Spring Boot应用程序&#xff0c;我试图在基于Amazon AMI的Amazon EC2实例上部署。 它使用MySql数据库(版本8.0.15)。我在AWS上创建了数据库&#xff0c;当我从本地系统指向它的配置时&#xff0c;它可以工作。 我也可以从MySql Workbench访问它。但是当我将Spri…

debian 删除mysql数据库_Debian中完全卸载MySQL的方法

作者&#xff1a; 字体&#xff1a;[增加 减小] 类型&#xff1a;转载这篇文章主要介绍了Debian中完全卸载MySQL的方法,同时介绍了清理方法,可以做到彻底卸载mysql,需要的朋友可以参考下之前服务器上配置测试用的服务环境&#xff0c;我偷懒顺手用网上现成的脚本进行安装&#…

python123外汇兑换计算器_Python 3.x--使用re模块,实现计算器运算实例

1 importre23 #乘除运算处理&#xff0c;可以处理不含括号的加减和乘除函数(只处理乘除)4 defmulti_and_divi(arg):5 #传入参数为列表&#xff0c;如&#xff1a;[3*2-1*9/3,0]6 val arg[0]7 #对字符串进行乘除匹配&#xff1a;如3*2-1*9/3&#xff0c;就匹配&#xff1a;3*28 …

python修改文件名字数字_python实现多进程按序号批量修改文件名的方法示例

本文实例讲述了python实现多进程按序号批量修改文件名的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;说明文件名命名方式如图&#xff0c;是数字序号开头&#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…

linux下使用odbc连接mysql_Linux环境下通过ODBC访问MSSql Server

为了解决Linux系统连接MSSql Server的问题&#xff0c;微软为Linux系统提供了连接MSSql Server的ODBC官方驱动。通过官方驱动&#xff0c;Linux程序可以方便地对MSSql Server进行访问。官网提供了三个版本的驱动&#xff0c;分别用于以下发行版的Linux系统&#xff1a;64bit Re…

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

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

insert into user mysql root_跳过授权表登录后使用insert into创建root权限用户

起因&#xff1a;刚刚搭建好的mysql数据库&#xff0c;做基础优化时&#xff0c;不小心把所有用户都删除了&#xff0c;并且退出了。没办法&#xff0c;只好跳过授权表登录&#xff0c;新建root用户。过程如下&#xff1a;一、停掉mysql&#xff0c;跳过授权登录[rootexplnk-za…

matplotlib 设置标注方向_Python 使用matplotlib画图添加标注、及移动坐标轴位置

import matplotlib.pyplot as pltimport matplotlibimport numpy as np#解决中文乱码问题&#xff0c;引入windows字体库myfont matplotlib.font_manager.FontProperties(fnamerC:/Windows/Fonts/msyh.ttf)x np.linspace(-3,3,50)y 2*x 1plt.plot(x,y)plt.figure(1,figsize…

flyway配置mysql_Flyway快速上手教程

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

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

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