转自: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 存储过程+事务+游标+错误异常抛出+日志写入的更多相关文章

  1. cocos2d JS 错误异常抛出捕获和崩溃拦截

    Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...

  2. cocos2d-x 错误异常抛出捕获和崩溃拦截

    Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...

  3. (转)spring异常抛出触发事务回滚策略

    背景:在面试时候问到事务方法在调用过程中出现异常,是否会传递的问题,平时接触的比较少,有些懵逼. spring异常抛出触发事务回滚策略 Spring.EJB的声明式事务默认情况下都是在抛出unchec ...

  4. 窥探Swift编程之错误处理与异常抛出

    在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中 ...

  5. PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法

    PHP 的异常处理.错误的抛出及回调函数等面向对象的错误处理方法: http://www.jb51.net/article/32498.htm http://www.cnblogs.com/hongf ...

  6. Python错误 -- try/except/finally 、调用栈、记录错误、抛出错误

    Bug:程序编写有问题造成的错误,称之为Bug.    debug:调试 注意:bug是程序本身有问题.有缺陷.系统漏洞 异常:完全无法在程序运行中预测的错误,例如写入文件的时候,磁盘满了,写不进去了 ...

  7. 错误try……except……else……finally 记录错误logging 抛出错误raise

    1.错误处理机制 try--except--finally 格式: try: 可能出错的代码 except xxx1Error as e: 处理1 except xxx2Error as e: 处理2 ...

  8. MySQL中的存储过程、游标和存储函数

    MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...

  9. Spring异常抛出触发事务回滚

    Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*) ...

随机推荐

  1. 安装mod_deflate模块启用apache的GZIP压缩

    安装mod_deflate模块启用apache的GZIP压缩 操作系统:Linux Cent OS 5 / Max OS X 10.6 snow leopard相关环境:Apache httpd 2. ...

  2. 006 Python的操作符

      算术操作符: +    -    *    /       %    **    // 如 >>> a = 5 >>> a = a + 3 >>&g ...

  3. IT全称

    1.jar,war,ear(摘自:http://blog.sina.com.cn/s/blog_54bb7b950100wnbb.html) Jar文件(扩展名为. Jar)包含Java类的普通库.资 ...

  4. aspose.cells根据模板导出excel

    又隔十多天没写博客了,最近都在忙项目的事情,公司人事变动也比较大,手头上就又多了一个项目.最近做用aspose.cells根据模板导出excel报价单的功能,顺便把相关的核心记下来,先上模板和导出的效 ...

  5. Axure草记

    页面控件和DataSet绑定,DataSet和输入控件绑定(通过临时变量) 双击Repeater进入之后,你会发现下面已经默认添加了3行,这代表着,每增加一行将会重复3遍: Repeater可以只是部 ...

  6. delphi xe5 android 开发数据访问server端(一)

    第一篇我们破解并安装了xe5 第二篇我们搭建了开发环境 接下来我们开发一个三层的android程序 建立一个webservices  stand-alone vcl application 作为手机访 ...

  7. python常用函数之--求绝对值函数:abs(x)

    python中的求绝对值函数:abs(X) 1. 参数 x 可以是整形也可以是复数,假如是复数的话,就求复数的模. >>> # 整形数字 ... >>> a = 1 ...

  8. hdu 3018

    欧拉回路的题: 主要利用的是并查集,为了节省时间,压缩了它的路径: 代码: #include<cstdio> #include<cstring> #define maxn 10 ...

  9. [wikioi]过河卒

    棋盘型动态规划.(PPT:http://wenku.baidu.com/view/56badad850e2524de5187ea3.html)该类动态规划有一个共性,那就是在一个矩阵中(一般是二维矩阵 ...

  10. 手机归属地查询-IP地址查询-身份证查询-域名备案查询--Api接口

    使用这些接口是需要密钥的 公共密钥 appkey: 10003  secret: d1149a30182aa2088ef645309ea193bf  生成后sign: b59bc3ef6191eb9f ...