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

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)

  • 只需标记每个proc'this_proc'的BEGIN部分.因为`LEAVE this_proc;`听起来很完美! (32认同)
  • 你可以离开并返回一个值吗? (2认同)

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)

  • 哎呀,为什么不使用第一个解决方案呢? (7认同)
  • 希望我能投票两次。仅仅因为 SQL 不是真正的编程语言并不能给任何人在单个过程中编写 200 多行代码的借口。 (2认同)

Buv*_*inJ 9

如果您希望在没有错误的情况下"提前退出",请使用@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函数中引发错误

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

附录

当我重新阅读我的这篇文章时,我意识到我还有其他补充内容.在MySQL v5.5之前,有一种方法可以模拟抛出异常.这完全不是一回事,但这是模拟的:通过调用不存在的过程来创建错误.使用有意义的名称调用该过程,以便获得确定问题所在的有用方法.发生错误时,您将看到失败的行(取决于您的执行上下文).

例如:

CALL AttemptedToInsertSomethingInvalid;

请注意,在创建过程时,不会对此类事物执行验证.因此,在类似编译语言之类的东西中,你永远不能调用那些不存在的函数,在这样的脚本中它只会在运行时失败,这正是本案所需的!