存储过程加事件调度器

-- 存储过程 (多个)游标的使用  临时表的使用(让执行时间从一个小时降低到5分钟)
DELIMITER $$
DROP PROCEDURE IF EXISTS `eval_calc_badge_achivement`$$
CREATE DEFINER=`dbmaster`@`%` PROCEDURE `eval_calc_badge_achivement`()
proc_label:BEGIN DECLARE v_currentPeriodId VARCHAR(100); -- 当前学期ID
DECLARE v_studentId VARCHAR(100);
DECLARE v_studentName TEXT CHARACTER SET utf8 DEFAULT '';
DECLARE v_studyCode VARCHAR(100);
DECLARE v_groupName TEXT CHARACTER SET utf8 DEFAULT '';
DECLARE v_gradeName TEXT CHARACTER SET utf8 DEFAULT '';
DECLARE v_periodCountBagdeSum INT;
DECLARE v_periodPCBagdeSum INT;
DECLARE v_periodGPA DOUBLE;
DECLARE v_badgeAchivement TEXT CHARACTER SET utf8 DEFAULT '';
DECLARE v_requireCountBadgeSum INT;
DECLARE v_requirePCBagdeSum INT;
DECLARE v_requireGPA DOUBLE;
DECLARE done INT DEFAULT 0; DECLARE cur_stu CURSOR FOR SELECT bas.id,bas.name,bas.studyCode,g.Name,grade.Name FROM bas_Student bas LEFT JOIN bas_group g ON bas.groupId=g.id LEFT JOIN bas_grade grade ON bas.gradeId=grade.id WHERE bas.IsLeaved=0;
DECLARE cur_rule CURSOR FOR SELECT BadgeRequiredNumber,PCBadgeRequiredNumber,GPARequired,AchievementName FROM eval_badgestatsrule WHERE periodid=v_currentPeriodId ORDER BY BadgeRequiredNumber DESC,PCBadgeRequiredNumber DESC,GPARequired DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SELECT id INTO v_currentPeriodId FROM bas_schoolperiod WHERE IsCurrentPeriod=1; DROP TABLE IF EXISTS eval_processevaldetail_tmp;
CREATE TEMPORARY TABLE IF NOT EXISTS eval_processevaldetail_tmp (
StudentId VARCHAR(50) NOT NULL,
totalBadgeCount INT
);
CREATE INDEX eval_processevaldetail_tmp_stuid ON eval_processevaldetail_tmp (StudentId); TRUNCATE TABLE eval_processevaldetail_tmp;
INSERT INTO eval_processevaldetail_tmp SELECT studentId,SUM(CalculateBadgeCount+ExtraBadgeCount) AS totalBadgeCount FROM eval_processevaldetail WHERE CourseGroupid IN (SELECT id FROM `csh_coursegroup` WHERE schoolperiodid=v_currentPeriodId) GROUP BY studentId; OPEN cur_stu;
REPEAT
FETCH cur_stu INTO v_studentId, v_studentName,v_studyCode,v_groupName,v_gradeName;
IF NOT done THEN SELECT SUM(badgeCount) INTO v_periodPCBagdeSum FROM `cp_studentscore` WHERE studentid=v_studentId AND cpperiodCourseid IN (SELECT id FROM `cp_periodcourse` WHERE schoolperiodid=v_currentPeriodId);
SELECT (v_periodPCBagdeSum+(SELECT totalBadgeCount FROM eval_processevaldetail_tmp WHERE studentid=v_studentId )) INTO v_periodCountBagdeSum; SELECT ROUND(SUM(ScoreGPA)/ SUM(Credit),2) INTO v_periodGPA FROM Eval_SectionEval WHERE StudentId=v_studentId AND SchoolPeriodId=v_currentPeriodId; IF (v_periodCountBagdeSum IS NULL)THEN SELECT 0 INTO v_periodCountBagdeSum;END IF;
IF (v_periodPCBagdeSum IS NULL)THEN SELECT 0 INTO v_periodPCBagdeSum;END IF;
IF (v_periodGPA IS NULL)THEN SELECT 0 INTO v_periodGPA;END IF; OPEN cur_rule;
REPEAT
FETCH cur_rule INTO v_requireCountBadgeSum, v_requirePCBagdeSum,v_requireGPA,v_badgeAchivement; IF (v_periodCountBagdeSum>=v_requireCountBadgeSum && v_periodPCBagdeSum>=v_requirePCBagdeSum && v_periodGPA>=v_requireGPA)THEN
INSERT INTO `eval_studentachievement_history` (`Id`,`PeriodId`,`StudentId`,`Grade`,`StudentGroup`,`StudyCode`,`StudentName`,`BadgeNumber`,`PCBadgeNumber`,`ScoreGPA`,`AchievementName`,`CreatedTime`,`UpdateTime`) VALUES(UUID(),v_currentPeriodId,v_studentId,v_gradeName,v_groupName,v_studyCode,v_studentName,v_periodCountBagdeSum,v_periodPCBagdeSum,v_periodGPA,v_badgeAchivement,NOW(),NOW());
INSERT INTO dolog (id) VALUES (v_studentId);
IF (SELECT COUNT(*) FROM eval_studentachievement WHERE StudentId=v_studentId)>0 THEN
UPDATE eval_studentachievement SET PeriodId=v_currentPeriodId,Grade=v_gradeName,StudentGroup=v_groupName,BadgeNumber=v_periodCountBagdeSum,PCBadgeNumber=v_periodPCBagdeSum,ScoreGPA=v_periodGPA,AchievementName=v_badgeAchivement,UpdateTime=NOW() WHERE StudentId=v_studentId;
ELSE
INSERT INTO eval_studentachievement (`Id`,`PeriodId`,`StudentId`,`Grade`,`StudentGroup`,`StudyCode`,`StudentName`,`BadgeNumber`,`PCBadgeNumber`,`ScoreGPA`,`AchievementName`,`CreatedTime`,`UpdateTime`) VALUES(UUID(),v_currentPeriodId,v_studentId,v_gradeName,v_groupName,v_studyCode,v_studentName,v_periodCountBagdeSum,v_periodPCBagdeSum,v_periodGPA,v_badgeAchivement,NOW(),NOW());
END IF; SET done=1;
END IF;
UNTIL done END REPEAT;
CLOSE cur_rule;
SET done=0;
END IF; UNTIL done END REPEAT;
CLOSE cur_stu;
END proc_label$$ DELIMITER ; CALL eval_calc_badge_achivement();

