存储过程加事件调度器

-- 存储过程 (多个)游标的使用  临时表的使用(让执行时间从一个小时降低到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. hdu1162(最小生成树 prim or kruscal模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 意义:给出一些点,用线问使所有点直接或间接连通,需要多长: 思路:裸最小生成树: 法1: pri ...

  2. SP34096 DIVCNTK - Counting Divisors (general)(Min_25筛)

    题面 洛谷 \(\sigma_0(i)\) 表示\(i\) 的约数个数 求\(S_k(n)=\sum_{i=1}^n\sigma_0(i^k)\mod 2^{64}\) 多测,\(T\le10^4,n ...

  3. LB 负载均衡的层次结构(转)

    http://blog.csdn.net/mindfloating/article/details/51020767 作为后端应用的开发者,我们经常开发.调试.测试完我们的应用并发布到生产环境,用户就 ...

  4. Java内存区域与内存溢出异常---运行时数据区域

    运行时数据区域 Java虚拟机所管理的内存将会包括以下几个运行时数据区域 线程私有区域 1.程序计数器   程序计数器记录的是当前正在执行的虚拟机字节码指令所在的地址.在虚拟机的概念模型中,字节码解释 ...

  5. Redis学习笔记(3)—— 五种数据类型&keys的通用操作

    一.Redis数据结构介绍 redis是一种高级的key-value的存储系统,其中的key是字符串类型,尽可能满足如下几点: 1)key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低 ...

  6. 页面布局常用,让子级div排排坐

    画页面的时候经常遇到页面布局的问题,父级div包裹多个子div很常见,代码如下: <div> <div style='width:100px;height: 100px;backgr ...

  7. c#操作windows本地账户

    using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices ...

  8. 解决Yii2 添加css后页面刷新也无反应的情况

    'assetManager' => [ // uncomment the following line if you want to auto update your assets (unix ...

  9. oracle db 产品路线图

    Release Schedule of Current Database Releases (文档 ID 742060.1)

  10. 01 性能优化基础怀实践 之 ASH分析

    1.模拟一个会话阻塞的场景.    通过update 同一行数据达到模拟阻塞的效果 : SQL> create table t1 (id number ,name varchar2(20)) ; ...