[转]mysql 5.6 存储过程+事务+游标+错误异常抛出+日志写入
转自:http://www.wolonge.com/post/detail/118249
DELIMITER $$ USE `ecstore`$$ DROP PROCEDURE IF EXISTS `proc_add_warranty_card`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_add_warranty_card`()
BEGIN
-- 获取异常信息
DECLARE v_sql1 VARCHAR(500);
DECLARE v_sql2 VARCHAR(500);
#定义变量
DECLARE w_warranty_id BIGINT(20) DEFAULT 1;
DECLARE w_orderid BIGINT(20);
DECLARE w_ordertime INT(10);
DECLARE w_member_id MEDIUMINT(8);
#定义游标遍历时,作为判断是否遍历完全部记录的标记
DECLARE done1 INTEGER DEFAULT 0;
DECLARE data_err INTEGER DEFAULT 0;
DECLARE log_err INTEGER DEFAULT 0;
#定义保修卡主表为C_WARRANTY
DECLARE C_WARRANTY CURSOR FOR
SELECT orde.order_id,
orde.createtime,
orde.member_id
FROM `sdb_b2c_orders` AS orde
WHERE orde.ship_status='' AND orde.status IN ('active','finish') AND (orde.warranty_id IS NULL);
#声明当游标遍历完全部记录后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1=1;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
GET DIAGNOSTICS CONDITION 1 v_sql1 = RETURNED_SQLSTATE,v_sql2= MESSAGE_TEXT;
INSERT INTO `sdb_b2c_warranty_log` (`order_id`,`createtime`,`msg_text`)
VALUES (w_orderid,UNIX_TIMESTAMP(CURDATE()),CONCAT(v_sql1,':',v_sql2));
SET log_err=1;
END;
#手动提交事务
SET autocommit=0;
OPEN C_WARRANTY;
#取出每条记录并赋值给相关变量,注意顺序
FETCH C_WARRANTY INTO w_orderid, w_ordertime, w_member_id;
SET w_warranty_id=CONCAT(DATE_FORMAT(NOW(), '%Y%m%d'),LPAD((w_warranty_id), 5, ''));
#循环语句的关键词
REPEAT
-- 启动事务
START TRANSACTION; #保修卡主表添加
INSERT INTO `sdb_b2c_warranty` (`warranty_id`,`order_id`,`ordertime`,`member_id`,`warranty_card_status`,`createtime`)
VALUES (w_warranty_id,w_orderid,w_ordertime,w_member_id,'',UNIX_TIMESTAMP(CURDATE()));
IF log_err=0 THEN
#生成明细
INSERT INTO `sdb_b2c_warranty_detail`(warranty_id,item_id,order_id,
obj_id,product_id,goods_id,type_id,bn,pn,`name`,nums,sendnum,addon,item_type)
SELECT w_warranty_id,ite.item_id,ite.`order_id`,ite.obj_id,ite.product_id,
ite.goods_id,ite.type_id,ite.bn,pro.store_place,ite.name,ite.nums,
ite.sendnum,ite.addon,ite.item_type
FROM`sdb_b2c_order_items` AS ite
LEFT JOIN `sdb_b2c_products` AS pro ON pro.product_id=ite.product_id
WHERE ite.order_id=w_orderid;
END IF;
#回写订单表保修卡号
IF log_err=0 THEN
UPDATE `sdb_b2c_orders` SET `warranty_id`=w_warranty_id WHERE `order_id`= w_orderid;
END IF;
COMMIT;
SET log_err=0;
SET done1=0;
#取出每条记录并赋值给相关变量,注意顺序
FETCH C_WARRANTY INTO w_orderid, w_ordertime, w_member_id;
SET w_warranty_id =w_warranty_id+1;
#循环语句结束
UNTIL done1 END REPEAT;
#关闭游标
CLOSE C_WARRANTY; BEGIN
#如果是退货,则把保修卡状态改成无效
DECLARE card_order_id BIGINT(20);
-- 获取异常信息
DECLARE v_sql1 VARCHAR(500);
DECLARE v_sql2 VARCHAR(500);
DECLARE card_warranty_id BIGINT(20);
#标记循环结束
DECLARE done2 INTEGER DEFAULT 0;
DECLARE C_UPDATE_CARD_STATUS CURSOR FOR
SELECT war.`order_id`,war.`warranty_id`
FROM `sdb_b2c_orders` AS orde
JOIN `sdb_b2c_warranty` AS war ON orde.`order_id`=war.`order_id`
WHERE orde.ship_status='';
#声明当游标遍历完全部记录后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2= 1;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 v_sql1 = RETURNED_SQLSTATE,v_sql2= MESSAGE_TEXT;
INSERT INTO `sdb_b2c_warranty_log` (`order_id`,`createtime`,`msg_text`)
VALUES (w_orderid,UNIX_TIMESTAMP(CURDATE()),CONCAT(v_sql1,':',v_sql2));
END;
#打开明细游标
OPEN C_UPDATE_CARD_STATUS;
FETCH C_UPDATE_CARD_STATUS INTO card_order_id,card_warranty_id;
REPEAT
UPDATE sdb_b2c_warranty SET warranty_card_status='',invalid_reason='' WHERE warranty_card_status='' AND `order_id`=card_order_id;
SET done2=0; #取出每条记录并赋值给相关变量,注意顺序
FETCH C_UPDATE_CARD_STATUS INTO card_order_id,card_warranty_id;
#循环语句结束
UNTIL done2 END REPEAT;
CLOSE C_UPDATE_CARD_STATUS;
END;
END$$ DELIMITER ;
[转]mysql 5.6 存储过程+事务+游标+错误异常抛出+日志写入的更多相关文章
- cocos2d JS 错误异常抛出捕获和崩溃拦截
Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...
- cocos2d-x 错误异常抛出捕获和崩溃拦截
Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...
- (转)spring异常抛出触发事务回滚策略
背景:在面试时候问到事务方法在调用过程中出现异常,是否会传递的问题,平时接触的比较少,有些懵逼. spring异常抛出触发事务回滚策略 Spring.EJB的声明式事务默认情况下都是在抛出unchec ...
- 窥探Swift编程之错误处理与异常抛出
在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中 ...
- PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
PHP 的异常处理.错误的抛出及回调函数等面向对象的错误处理方法: http://www.jb51.net/article/32498.htm http://www.cnblogs.com/hongf ...
- Python错误 -- try/except/finally 、调用栈、记录错误、抛出错误
Bug:程序编写有问题造成的错误,称之为Bug. debug:调试 注意:bug是程序本身有问题.有缺陷.系统漏洞 异常:完全无法在程序运行中预测的错误,例如写入文件的时候,磁盘满了,写不进去了 ...
- 错误try……except……else……finally 记录错误logging 抛出错误raise
1.错误处理机制 try--except--finally 格式: try: 可能出错的代码 except xxx1Error as e: 处理1 except xxx2Error as e: 处理2 ...
- MySQL中的存储过程、游标和存储函数
MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...
- Spring异常抛出触发事务回滚
Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*) ...
随机推荐
- mac下Apache + MySql + PHP网站开发
最近接了个小活,做一个使用PHP语言和MySql数据库的动态网站.之前做过类型的网站,是在windows系统下做的,开发环境使用的是 AppServ 的PHP开发套件.现在有了我的大MAC,所以找了M ...
- ThinkPHP下使用Ueditor
在做课程设计的时候想到用百度的Ueditor,可在配置的时候出现了一些问题 Ueditor感觉不是很难,以前有个人定制的,现在取消了这项服务,但是我们可以自己进行配置 下载地址:http://uedi ...
- (转载)delphi实例TDBGrid用右键菜单复制行粘贴行
delphi实例TDBGrid用右键菜单复制行粘贴行 这个从本质上来说就是DBGrid后台数据库的插入 右键复制当前行的相关数据到临时变量点粘贴时,覆盖数据或插入数据! db为数据库: 字段名id,n ...
- ARM编译器4字节对齐
(1)我们假设只有一个赋初值的char型全局变量,那么系统会在data区分配一个4字节的存储空间来存储它.实际上,只用了1个字节,但是为了4字节对齐,只好分配4个字节,所以就会有3个字节浪费. (2) ...
- C++语言十进制数,CDecimal(未完成)
在C#和Java中都有存在decimal类似的十进制数字,C++中尚未发现,春节假期忙里抽闲写了一个玩玩,时间紧迫没有测试,只能保证编译通过.抛砖引玉,欢迎大家多提建议 当前缺陷: 1. 除法功能没有 ...
- iOS项目架构文档
设计的项目架构主要引用MVVM+MVC架构,并以功能模块分级.以下为目录结构. 初级目录: 我们只需要关注SGZH文件夹下的目录,其他为Xcode管理的目录.可以看到此目录为项目初级目录,我们开发过程 ...
- python中的字典(dict),列表(list),元组(tuple)
一,List:列表 python内置的一种数据类型是列表:list.list是一种有序的数据集合,可以随意的添加和删除其中的数据.比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表 ...
- Mongodb数据更新命令
一.Mongodb数据更新命令 Mongodb更新有两个命令:update.save. 1.1update命令 update命令格式: db.collection.update(criteria,ob ...
- JSON数据与JavaScript对象转换
使用JSON时,最基本的工作就是JSON数据与JavaScript对象之间的互相转换.如浏览器 从服务器端获得JSON数据,然后转换为JavaScript对象在网页输出. SON: JavaScrip ...
- 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique
2016-10-09 23:14:43.177 DEBUG [restartedMain][org.springframework.core.type.classreading.AnnotationA ...