Mysql计划任务事件调度器的使用

SELECT @@event_scheduler; -- 查看事件调度器状态
SET GLOBAL event_scheduler = 0; -- 关闭
SET GLOBAL event_scheduler = 1; -- 打开 CREATE EVENT IF NOT EXISTS event_eval_stu_Achievement
ON SCHEDULE
EVERY 1 DAY STARTS '2016-07-01 0:30:00'
DO CALL eval_calc_badge_achivement(); -- 创建 DROP EVENT IF EXISTS event_eval_stu_Achievement; -- 删除

mysql存储过程游标加计划任务事件调度器的更多相关文章

  1. MySQL计划任务(事件调度器)(Event Scheduler)

    http://www.cnblogs.com/c840136/articles/2388512.html https://dev.mysql.com/doc/refman/5.7/en/events- ...

  2. MySQL计划任务(事件调度器)(Event Scheduler)[转]

    原文链接: http://www.cnblogs.com/c840136/articles/2388512.html MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务机 ...

  3. MySQL计划任务(事件调度器)

    原文:http://www.cnblogs.com/c840136/articles/2388512.html 备忘; MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务 ...

  4. mysql事件调度器功能

    一.前言 自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录.对数据进行汇总等等),来取代原先只能由操作系 ...

  5. MySQL事件调度器event的使用

    Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下:十分钟以后执行一下begin end.亦或有一个需求,每个多长时间周期性执行begin end.那么这个时候该怎么办呢? ...

  6. MySQL事件调度器Event Scheduler

    我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务. 在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现. 在m ...

  7. mysql 事件调度器

    1.mysql事件调度器,也就是计划任务,计划做某事,有两种方式: 2.在某个时间点做某事,AT TIMESTAMP [+ INTERVAL INTERVAL] 某个时间点加上偏移. 3.定时地做某事 ...

  8. mysql事件调度器定时删除binlog

    MySQL5.1.6起Mysql增加了事件调度器(Event Scheduler),可以用做定时执行某些特定任务,来取代原先只能由Linux操作系统的计划任务来执行的工作MySQL的事件调度器可以精确 ...

  9. MySQL的事件调度器

    自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务,可以看作基于时间的触发器. 一.开启 事件调度默认是关闭的,开启可执行 ...

随机推荐

  1. asp web.config文件里compilation的assemblies add的元素来自哪里

    该程序集组合由版本.区域性和公钥标记组成. ASP.NET 首先在应用程序的专用 Bin 目录中搜索程序集 DLL,然后在系统程序集缓存中搜索程序集 DLL. add 元素添加要在动态资源编译期间使用 ...

  2. LAMP之Apache

    Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.快速.可靠并且可通过简单的API扩充,将 ...

  3. P4559 [JSOI2018]列队

    \(\color{#0066ff}{ 题目描述 }\) 作为一名大学生,九条可怜在去年参加了她人生中的最后一次军训. 军训中的一个重要项目是练习列队,为了训练学生,教官给每一个学生分配了一个休息位置. ...

  4. [SHOI2002]百事世界杯之旅

    题目:"--在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯. ...

  5. JavaScript new Date()IE浏览器下出错 NaN

    当涉及到编程,与日期的工作可能是棘手的.然而,幸运的是,大多数语言都已经完成了这个困难的工作,并有一种内置的日期功能来帮助我们.JavaScript是具有有用的功能来帮助大量输出,设置日期. The ...

  6. CF796B Find The Bone

    Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, numbered from ...

  7. CF1117G Recursive Queries

    题意:给定一个序列,定义[l, r]的最大值在m处,求f(l, r) = f(l, m - 1) + (r - l + 1) + f(m + 1, r).多次询问.100w. 解:考虑这个区间内每个数 ...

  8. thinkphp 3.0 核心函数U的一个致命bug

    最近在玩thinkphp,感觉内置函数 U 挺强大的! 传递多个参数时,出乱子了(window环境下,xampp) 例如 echo U('Blog/cate',array('cate_id'=> ...

  9. C语言概述之介绍各种基本概念

    第2章 C语言概述 2.1 C语言示例解释 #include #include<stdio.h> 这一条指令的作用相当于把stdio.h文件的所有内容都输入该行所在的位置. #includ ...

  10. Codeforces 852D

    数目规模大,尝试转换为判定性问题,那么E就不影响到网络流的复杂度了 SPFA码歪了,WA了好几发气死了 #include<bits/stdc++.h> using namespace st ...