MySQL存储过程-区分注释和错误
我有一个执行存储SQL的存储过程 但是,如果用户尝试执行,错误处理程序将启动并退出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
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;