mysql存储过程《2》

首先说明一下使用的存储过程功能效果:

通过传递节假日信息基础表主键节日开始时间,添加或修改日期信息表中所属节日、所属节日第几天信息,达到配置节假日信息功能。

第一张表,节假日信息基础表:

表说明:主键、节日名称,节日天数。

第二张表,日期信息表:


 表说明:主键、年、月、日、周第几天、农历、所属节日、所属节日第几天、日期。

存储过程:

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.需要注意的地方,存储过程中的查询赋值或更新数据库操作要放在定义游标之后。

猜你喜欢

转载自lxzqz.iteye.com/blog/2295412