【问题标题】:Trouble setting up stored parameter设置存储参数时遇到问题
【发布时间】:2014-08-11 03:03:27
【问题描述】:

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

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

【问题讨论】:

    标签: mysql loops stored-procedures cursor


    【解决方案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;
        ...
    

    【讨论】:

    • 就是这样。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2021-06-19
    相关资源
    最近更新 更多