无法设置存储的参数

时间:2014-06-20 11:06:01

标签: mysql loops stored-procedures cursor

我是处理存储过程的新手,我尝试设置一组复杂的查询来为我更新一些统计信息。问题是它说语法不正确但我不知道为什么。它看起来像我能找到的其他每个例子。有人可以指点我正确的方向吗?

我收到的错误是此行的语法错误: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中的代码。

1 个答案:

答案 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;
    ...