mysql 存储过程 编写注意事项
mysql的存储过程有很多需要注意的地方,一不留神就会出错,可能调试了老半天才发现原因
1 没有return 语句
可以采用leave代替,返回直接使用select语句 比如select 1;
2.mysql的语句要严格加上分号,非执行语句的不需要加,比如begin、end、loop等
3.游标的获取状态 通常采用定义一个继续执行的处理,CONTINUE的意思就是遇到Not FOUND的异常时,会设置一个变量标志,但是程序继续执行,然后我们根据这个标志来跳出循环或者返回等等
declare csrTransId cursor For select trans_id from tbl_fkcmd_trans where device_id=dev_id AND status='RUN';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = ;
4.事务 异常处理 mysql没有try catch 我们只能根据错误的标志自行回滚,这里有个要注意的事项,CONTINUE HANDLER FOR SQLEXCEPTION一般放在了CONTINUE HANDLER FOR NOT FOUND后面如果放在前面就会出问题了,想想为什么?
因为CONTINUE HANDLER FOR NOT FOUND通常用在游标的循环场景下,我们希望在这个场景下捕获这个“异常”然后跳出循环,mysql先捕获了这个,程序继续执行,不会将其为一个事务的异常捕获,所以CONTINUE HANDLER 具有先后顺序,有点类似try catch中的异常捕获,先捕获的异常在后面的catch语句中不在捕获。
DECLARE t_error INTEGER DEFAULT ;
declare csrTransId cursor For select trans_id from tbl_fkcmd_trans where device_id=dev_id AND status='RUN';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = ;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=;
5.输出参数不可以和字段名同名,否则为null
下面贴上 一段完整的存储过程,仅作为示例
rt:BEGIN
-- 遍历数据结束标志
DECLARE done INT DEFAULT ; declare trans_id_tmp varchar();
DECLARE t_error INTEGER DEFAULT ;
declare csrTransId cursor For select trans_id from tbl_fkcmd_trans where device_id=dev_id AND status='RUN';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = ;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=;
-- 将结束标志绑定到游标 -- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
-- SET NOCOUNT ON; -- trans_id
set trans_id_p='';
if (dev_id is null || LENGTH(dev_id) = ) THEN
select -;
LEAVE rt;
end if;
-- Insert statements for procedure here
SELECT trans_id into trans_id_p FROM tbl_fkcmd_trans where device_id=dev_id AND cmd_code='RESET_FK' AND status='WAIT';
if(FOUND_ROWS() = ) then
select -;
LEAVE rt;
end if;
start transaction;
Open csrTransId;
read_loop: LOOP
Fetch Next From csrTransId Into trans_id_tmp;
IF done= THEN
LEAVE read_loop;
END IF;
DELETE FROM tbl_fkcmd_trans_cmd_param WHERE trans_id=trans_id_tmp;
DELETE FROM tbl_fkcmd_trans_cmd_result WHERE trans_id=trans_id_tmp;
END LOOP;
close csrTransId;
UPDATE tbl_fkcmd_trans SET status='CANCELLED', update_time = NOW() WHERE device_id=dev_id AND status='RUN';
UPDATE tbl_fkcmd_trans SET status='RESULT', update_time = now() WHERE device_id=dev_id AND cmd_code='RESET_FK';
IF t_error = THEN
ROLLBACK;
set trans_id_p='';
select -;
leave rt;
else
commit;
select ;
end if;
END
mysql 存储过程 编写注意事项的更多相关文章
- mysql存储过程编写-入门案例-遁地龙卷风
(-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...
- Atitit mysql存储过程编写指南
Atitit mysql存储过程编写指南 1.1. 设定参数与返回值 `obj_id` int ,,返回类型 varchar(200)1 1.2. 在语句中使用传入的obj_id参数1 1.3. 测 ...
- MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...
- MySQL 存储过程
MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...
- mysql存储过程详解
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
- mysql存储过程语法及实例
存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...
- J2EE之oracle、mysql存储过程调用
最近几天在研究hibernate.JPA对存储过程的调用,主要是针对有返回结果集的存储过程的调用方法,个人感觉存储过程是个好东西,虽然说heibernate对数据访问封装的比较不错,再加上他的缓存机制 ...
- MYSql存储过程的作用及语法
1.使用了存过程,很多相似性的删除,更新,新增等操作就变得轻松了,并且以后也便于管理! 2.存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快. 3.存储过程可以接受参数.输出参数.返回单个或 ...
- MySQL存储过程调试工具-dbForge Studio for MySQL
工具官网地址:http://www.devart.com/dbforge/mysql/studio/ 对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那 ...
随机推荐
- LeetCode OJ:Compare Version Numbers(比较版本字符串)
Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...
- 4.CRT远程连接的使用
目录: 1.为什么需要远程连接? 2.一般的远程连接工具有哪些? 3.远程连接的原理? 4.远程连接的软件的功能和使用相关技巧? 1.为什么选择远程连接? 因为在实际工作中,机房一般都不可能在办公室, ...
- 迭代器模式在 Java 容器中的实现
迭代器接口是迭代器模式实现的精髓: public interface Iterator<E> { boolean hasNext(); E next(); ... } 假设某容器名为 Xx ...
- I.MX6 change boot partition 1 to User area
/************************************************************************************ * I.MX6 change ...
- 【MFC】MFC中窗口重绘
MFC中窗口重绘 摘自:http://blog.csdn.net/shuilan0066/article/details/5859057 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重 ...
- HelloWorld 模块
helloworld.c 代码 #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("D ...
- GDI与OpenGL与DirectX之间的区别
图形编程的几种技术对比: GDI,图形设备接口,MS开发的通用的windows系统图形编程接口,功能强涉及面广,一般的编程都用它.但是用来做多媒体开发就差强人意了 OPENGL是SGI开发的一套三维图 ...
- .NET系统框架
本书是一本讲解.NET技术的书籍,目标读者群也是在.NET框架(.NET Framework)下进行开发的程序员,因此我们无法回避的问题就是:什么是.NET框架?它包含了哪些内容?为开发程序提供了哪些 ...
- Oracle cursor_sharing 参数 详解
一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 ...
- [Client] looks like we got no XML document in....
无wsdl方式应用webservice时,服务端包含了 include_once'inc/utility_all.php '一直报[Client] looks like we got no XML d ...