-- 創建清除過期積分存盤程序
DELIMITER //
DROP PROCEDURE IF EXISTS reportUrl //
CREATE PROCEDURE reportUrl()
BEGIN -- 定義變數
DECLARE s INT DEFAULT 0;
DECLARE sum_integral VARCHAR(255);
DECLARE integral_Old VARCHAR(255);
DECLARE integral_Now VARCHAR(255);
DECLARE opid VARCHAR(256);
-- 定義游標,并將sql結果集賦值到游標中
DECLARE report CURSOR FOR
-- 查詢過期積分(過期日期獲取總積分-用戶消耗總積分)
SELECT SUM(integral) AS sum_integral,openid FROM `t_integral_info` WHERE happen_time >='2020-01-01 00:00:00' AND happen_time <= '2020-03-03 00:00:00' GROUP BY openid;
-- 宣告當游標遍歷完后將標志變數置成某個值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
DROP TABLE IF EXISTS tmp_table;-- 洗掉臨時表
truncate table t_customer_log;
-- 創建臨時表
CREATE TEMPORARY TABLE tmp_table (
integral_now VARCHAR(50) NOT NULL, -- 清除過期積分后的用戶積分
integral_old VARCHAR(50) NOT NULL, -- 未清除之前的用戶積分
openid_sign VARCHAR(50) NOT NULL -- 用戶 openid
);
-- 打開游標
OPEN report;
-- 將游標中的值賦值給變數,注意:變數名不要和回傳的列名同名,變數順序要和sql結果列的順序一致
FETCH report INTO sum_integral,opid;
-- 當s不等于1,也就是未遍歷完時,會一直回圈
WHILE s<>1 DO
-- 執行業務邏輯
SELECT my_integral INTO integral_Old FROM t_customer WHERE openid=opid;
-- 當用戶有效積分小于0,則使有效積分等于0
IF sum_integral<0
THEN
SET sum_integral=0;
END IF;
UPDATE t_customer SET my_integral=sum_integral WHERE openid=opid;
SELECT my_integral INTO integral_Now FROM t_customer WHERE openid=opid;
-- 資料插入臨時表
INSERT INTO t_customer_log (integral_now,integral_old,openid,insert_date) VALUES(integral_Now, integral_Old,opid,now());
-- 將游標中的值再賦值給變數,供下次回圈使用
FETCH report INTO sum_integral,opid;
-- 當s等于1時表明遍歷以完成,退出回圈
END WHILE;
-- 關閉游標
CLOSE report;
SELECT*FROM t_customer_log;-- 查詢操作用戶表日志表
END
//
DELIMITER;
-- 呼叫清除過期積分存盤程序(函式)
-- call reportUrl()
-- 還原用戶積分
-- update t_customer t1 left join t_customer_log t2 on t1.openid=t2.openid set t1.my_integral= t2.integral_old where t1.is_del=0
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/76882.html
標籤:MySQL
