mysql - 存储过程未按预期更新表

标签 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 ;

如果有人能够指出我如何调试此问题的正确方向,或者他们是否可以发现问题,我将不胜感激。

最佳答案

您可以使用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/

相关文章:

MySql 存储过程 -> 游标或处理程序声明后的变量或条件声明

mysql - 在这种情况下,是什么导致 MySQL 错误 1071( key 太长)?

php - 使用 CodeIgniter ActiveRecord 连接三个表并过滤数据

sql-server - 从 Firebird 到 SQL Server 的过程

mysql - phpmyadmin 在创建存储过程时卡住

mysql - 编辑数据库中的最新行?

MySQL,如何将多条记录连接到一条记录

java - Spring Data JPA NamedStoredProcedureQuery 多个输出参数

sql - 这个存储过程对 sql 注入(inject)安全吗?

php - 如何使用存储过程的字符串 id 插入多条记录?