mysql存储过程中遇到的问题
来源:互联网 发布:论文数据下带括号 编辑:程序博客网 时间:2024/05/04 22:42
对mysql不熟悉,之前也没写过存储过程,因此写这个费了不少时间,下面这是我写好的存储过程,用navicat 中‘工具’--——>'数据传输' 导出的sql文件,
DROP PROCEDURE IF EXISTS `PROC_SUMMARY_STAGE`;
DELIMITER ;;
CREATE DEFINER=`mysql`@`%` PROCEDURE `PROC_SUMMARY_STAGE`()
BEGIN
DECLARE personPlaneId BIGINT;
DECLARE startTime datetime; #开始时间
DECLARE endTime datetime; #结束时间
DECLARE sumStudyTime INT; #当前学时
DECLARE targetStudyTime INT; #目标学时
DECLARE id1_count INT DEFAULT 0; #t_stage_info 第一阶段条数
DECLARE id2_count INT DEFAULT 0; #t_stage_info 第二阶段条数
DECLARE id3_count INT DEFAULT 0; #t_stage_info 第三阶段条数
DECLARE firstEndTime datetime; #第一阶段结束时间
DECLARE secEndTime datetime; #第二阶段结束时间
DECLARE thirdEndTime datetime; #第三阶段结束时间
DECLARE done INT DEFAULT 0;
#声明光标
DECLARE cur1 CURSOR FOR
SELECT p1.id,
p1.start_learn_time start_time,
p1.last_date end_time,
p1.sum_study_time,
p1.target_study_time
FROM t_person_plan p1
WHERE p1.license_type = 7 AND p1.dept_id = 320500
AND p1.last_date >= CONCAT(date_sub(curDate(),interval 1 day),' 00:00:00')
AND p1.last_date < CONCAT(curDate(),' 00:00:00');
#当游标到达尾部时,mysql自动设置done=1
declare continue handler for SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
#移动游标并赋值
fetch cur1 into personPlaneId,startTime,endTime,sumStudyTime,targetStudyTime;
IF NOT done THEN
#获取第一阶段结束时间
SET firstEndTime = (SELECT add_time FROM t_person_plan_record WHERE person_plan_id=personPlaneId AND chapter_id=29611 LIMIT 1);
#获取第二阶段结束时间
SET secEndTime = (SELECT add_time FROM t_person_plan_record WHERE person_plan_id=personPlaneId AND chapter_id=29625 LIMIT 1);
#获取第三阶段结束时间
SET thirdEndTime = (SELECT add_time FROM t_person_plan_record WHERE person_plan_id=personPlaneId AND chapter_id=29734 LIMIT 1);
#获取count
SELECT COUNT(1) INTO id1_count from t_stage_info where person_plan_id=personPlaneId AND stage=1;
SELECT COUNT(1) INTO id2_count from t_stage_info where person_plan_id=personPlaneId AND stage=2;
SELECT COUNT(1) INTO id3_count from t_stage_info where person_plan_id=personPlaneId AND stage=3;
IF sumStudyTime<=12 THEN
IF id1_count>0 THEN
UPDATE t_stage_info SET end_time=endTime,sum_study_time=sumStudyTime WHERE person_plan_id=personPlaneId AND stage=1;
ELSE
INSERT INTO t_stage_info(person_plan_id,start_time,end_time,sum_study_time,target_study_time,stage)
VALUES(personPlaneId,startTime,endTime,sumStudyTime,targetStudyTime,1);
END IF;
ELSEIF (sumStudyTime>12) AND (sumStudyTime<=14) THEN
#更新第一阶段数据
IF id1_count>0 THEN
UPDATE t_stage_info SET end_time=firstEndTime,sum_study_time=sumStudyTime WHERE person_plan_id=personPlaneId AND stage=1;
ELSE
INSERT INTO t_stage_info(person_plan_id,start_time,end_time,sum_study_time,target_study_time,stage)
VALUES(personPlaneId,startTime,firstEndTime,sumStudyTime,targetStudyTime,1);
END IF;
#更新第二阶段数据
IF id2_count > 0 THEN
UPDATE t_stage_info SET end_time=endTime,sum_study_time=sumStudyTime WHERE person_plan_id=personPlaneId AND stage=2;
ELSE
INSERT INTO t_stage_info(person_plan_id,start_time,end_time,sum_study_time,target_study_time,stage)
VALUES(personPlaneId,firstEndTime,endTime,sumStudyTime,targetStudyTime,2);
END IF;
#当学到第三阶段时
ELSEIF sumStudyTime>14 THEN
#如果thirdEndTime为空则取最后学习的时间
#此处开始是用的case。。when then ,后来保存直接报错,可能是mysql中if ...else 不能嵌套 case..when then 的缘故,因此换掉了,
#SET thirdEndTime = CASE WHEN thirdEndTime IS NULL THEN endTime ELSE thirdEndTime END;
IF thirdEndTime IS NULL THEN
SET thirdEndTime = endTime;
END IF;
#更新第一阶段数据
IF id1_count>0 THEN
UPDATE t_stage_info SET end_time=firstEndTime,sum_study_time=sumStudyTime WHERE person_plan_id=personPlaneId AND stage=1;
ELSE
INSERT INTO t_stage_info(person_plan_id,start_time,end_time,sum_study_time,target_study_time,stage)
VALUES(personPlaneId,startTime,firstEndTime,sumStudyTime,targetStudyTime,1);
END IF;
#更新第二阶段数据
IF id2_count>0 THEN
UPDATE t_stage_info SET end_time=secEndTime,sum_study_time=sumStudyTime WHERE person_plan_id=personPlaneId AND stage=2;
ELSE
INSERT INTO t_stage_info(person_plan_id,start_time,end_time,sum_study_time,target_study_time,stage)
VALUES(personPlaneId,firstEndTime,secEndTime,sumStudyTime,targetStudyTime,2);
END IF;
#更新第三阶段数据
IF id3_count>0 THEN
UPDATE t_stage_info SET end_time=thirdEndTime,sum_study_time=sumStudyTime WHERE person_plan_id=personPlaneId AND stage=3;
ELSE
INSERT INTO t_stage_info(person_plan_id,start_time,end_time,sum_study_time,target_study_time,stage)
VALUES(personPlaneId,secEndTime,thirdEndTime,sumStudyTime,targetStudyTime,3);
END IF;
END IF;
END IF;
UNTIL done END REPEAT;
close cur1;
END
;;
DELIMITER ;
希望遇到同样问题的你,不犯这样的错误。
- mysql存储过程中遇到的问题
- 用mysql写存储过程中遇到的问题
- MySql学习存储过程遇到的问题
- MySql存储过程遇到的问题
- mysql 存储过程遇到的小问题
- mysql 重装过程中遇到的问题
- 安装MySQL过程中遇到的问题
- MYSQL使用过程中遇到的问题
- Sql Server 存储过程解密过程中遇到的问题
- mysql存储过程中两个CURSOR嵌套使用遇到的有关问题
- 投票系统的Mysql存储过程遇到的一些问题.
- oracle创建存储过程中遇到的问题
- python mysql驱动安装过程中遇到的问题
- Mysql触发器使用过程中遇到的问题
- Mysql安装过程中遇到的问题及解决办法
- mysql调试源码过程中遇到的调试问题
- MySQL数据库连接过程中遇到的小问题
- mac中mysql安装过程遇到的问题总结
- HTML学习笔记(六)列表
- SVN服务器搭建和使用(一)
- 数据库单条记录并发读并更改问题
- Xcode制作动态及静态Framework和各种坑
- arm-linux内核编译出错
- mysql存储过程中遇到的问题
- MySQL数据库备份和恢复
- VB中将10个数大到小排列
- VB中列出十个数
- 15电气1吕四旺
- vb老师的15个数由大到小排列
- Pyhton 中的Scale 和Normalization(正则化)
- WSGI是什么
- 电气一班 冯彬 作业一