首先说明一下使用的存储过程功能效果:
通过传递节假日信息基础表主键、节日开始时间,添加或修改日期信息表中所属节日、所属节日第几天信息,达到配置节假日信息功能。
第一张表,节假日信息基础表:

表说明:主键、节日名称,节日天数。
第二张表,日期信息表:

表说明:主键、年、月、日、周第几天、农历、所属节日、所属节日第几天、日期。
存储过程:
DROP PROCEDURE
IF EXISTS holiday;
CREATE PROCEDURE holiday (
IN holiday INT,
IN startTime VARCHAR (12)
)
BEGIN
DECLARE
C INT DEFAULT 0;
DECLARE
dateOne VARCHAR (12);
DECLARE
offsetValue INT DEFAULT 1;
DECLARE
done INT DEFAULT FALSE;
DECLARE
cu CURSOR FOR SELECT
date
FROM
util_date
WHERE
date >= startTime
LIMIT C;
DECLARE
CONTINUE HANDLER FOR NOT FOUND
SET done = TRUE;
SELECT
days INTO C
FROM
util_holiday
WHERE
id = holiday;
UPDATE util_date
SET holidayid = '0',
dayoffset = '0'
WHERE
YEAR = SUBSTRING(startTime, 1, 4)
AND holidayid = holiday;
OPEN cu;
read_loop :
LOOP
FETCH cu INTO dateOne;
IF done THEN
LEAVE read_loop;
END
IF;
UPDATE util_date
SET holidayid = holiday,
dayoffset = offsetValue
WHERE
date = dateOne;
SET offsetValue = offsetValue + 1;
END
LOOP
;
CLOSE cu;
END
存储过程说明:
1.传递两个IN类型参数:一个INT,节假日信息基础表主键,一个VARCHAR,节假日开始时间。
2.定义变量,C用于记录节日天数,dateOne用于记录游标迭代时的日期,offsetValue用于赋值节假日第几天,done用于记录游标值是否迭代结束,以在适当时候结束LOOP循环,cu定义的游标,用于存储节假日内的日期。
3.打开游标前,先更新传递参数中该节日、年份的节假日和节日第几天信息为默认值。
4.打开游标,开启循环,取游标内的值,更新数据,更新相关变量值;在取游标值后要判断是否已经取完所有值以跳出循环关闭游标。
5.需要注意的地方,存储过程中的查询赋值或更新数据库操作要放在定义游标之后。

被折叠的 条评论
为什么被折叠?



