存储过程未按预期更新表

时间:2014-06-20 11:32:43

标签: mysql stored-procedures

我正在我的MySQL数据库上运行存储过程,它说它运行正常,没有错误返回,但是当我检查表时它应该已经更新,没有任何更改。

当我手动运行程序的每个单独部分时,它工作正常,我回到了我的期望。所有选择都运行良好。

我在处理存储过程时相当新,所以我不确定如何调试它。我可以让它输出它所处的不同阶段,这样我可以确保它获得更新查询吗?我可以查看它正在运行的查询的结果吗?

我用谷歌搜索了这个问题,但我没有找到任何有用的信息。手册中只有关于如何设置程序的信息,而不是如何在不工作时调试它(除非我遗漏了一些东西)。

这是我的整个程序:

DELIMITER //
CREATE PROCEDURE QuestionStatistics(IN quizId INT(11))
BEGIN
  DECLARE bDone INT;
  DECLARE qqId INT;
  DECLARE totalAnswers INT;
  DECLARE totalCorrect INT;
  DECLARE totalValue 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;

    SELECT COUNT(*)
    FROM quizAnswers 
    WHERE qaQuizQuestionId = qqId 
    AND qaIsMarked = 1 
    INTO totalAnswers;

    SELECT COUNT(*)
    FROM quizAnswers 
    WHERE qaQuizQuestionId = qqId 
    AND qaIsCorrect = 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 ;

如果有人能指出我如何调试这个问题,或者他们是否能发现问题,我会很感激。

1 个答案:

答案 0 :(得分:0)

您可以使用dbForge Studio for MySQL中的调试器功能调试您的程序(试用版)。

我建议您优化查询,例如使用一个SELECT查询而不是三个 -

SELECT
  COUNT(IF(qaIsMarked = 1, 1, NULL)),
  COUNT(IF(qaIsCorrect = 1 , 1, NULL)),
  SUM(IF(qaIsMarked = 1, qaValue, 0)
  INTO totalAnswers, totalCorrect, totalValue
FROM
  quizAnswers 
WHERE
  qaQuizQuestionId = qqId;

为避免错误 - 请勿对参数,变量和对象名称(如列)使用相同的名称。

另外,尽量避免使用游标,编写一个复杂的UPDATE查询。