Mysql – 如何退出/退出存储过程

我有一个非常简单的问题,但我没有得到任何简单的代码使用Mysql从SP退出。 任何人都可以与我分享如何做到这一点?

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20)) BEGIN IF tablename IS NULL THEN #Exit this stored procedure here END IF; #proceed the code END; 
 CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20)) proc_label:BEGIN IF tablename IS NULL THEN LEAVE proc_label; END IF; #proceed the code END; 

没有办法:MySQL的天才们并不认为这是必需的 – 他们更喜欢大规模的长时间封锁到优雅的“退出早期”编码模式。

但是,为了解决这个问题(过去我曾经效果不错)就是把程序分解成逻辑部分,就像这样:

 CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20)) BEGIN IF tablename IS NOT NULL THEN CALL SP_Reporting_2(tablename); END IF; END; CREATE PROCEDURE SP_Reporting_2(IN tablename VARCHAR(20)) BEGIN #proceed with code END; 

为什么不这样做:

 CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20)) BEGIN IF tablename IS NOT NULL THEN #proceed the code END IF; # Do nothing otherwise END; 
 MainLabel:BEGIN IF (<condition>) IS NOT NULL THEN LEAVE MainLabel; END IF; ....code ie IF (@skipMe) IS NOT NULL THEN /* @skipMe returns Null if never set or set to NULL */ LEAVE MainLabel; END IF; 

如果您希望在没有错误的情况下提前退出,请使用@piotrm发布的接受答案。 但是,最典型的情况是,由于错误条件(特别是在SQL过程中),您将会陷入困境。

从MySQL v5.5开始,你可以抛出exception。 否定exception处理程序等,将达到相同的结果,但在一个更清洁,更深刻的方式。

就是这样:

 DECLARE CUSTOM_EXCEPTION CONDITION FOR SQLSTATE '45000'; IF <Some Error Condition> THEN SIGNAL CUSTOM_EXCEPTION SET MESSAGE_TEXT = 'Your Custom Error Message'; END IF; 

注意SQLSTATE '45000'等同于“未处理的用户定义的exception情况”。 默认情况下,这将产生一个错误代码1644 (它有相同的含义)。 请注意,如果需要,可以抛出其他条件代码或错误代码(加上exception处理的其他详细信息)。

有关此主题的更多信息,请查看:

https://dev.mysql.com/doc/refman/5.5/en/signal.html

如何在MySQL函数中引发错误

http://www.databasejournal.com/features/mysql/mysql-error-handling-using-the-signal-and-resignal-statements.html