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

MySQL存储过程-区分注释和错误,mysql,stored-procedures,sql-drop,Mysql,Stored Procedures,Sql Drop,我有一个执行存储SQL的存储过程 但是,如果用户尝试执行,错误处理程序将启动并退出 drop temporary table if exists t_person; 而且“t\u person”不存在。如果没有给出“if exists”,我很乐意生成一个错误,但是如何避免前面的情况下出现错误(错误代码没有改变) 下面是我的错误处理程序: DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN set @sql = 'select \'Invalid SQL

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

但是,如果用户尝试执行,错误处理程序将启动并退出

drop temporary table if exists t_person;
而且“
t\u 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;

您可以使用
CONTINUE
处理程序,而不是捕获MySQL错误1051“未知表”的
EXIT
处理程序

-或-

编辑

要在异常处理程序中捕获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;
参考:



drop temporary table
语句中的
like p_person
在我看来是错误的;至少,我不熟悉在
DROP TABLE
语句中使用
LIKE
关键字。

Re:
LIKE\u person
,我只是想知道同样的事情。它不在MySQL的官方文档中,我甚至想不出这种语法能起到什么作用。抱歉——这是从create语句中复制的,但我认为“if exists”比“if not exists”更清楚。。。我让事情变得更加混乱。。。Somlaso,这是否让我能够区分带和不带“if[not]exists”的SQL?Mysql知道其中的区别——它在查询浏览器中使用不同颜色的图标,这取决于“if exists”是否存在——但如果我能区分它们,我就完蛋了。TomMelly:
if not exists
drop table
语句中无效。这将抛出MySQL错误1064。要捕获处理程序中的MySQL错误,需要指定要捕获的MySQL错误号或相应的SQLSTATE。(您可以指定一个命名条件,但该条件必须解析为MySQL错误号或SQLSTATE)。参考:道歉(再次)。我没有检查提供的代码,使事情变得复杂了。我应该替换原帖子的文本,还是这会让事情变得混乱?
CREATE TEMPORARY TABLE IF NOT EXISTS `foo` (id INT);
DECLARE CONTINUE HANDLER FOR 1050 BEGIN END;