我正在我的 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 ;
如果有人能够指出我如何调试此问题的正确方向,或者他们是否可以发现问题,我将不胜感激。
最佳答案
您可以使用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 查询。
关于mysql - 存储过程未按预期更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24326318/