如何判断mysql存储过程是否成功执行
我有一个存储过程,它更新两个表,然后在第三个表中插入一行。(据我所知,如果这三项都无法完成,则回滚更新或插入)无论如何,每当我运行此过程时,无论最终是否成功运行这两项更新和插入,它都将“成功”并返回false。我需要它返回一个值(可能是真的),如果它成功地完成了所有两次更新和一次插入,如果它没有完成,则返回false,这样我就可以在服务器端执行正确的错误检查 程序如下:如何判断mysql存储过程是否成功执行,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我有一个存储过程,它更新两个表,然后在第三个表中插入一行。(据我所知,如果这三项都无法完成,则回滚更新或插入)无论如何,每当我运行此过程时,无论最终是否成功运行这两项更新和插入,它都将“成功”并返回false。我需要它返回一个值(可能是真的),如果它成功地完成了所有两次更新和一次插入,如果它没有完成,则返回false,这样我就可以在服务器端执行正确的错误检查 程序如下: CREATE DEFINER=`db1`@`%` PROCEDURE `completed_procedure`(IN ins
CREATE DEFINER=`db1`@`%` PROCEDURE `completed_procedure`(IN insubmissionid INT)
BEGIN
DECLARE ingregid INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;
START TRANSACTION;
SET @ingregid = (SELECT idgreg FROM submission WHERE idsubmission = insubmissionid);
UPDATE submission SET status='a' WHERE idsubmission = insubmissionid;
UPDATE greg SET iscomplete=1 WHERE idgreg = @ingregid;
INSERT INTO completion (idperson, idgreg, datecompleted, idsubmission, mediaid, description,
privatestatus, contenttype, totalamount)
SELECT s.idperson, s.idgreg, s.datesubmitted, s.idsubmission,
COALESCE(s.youtubeid, s.contentid) AS mediaidid, g.description, g.privatestatus,
g.contenttype, COALESCE(SUM(amount),0) AS totalamount
FROM submission s
INNER JOIN greg g on s.idgreg = g.idgreg
INNER JOIN contribution c on s.idgreg = c.idgreg
WHERE s.idsubmission = insubmissionid AND c.ispaid = 1;
COMMIT;
END
最好的方法是什么?您可以返回一个值,下面是一个示例
CREATE DEFINER=`db1`@`%` PROCEDURE `completed_procedure`(IN insubmissionid INT, OUT success INT
BEGIN
IF ( CONDITION ) THEN
SET success = 1;
ELSE
SET success = -1;
END IF;
SELECT success ;
COMMIT;
END
我不确定。非常感谢。通过将OUT变量声明为参数,我必须为OUT参数传入一个额外的参数。有没有一种方法可以只返回一个我在调用时不必指定的变量?@Mitchell您不必传递参数。您可以使用
SELECT ROW\u COUNT()
在数据修改查询之后,以确定它是否进行了任何更改。@Barmar您能给我一个示例,说明如果所有更新和插入都成功,如何返回success=1吗?返回false是什么意思?过程不返回任何东西,只有函数有返回值。成功检查到底应该检查什么?如果您更新了一条记录,但该记录已具有您指定的值,则不会将其计入行\u COUNT()
,但仍被视为成功。您是否只需要知道事务是否已提交或由于异常而必须回滚?请参阅Agu V的回答,它显示了如何向调用者返回成功指示。或者你可以把它重写成一个函数。