我是处理存储过程的新手,我尝试设置一组复杂的查询来为我更新一些统计信息。问题是它说语法不正确但我不知道为什么。它看起来像我能找到的其他每个例子。有人可以指点我正确的方向吗?
我收到的错误是此行的语法错误:FETCH curs INTO @qqId;
我的整个代码:
DELIMITER //
CREATE PROCEDURE QuestionStatistics(IN quizId INT(11))
BEGIN
DECLARE bDone INT;
DECLARE curs CURSOR FOR SELECT qqId FROM quizQuestions WHERE qqQuizId = quizId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
OPEN curs;
SET bDone = 0;
REPEAT
FETCH curs INTO @qqId; <-- Error here
SELECT COUNT(*)
FROM quizAnswers
WHERE qaQuizQuestionId = @qqId
AND qaIsMarked = 1
INTO @totalAnswers;
SELECT COUNT(*)
FROM quizAnswers
WHERE qaQuizQuestionId = @qqId
AND qaCorrect = 1
INTO @totalCorrect;
SELECT SUM(qaValue)
FROM quizAnswers
WHERE qaQuizQuestionId = @qqId
AND qaIsMarked = 1
INTO @totalValue;
UPDATE quizQuestions
SET qqAveragePoints = ROUND(@totalValue / @totalAnswers, 2),
qqPercentageCorrect = ROUND(100 * @totalCorrect / @totalAnswers)
WHERE qqId = @qqId;
UNTIL bDone END REPEAT;
CLOSE curs;
END//
DELIMITER ;
我对此代码的原始灵感来自于this answer here中的代码。
答案 0 :(得分:1)
为游标声明局部变量而不是用户定义的变量(使用@
)
DELIMITER //
CREATE PROCEDURE QuestionStatistics(IN quizId INT(11))
BEGIN
declare qqIdVar INT;
...
REPEAT
FETCH curs INTO qqIdVar;
SELECT COUNT(*)
FROM quizAnswers
WHERE qaQuizQuestionId = qqIdVar
AND qaIsMarked = 1
INTO @totalAnswers;
...