mysql - Node.js 中的存储过程有时不返回值

标签 mysql sql node.js stored-procedures

我有一个 mysql 存储过程,如果它能够成功执行两个更新并插入并回滚所有内容,则返回 1;如果不能,则返回 0。它看起来像这样:

CREATE DEFINER=`barrence`@`%` PROCEDURE `completed_procedure`(IN insubmissionid INT, OUT success INT)
BEGIN

DECLARE inbountyid INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;

START TRANSACTION;

SET success = 0;
SET @inbountyid = (SELECT idbounty FROM submission WHERE idsubmission = insubmissionid);

UPDATE submission SET status='a' WHERE idsubmission = insubmissionid;

IF (SELECT ROW_COUNT() = 1)
THEN UPDATE bounty SET iscomplete=1 WHERE idbounty = @inbountyid;
END IF;

IF (SELECT ROW_COUNT() = 1)
THEN INSERT INTO completion (idperson, idbounty, datecompleted, idsubmission, mediaid, description,
    privatestatus, contenttype, totalamount)  
SELECT s.idperson, s.idbounty, s.datesubmitted, s.idsubmission,
    COALESCE(s.youtubeid, s.contentid) AS mediaidid, b.description, b.privatestatus,
    b.contenttype, COALESCE(SUM(amount),0) AS totalamount 
FROM submission s 
INNER JOIN bounty b on s.idbounty = b.idbounty 
INNER JOIN contribution c on s.idbounty = c.idbounty 
WHERE s.idsubmission = insubmissionid AND c.ispaid = 1;
END IF;

IF (SELECT ROW_COUNT() = 1)
THEN SET success = 1;
END IF;

IF (success = 0)
THEN ROLLBACK;
END IF;

SELECT success;

COMMIT;
END

当我在 MySQL Workbench 内部调用这个存储过程时,它似乎工作正常,执行所有更新/插入,否则返回 1 或 0。但是,当我在 Node.js 服务器上调用此存储过程并使用 console.log 记录结果时,它仅在成功变量为 1 时返回成功变量,而在为 0 时则不返回该变量。以下是我的调用方式:

db.acceptSubmission(submissionId, function(result) {
        console.log(result);
}

exports.acceptSubmission = function(submissionId, callback) {
    var sql = "CALL completed_procedure(?, @success)";
    var inserts = [submissionId];
    sql = mysql.format(sql, inserts);

    console.log("Running Admin Accept Submission Procedure: " + sql);

    dbcommon.executeStatement(pool, sql, callback);
};

成功时结果如下所示:

[ [ { success: 1 } ],
  { fieldCount: 0,
    affectedRows: 0,
    insertId: 0,
    serverStatus: 2,
    warningCount: 0,
    message: '',
    protocol41: true,
    changedRows: 0 } ]

当它不是时:

{ fieldCount: 0,
  affectedRows: 0,
  insertId: 0,
  serverStatus: 2,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0 }

我完全被难住了。这是怎么回事?

最佳答案

我相信这正是您使用的 mysql 模块在看到该上下文中的结果时的行为方式。我相信,由于您知道如何解释响应,因此在这种情况下这不是问题,并且通常当您返回非零响应时您将获得预期结果。

关于mysql - Node.js 中的存储过程有时不返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36416660/

相关文章:

mysql - 搜索某个日期是否在事件中

javascript - 在 JavaScript 中解析 MySQL 日期

sql - 我该如何优化这个查询?

javascript - 部署到AWS后无法通过Next.Js中的getInitialProps获取数据,但可以在开发环境中使用

javascript - nodejs 在更改时重新导入文件

mysql - [MySQL]优化报告月度总结

python - 查询python memcached数据

sql - MySql - 使用连接的子查询插入多行?

node.js - Sequelize get random entry with association and limit, "缺少FROM子句条目

python - Python 中的异常问题