Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何判断mysql存储过程是否成功执行_Mysql_Sql_Stored Procedures - Fatal编程技术网

如何判断mysql存储过程是否成功执行

如何判断mysql存储过程是否成功执行,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我有一个存储过程,它更新两个表,然后在第三个表中插入一行。(据我所知,如果这三项都无法完成,则回滚更新或插入)无论如何,每当我运行此过程时,无论最终是否成功运行这两项更新和插入,它都将“成功”并返回false。我需要它返回一个值(可能是真的),如果它成功地完成了所有两次更新和一次插入,如果它没有完成,则返回false,这样我就可以在服务器端执行正确的错误检查 程序如下: CREATE DEFINER=`db1`@`%` PROCEDURE `completed_procedure`(IN ins

我有一个存储过程,它更新两个表,然后在第三个表中插入一行。(据我所知,如果这三项都无法完成,则回滚更新或插入)无论如何,每当我运行此过程时,无论最终是否成功运行这两项更新和插入,它都将“成功”并返回false。我需要它返回一个值(可能是真的),如果它成功地完成了所有两次更新和一次插入,如果它没有完成,则返回false,这样我就可以在服务器端执行正确的错误检查

程序如下:

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的回答,它显示了如何向调用者返回成功指示。或者你可以把它重写成一个函数。