MySQL存储过程 - 区分注释和错误

时间:2015-05-11 15:35:46

标签: mysql stored-procedures sql-drop

我有一个执行存储SQL的存储过程。

但是,如果用户尝试执行

,则错误处理程序会启动并退出
drop temporary table if exists t_person;

和't_person'不存在。我很高兴在没有给出'if exists'时产生错误,但是如何避免前一种情况的错误(错误代码没有改变)?

这是我的错误处理程序:

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
  set @sql = 'select \'Invalid SQL or bad parameter resulting in invalid SQL\' as `Error`';
  prepare stmt from @sql;
  execute stmt;
END;

1 个答案:

答案 0 :(得分:1)

您可以使用CONTINUE处理程序而不是EXIT处理程序来捕获MySQL错误1051"未知表" ...

DECLARE CONTINUE HANDLER FOR 1051 BEGIN END;

-OR -

DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' BEGIN END;

修改

要在异常处理程序中捕获MySQL错误,您需要指定MySQL错误号或要捕获的相应SQLSTATE。 (您可以指定命名条件,但该命名条件必须解析为MySQL错误号或SQLSTATE)。

语法错误会导致MySQL错误1064。

如果表foo存在,则您发出

CREATE TEMPORARY TABLE IF NOT EXISTS `foo` (id INT);

这会抛出MySQL错误1050。

要捕获该错误,请为此声明另一个处理程序。假设你想吞下"吞下"例外并继续处理...

DECLARE CONTINUE HANDLER FOR 1050 BEGIN END;

参考:https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html

<击> like p_person语句中的drop temporary table对我来说是错误的;至少,我不熟悉在LIKE声明中使用DROP TABLE关键字。