mysql存储过程用游标解决返回的结果级并拼装字符
时间:2019-02-18 11:54 来源:linux.it.net.cn 作者:IT
1.昨天遇到到一个问题.提问没有人回复,那个郁闷啊,无奈只有自己晚上回去自己解决.
得出解决办法,希望可以帮到和我遇到同意问题的同学们.也当自己的笔记记录吧.
BEGIN
##输入参数 '',29(用户id),'zxx-sxjcjy-34752-34752-34754-29'(courseid)
DECLARE done INT DEFAULT 0;
DECLARE classIds varchar(500) DEFAULT ''; ##班级id字符型
DECLARE classIdsNew varchar(500) DEFAULT '';
DECLARE classIdsAll varchar(500) DEFAULT '';
DECLARE classIdsAllNew varchar(500) DEFAULT '';## classIds 截取字符后的 aa,bb 形式
DECLARE dateNew LONG; ##当前时间long型
DECLARE dateNewString VARCHAR(100) DEFAULT ''; ##当前时间
DECLARE endDateString VARCHAR(100) DEFAULT ''; ##结束时间 :比当前时间多 7天
##创建游标
DECLARE mycursor CURSOR FOR
select teaching_class_id from sxjcjy_t_teaching_class_user_relation where user_id = userId and course_id = courseId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done =1;
##把当前系统时间转为long型 以便下面使用
set dateNew = UNIX_TIMESTAMP(curdate()) *1000;
##得到当前系统时间 2013-09-29 15:46:59 型 下面用
set dateNewString = NOW();
##结束时间 :比当前时间多 7天 下面添加数据时用
set endDateString = date_add(NOW(), interval 7 Day);
##给讨论里面插入数据
##1.根据courseId和userId得到courseName
select course_name into courseName from sxjcjy_t_course_user_relation where course_id = courseId and user_id = userId limit 1;
##2.根据courseId和userId得到学科下的classId(字符串)多个
OPEN mycursor;##启动游标
REPEAT
FETCH mycursor INTO classIdsNew;
IF NOT done THEN
set classIdsNew = CONCAT(classIdsNew,",");
set classIdsAll = CONCAT(classIdsAll,classIdsNew);##合并字符串
set classIdsAllNew = `LEFT`(classIdsAll,LENGTH(classIdsAll)-1);##截取字符串
END IF;
UNTIL done END REPEAT;
CLOSE mycursor;
insert into sxjcjy_t_bbs_topic(course_id,course_name,title,creater_id,creater_name,content,view_count,create_time,class_id)
values(courseId,courseName,'信息技术基础上完后大家觉得都学到些什么呢?',userId,userName,'信息技术基础上完后大家觉得都学到些什么呢?',0,dateNew,classIdsAllNew);
END
1.原因是insert into 语句里面有个字段是 aa,bb 这中存储的,所以需要拼接字符串.(木有办法啊,淫家数据库是这样设计的)
2.注:DECLARE这种声明的变量包括游标 都必须在存过的最上面,BEGIN 的下面.
(责任编辑:IT)
1.昨天遇到到一个问题.提问没有人回复,那个郁闷啊,无奈只有自己晚上回去自己解决. 得出解决办法,希望可以帮到和我遇到同意问题的同学们.也当自己的笔记记录吧. BEGIN ##输入参数 '',29(用户id),'zxx-sxjcjy-34752-34752-34754-29'(courseid) DECLARE done INT DEFAULT 0; DECLARE classIds varchar(500) DEFAULT ''; ##班级id字符型 DECLARE classIdsNew varchar(500) DEFAULT ''; DECLARE classIdsAll varchar(500) DEFAULT ''; DECLARE classIdsAllNew varchar(500) DEFAULT '';## classIds 截取字符后的 aa,bb 形式 DECLARE dateNew LONG; ##当前时间long型 DECLARE dateNewString VARCHAR(100) DEFAULT ''; ##当前时间 DECLARE endDateString VARCHAR(100) DEFAULT ''; ##结束时间 :比当前时间多 7天 ##创建游标 DECLARE mycursor CURSOR FOR select teaching_class_id from sxjcjy_t_teaching_class_user_relation where user_id = userId and course_id = courseId; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done =1; ##把当前系统时间转为long型 以便下面使用 set dateNew = UNIX_TIMESTAMP(curdate()) *1000; ##得到当前系统时间 2013-09-29 15:46:59 型 下面用 set dateNewString = NOW(); ##结束时间 :比当前时间多 7天 下面添加数据时用 set endDateString = date_add(NOW(), interval 7 Day); ##给讨论里面插入数据 ##1.根据courseId和userId得到courseName select course_name into courseName from sxjcjy_t_course_user_relation where course_id = courseId and user_id = userId limit 1; ##2.根据courseId和userId得到学科下的classId(字符串)多个 OPEN mycursor;##启动游标 REPEAT FETCH mycursor INTO classIdsNew; IF NOT done THEN set classIdsNew = CONCAT(classIdsNew,","); set classIdsAll = CONCAT(classIdsAll,classIdsNew);##合并字符串 set classIdsAllNew = `LEFT`(classIdsAll,LENGTH(classIdsAll)-1);##截取字符串 END IF; UNTIL done END REPEAT; CLOSE mycursor; insert into sxjcjy_t_bbs_topic(course_id,course_name,title,creater_id,creater_name,content,view_count,create_time,class_id) values(courseId,courseName,'信息技术基础上完后大家觉得都学到些什么呢?',userId,userName,'信息技术基础上完后大家觉得都学到些什么呢?',0,dateNew,classIdsAllNew); END 1.原因是insert into 语句里面有个字段是 aa,bb 这中存储的,所以需要拼接字符串.(木有办法啊,淫家数据库是这样设计的) 2.注:DECLARE这种声明的变量包括游标 都必须在存过的最上面,BEGIN 的下面. (责任编辑:IT) |