Joe*_*jam 119 mysql sql stored-procedures
我有一个非常简单的问题,但我没有得到任何简单的代码使用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;
Run Code Online (Sandbox Code Playgroud)
pio*_*trm 192
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;
Run Code Online (Sandbox Code Playgroud)
Boh*_*ian 13
要以可移植的方式处理这种情况(即因为它不使用MySQL标签Kung fu将在所有数据库上工作),将过程分解为逻辑部分,如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
如果您希望在没有错误的情况下"提前退出",请使用@piotrm发布的已接受答案.但是,最典型的情况是,由于错误情况(特别是在SQL过程中),您将会失败.
从MySQL v5.5开始,您可以抛出异常.否定异常处理程序等将以更清晰,更尖锐的方式实现相同的结果.
这是如何做:
DECLARE CUSTOM_EXCEPTION CONDITION FOR SQLSTATE '45000';
IF <Some Error Condition> THEN
SIGNAL CUSTOM_EXCEPTION
SET MESSAGE_TEXT = 'Your Custom Error Message';
END IF;
Run Code Online (Sandbox Code Playgroud)
注意SQLSTATE '45000'
等同于"未处理的用户定义的异常条件".默认情况下,这将产生错误代码1644
(具有相同的含义).请注意,如果需要,您可以抛出其他条件代码或错误代码(以及异常处理的其他详细信息).
有关此主题的更多信息,请查看:
https://dev.mysql.com/doc/refman/5.5/en/signal.html
附录
当我重新阅读我的这篇文章时,我意识到我还有其他补充内容.在MySQL v5.5之前,有一种方法可以模拟抛出异常.这完全不是一回事,但这是模拟的:通过调用不存在的过程来创建错误.使用有意义的名称调用该过程,以便获得确定问题所在的有用方法.发生错误时,您将看到失败的行(取决于您的执行上下文).
例如:
CALL AttemptedToInsertSomethingInvalid;
请注意,在创建过程时,不会对此类事物执行验证.因此,在类似编译语言之类的东西中,你永远不能调用那些不存在的函数,在这样的脚本中它只会在运行时失败,这正是本案所需的!
归档时间: |
|
查看次数: |
91166 次 |
最近记录: |