我有一个 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/