`
wenxin2009
  • 浏览: 319928 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

mysql存储过程示例

 
阅读更多
CREATE PROCEDURE `pro_cancel_order`(
		IN orderId INT ,
		IN userId INT ,
		OUT resultStatus INT 
) 
	COMMENT '取消商品订单' 
BEGIN
	######参数说明#######
	#orderId 订单id
	#extras 扩展记录

	-- 异常处理
    DECLARE CONTINUE HANDLER  
        FOR 1062  
        SET resultStatus=500;-- 异常
	SET resultStatus=0;
    START TRANSACTION; #声明事务开始

	#修改商品订单表
	#UPDATE `tos_goods_order` SET `order_status` =-1,`cancel_status` =2,`deleted` =1,`update_time` =now()
	UPDATE `tos_goods_order` SET `order_status` =-1,`cancel_status` =2,`update_time` =now()
	WHERE `id` = orderId;
	#修改订单商品表
	UPDATE `tos_goods_order_goods` SET `deleted` =1,`update_time` =now() 
	WHERE `order_id` = orderId;
	#订单日志表插入记录
	INSERT INTO `tos_goods_order_log`(`order_id` ,`user_id` ,`old_status` ,`new_status`  , `remark`,`create_time`  )
    VALUES(orderId,userId,1,-1,'取消订单',now());
	SET resultStatus=200;-- 订单取消成功
	COMMIT; 
	# 回滚
    IF resultStatus=500 THEN
    	ROLLBACK;
	ELSE
    	COMMIT;
	END IF; 

	SELECT resultStatus;#输出参数
	
END 

 

存储过程遍历:

CREATE PROCEDURE `pro_time_cancel_order`() 
	COMMENT '定时取消商品订单' 
BEGIN	
	########TODO 需要查询所有超15分钟的末支付订单,并进行取消操作############
	DECLARE orderId INT;# 订单id
	DECLARE userId INT;# 用户id
	DECLARE goodsId INT;# 商品id
	DECLARE goodsNum INT;# 商品数量
	
	##遍历数据结束标志
	DECLARE done INT DEFAULT FALSE;
	##声明游标##
	DECLARE cur_order CURSOR FOR SELECT g.`id`,g.`user_id`,g1.`goods_id`,g1.`num`  FROM `tos_goods_order` g JOIN `tos_goods_order_goods` g1 ON(g.`id`=g1.`order_id`) WHERE g.`order_status`=1 AND g.`deleted`=0 AND NOW()>DATE_ADD(g.`create_time`,INTERVAL 15 MINUTE);

	##异常处理
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	##打开游标
	OPEN cur_order;
	##赋值
	FETCH NEXT FROM cur_order INTO orderId,userId,goodsId,goodsNum; 

	#遍历
	REPEAT 
		IF NOT Done THEN
			##释放商品库存
			UPDATE `tos_goods` SET `store_count` = `store_count` +goodsNum WHERE `id`=goodsId; 
			#修改商品订单表
			UPDATE `tos_goods_order` SET `order_status` =-1,`cancel_status` =2,`update_time` =now() WHERE `id` = orderId;
			#订单日志表插入记录
			INSERT INTO `tos_goods_order_log`(`order_id` ,`user_id` ,`old_status` ,`new_status` , `remark`,`create_time`  )
    		VALUES(orderId,userId,1,-1,'取消订单',now());
			#记录取消订单更新时间
			UPDATE `tos_sys_time_task` SET `update_time`=now() WHERE `id`=1;
			COMMIT;

        END IF;
		FETCH  NEXT from cur_order INTO orderId,userId,goodsId,goodsNum; 
    UNTIL Done END REPEAT;

    ##关闭游标
    CLOSE cur_order;

END 

 

事件来定时执行存储过程:

查看event是否开启: show variables like '%sche%'; 

将事件计划开启: set global event_scheduler=1; 

关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE; 

开户事件任务: alter event e_test ON COMPLETION PRESERVE ENABLE; 

 

drop event `tosuser`.`e_time_cancel_order`;
CREATE EVENT `tosuser`.`e_time_cancel_order` 
  ON SCHEDULE EVERY 60 SECOND 
  STARTS  '2017-06-02 15:00:53'  ON COMPLETION PRESERVE  
  ENABLE  
  COMMENT '定时取消订单事件'  
  DO begin
	/**定时取消商品订单**/
	call pro_time_cancel_order(); 
end

 

分享到:
评论

相关推荐

    MySQL 存储过程示例

    user_id,duty_time 排序,分页控制逻辑,四条记录组成一条记录显示,此处一同天的日期为轴,控制分页

    Node.js中调用mysql存储过程示例

    Node.js中调用MySQL存储过程示例涵盖了在Node.js环境中如何与MySQL数据库交互,特别是在Windows操作系统下创建和调用存储过程的一系列步骤。以下知识点详细描述了整个过程: 1. Node.js与MySQL的交互 Node.js作为...

    mysql存储过程之返回多个值的方法示例

    本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...

    MySQL存储过程学习

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列的SQL语句,形成一个可重复使用的代码块,以提高数据处理的效率和应用程序的性能。在这个"MySQL存储过程学习"的主题中,我们将深入探讨...

    mysql存储过程和存储函数的示例

    mysql 存储过程 ,存储函数的调用示例

    mysql存储过程

    创建MySQL存储过程示例 ```sql DELIMITER // CREATE PROCEDURE proc1 (OUT s INT) BEGIN SELECT COUNT(*) INTO s FROM user; END // DELIMITER ; ``` 在这个例子中,`DELIMITER //`和`DELIMITER ;`用于改变语句...

    MySQL存储过程完整版使用代码示例

    资源包中囊括了MySQL数据库中的存储过程的...该资源下所有内容都是本人的日常软件开发经验总结,对于初学者使用MySQL存储过程的程序员具有重要参考价值,问大家要10分是不过分的,用过就知道了,欢迎大家下载参考及使用

    mysql存储过程教程

    ### MySQL存储过程详解 #### 一、MySQL存储过程概述 MySQL存储过程是一种预先定义并编译好的SQL语句集合,它存储在服务器上,并能在不同的应用程序中被调用执行。自MySQL 5.0版本起,引入了存储过程这一强大功能,...

    MySQL存储过程 MySQL存储过程

    ### MySQL存储过程详解 #### 一、MySQL存储过程概述 MySQL 存储过程是一种服务器端的编程技术,它允许开发者创建可重复使用的代码模块。这些模块可以包含一系列复杂的 SQL 语句和其他流程控制语句。MySQL 5.0 版本...

    mysql存储过程实现分页

    ### MySQL存储过程实现分页 #### 背景与需求 在数据库操作中,分页是一种常见的需求,尤其是在处理大量数据时。通过分页技术,可以有效地减少每次查询的数据量,提高系统的响应速度和用户体验。MySQL作为一种广泛...

    MySQL存储过程.pdf

    MySQL存储过程 MySQL存储过程(Stored Procedure)是一种复杂的数据库对象,允许用户将多个SQL语句组合成一个单一的执行单元,以提高数据库的性能和可维护性。下面是 MySQL 存储过程的相关知识点: 存储过程的定义...

    mysql 存储过程 实战

    ### MySQL存储过程实战知识点 #### 一、存储过程概述 MySQL 存储过程是一种预编译的 SQL 脚本,它可以包含复杂的逻辑控制结构、循环等操作,并且可以接受参数,执行完后还可以返回结果。存储过程可以提高数据处理...

    MySQL存储过程编程教程.pdf

    他们的合作不仅提供了大量的代码示例和基础理论知识,更难得的是融入了真实世界的实践和协调,使得本书成为MySQL存储过程编程领域的重要参考资源。 在实际应用中,存储过程的正确使用能极大提升数据库应用的性能和...

    MYSQL存储过程教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预定义一组SQL语句,并将其封装成一个可重复使用的单元。这个教程将深入讲解如何在MySQL中创建、调用和管理存储过程,以及它们在实际应用中的价值。 ...

    MySQL存储过程实例教程

    ### MySQL存储过程实例教程 #### 存储过程概念与优势 存储过程,作为数据库中一种预编译的SQL语句集合,旨在实现特定功能并存储于数据库内,用户仅需指定其名称及必要参数即可调用执行。这种设计极大地简化了...

    mysql存储过程实例

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预定义一组SQL语句,然后作为一个单元来执行。在MySQL 5.0版本之后,存储过程得到了广泛的支持,为数据库操作提供了许多优势,如提高性能、增强安全性...

    MySql 分页存储过程以及代码调用

    以下是一个简单的分页存储过程示例: ```sql DELIMITER // CREATE PROCEDURE GetPagedData(IN page INT, IN pageSize INT, OUT totalRows INT) BEGIN DECLARE rowCount INT DEFAULT 0; SELECT COUNT(*) INTO ...

Global site tag (gtag.js) - Google Analytics