mysql5.7.18存储过程跨日处理的问题
- 需求:(周四、周五)凌晨处理3天前数据,(周一、周二、周三)凌晨处理5天前数据,周六周日不处理;
- 请问如何修改下列存储过程?
/*
Mysql5.7.18
*/
CREATE PROCEDURE increase_available()
p:
begin -- 开始存储过程
declare current_product_code varchar(32); -- 产品代码
declare current_userid INT(11); -- 用户ID
declare current_verify_time INT(11); -- 审核时间
declare current_amount INT(11); -- 交易数量
declare handle_day INT(11); -- 处理日
declare handle_day_before INT(11); -- 处理日(前一天)
-- 交易审核的起始时间:三天前
-- start_date = unix_timestamp(DATE_ADD(date(CURDATE()),INTERVAL -3 DAY));
-- 交易审核的结束时间:二天前
-- end_date = unix_timestamp(DATE_ADD(date(CURDATE()),INTERVAL -2 DAY));
DECLARE done INT DEFAULT FALSE; -- 自定义控制游标循环,默认false
-- 按T+3日处理,周六、周日不处理。
-- 当前周四处理周一的数据,
if DAYOFWEEK(CURDATE()) = 5 then
set @handle_day = 3, @handle_day_before = 2;
-- 当前周五处理周二的数据
elseif DAYOFWEEK(CURDATE()) = 6 then
set @handle_day = 3, @handle_day_before = 2;
-- 当前下周一处理上周三的数据
elseif DAYOFWEEK(CURDATE()) = 2 then
set @handle_day = 5, @handle_day_before = 4;
-- 当前下周二处理上周四的数据
elseif DAYOFWEEK(CURDATE()) = 3 then
set @handle_day = 5, @handle_day_before = 4;
-- 当前下周三处理上周五的数据
elseif DAYOFWEEK(CURDATE()) = 4 then
set @handle_day = 5, @handle_day_before = 4;
else
-- 周六、周日不处理,不执行存储过程
LEAVE p;
end if;
DECLARE My_Cursor CURSOR FOR ( SELECT product_code, userid, amount, verify_time FROM oa_option_transactions WHERE type= 1 and `status`=2 and verify_time >= unix_timestamp(DATE_ADD(date(CURDATE()),INTERVAL - @handle_day DAY)) and verify_time < unix_timestamp(DATE_ADD(date(CURDATE()),INTERVAL - @handle_day_before DAY)) ); -- 定义游标并输入结果集
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 绑定控制到游标,游标循环结束自动转true
OPEN My_Cursor; -- 打开游标
myLoop: LOOP -- 开始循环体,myLoop为自定义循环名,结束循环时用到
FETCH My_Cursor into current_product_code, current_userid, ,current_amount, current_verify_time; -- 将游标当前读取行的数据顺序赋予自定义
IF done THEN -- 判断是否继续循环
LEAVE myLoop; -- 结束循环
END IF;
-- 自己要做的事情,在 sql 中直接使用自定义即可
UPDATE oa_option_holdings SET available = available + current_amount WHERE product_code = current_product_code and user_id = current_userid; --
COMMIT; -- 提交事务
END LOOP myLoop; -- 结束自定义循环体
CLOSE My_Cursor; -- 关闭游标
END
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论