我有一个执行存储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;
答案 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
关键字。