mysql 存储过程游标


CREATE  PROCEDURE `cp_score`()
BEGIN
    DECLARE stuId VARCHAR (40) ;
    DECLARE pcId VARCHAR (40) ;
    DECLARE num INT ;
    DECLARE sumS1 FLOAT ;
    DECLARE sumS2 FLOAT ;
    DECLARE sumS FLOAT ;
    DECLARE stuScoreId VARCHAR (40) ;
    DECLARE t_error INTEGER DEFAULT 0 ;
    DECLARE done INT DEFAULT FALSE ;
    DECLARE my_cursor CURSOR FOR 
    SELECT 
        studentid,
        cpperiodcourseid,
        COUNT(1) AS countNum 
    FROM
        `cp_studentscore` 
    WHERE CPPeriodCourseId IS NOT NULL
    GROUP BY studentid,
        cpperiodcourseid 
    HAVING countNum > 1 ;


    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE ;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1 ;
    SELECT NOW() ;
    OPEN my_cursor ;
    myLoop :
    LOOP
        FETCH my_cursor INTO stuId,
        pcId,
        num ;
        SET sumS = 0 ;
        IF done 
        THEN LEAVE myLoop ;
        END IF ;
        SELECT 
            id INTO stuScoreId 
        FROM
            cp_studentscore 
        WHERE studentId = stuId 
            AND cpperiodcourseId = pcId 
        ORDER BY lastupdatedTime DESC 
        LIMIT 0, 1 ;
        START TRANSACTION ;


        #更新相同课程下明细列表对应的studentScoreId
        UPDATE 
            cp_studentscoredetail 
        SET
            cpstudentscoreid = stuScoreId 
        WHERE cpstudentscoreid IN 
            (SELECT 
                id 
            FROM
                cp_studentscore 
            WHERE studentId = stuId 
                AND cpperiodcourseId = pcId) ;


        #计算有活动的课程总学分部分
        SELECT 
            SUM(MaxScore) INTO sumS1 
        FROM
            (SELECT 
                MAX(score) AS MaxScore 
            FROM
                cp_studentscoredetail 
            WHERE cpcoursegroupId IS NOT NULL 
                AND cpstudentscoreid = stuScoreId 
            GROUP BY cpcoursegroupId) AS T ;


        #计算没有活动名称课程分数部分 
        SELECT 
            SUM(score) INTO sumS2 
        FROM
            cp_studentscoredetail 
        WHERE CPCourseGroupId IS NULL 
            AND CPStudentScoreId = stuScoreId ;


        IF (sumS1 IS NOT NULL) 
        THEN SET sumS = sumS + sumS1 ;
        END IF ;


        IF (sumS2 IS NOT NULL) 
        THEN SET sumS = sumS + sumS2 ;
        END IF ;


        #更新课程成绩汇总表
        UPDATE 
            cp_studentscore 
        SET
            score = sumS 
        WHERE id = stuScoreId ;


        #删除多余的课程成绩记录
        DELETE 
        FROM
            cp_studentScore 
        WHERE studentId = stuId 
            AND cpperiodcourseId = pcId 
            AND id <> stuScoreId ;
        IF t_error = 1 
        THEN ROLLBACK ;
        ELSE COMMIT ;
        END IF ;
    END LOOP myLoop ;
    CLOSE my_cursor ;
    SELECT NOW() ;
END


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值