我有一个非常简单的问题,但是我没有使用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;
我有一个非常简单的问题,但是我没有使用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;
Answers:
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;
LEAVE this_proc;
听起来很完美!
return <value>
返回一个值。
:
和BEGIN
作为proc_label:BEGIN
而给了语法错误proc_label: BEGIN
的工作。
如果要在没有错误的情况下“提前退出”,请使用@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;
注意SQLSTATE '45000'
等同于“未处理的用户定义的异常条件”。默认情况下,这将产生错误代码1644
(含义相同)。请注意,您可以根据需要抛出其他条件代码或错误代码(以及用于异常处理的其他详细信息)。
有关此主题的更多信息,请查看:
https://dev.mysql.com/doc/refman/5.5/zh-CN/signal.html
附录
当我重新阅读我的这篇文章时,我意识到我还有一些补充。在MySQL v5.5之前,有一种方法可以模拟引发异常。完全不一样,但这是类似的:通过调用不存在的过程来创建错误。用有意义的名称调用该过程,以便获得确定问题所在的有用方法。发生错误时,您将看到失败行(取决于您的执行上下文)。
例如:
CALL AttemptedToInsertSomethingInvalid;
请注意,在创建过程时,不会对此类内容执行验证。因此,在使用诸如编译语言之类的语言时,您永远无法调用一个不存在的函数,而在这样的脚本中,它只会在运行时失败,这正是这种情况下所需要的!
要以一种可移植的方式处理这种情况(即,由于它不使用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;
if
声明中的整个部分的缩进即可。从逻辑上讲,它与“早期回报”相同。
这对我有用:
CREATE DEFINER=`root`@`%` PROCEDURE `save_package_as_template`( IN package_id int ,
IN bus_fun_temp_id int , OUT o_message VARCHAR (50) ,
OUT o_number INT )
BEGIN
DECLARE v_pkg_name varchar(50) ;
DECLARE v_pkg_temp_id int(10) ;
DECLARE v_workflow_count INT(10);
-- checking if workflow created for package
select count(*) INTO v_workflow_count from workflow w where w.package_id =
package_id ;
this_proc:BEGIN -- this_proc block start here
IF v_workflow_count = 0 THEN
select 'no work flow ' as 'workflow_status' ;
SET o_message ='Work flow is not created for this package.';
SET o_number = -2 ;
LEAVE this_proc;
END IF;
select 'work flow created ' as 'workflow_status' ;
-- To send some message
SET o_message ='SUCCESSFUL';
SET o_number = 1 ;
END ;-- this_proc block end here
END
IF tablename IS NOT NULL THEN
...;)