我正在我的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 ;
如果有人能指出我如何调试这个问题,或者他们是否能发现问题,我会很感激。
答案 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查询。