MySQL 调用 PREPARE 时继续缺少 table 的错误处理程序

MySQL Continue Error Handler for missing table when calling PREPARE

在我的存储过程中,我为从一个数据库到另一个数据库的多个 INSERT IGNORE INTO 语句调用 PREPARE,但它们有可能不具有相同的 table。所以我想做的就是跳过 SQL 语句并在 table 不存在的情况下继续下一个语句,即在 PREPARE 语句失败后。

这是我的代码:

SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.currentYear SET year = YEAR(now()) + 1;');
PREPARE stmt FROM @ins;
EXECUTE stmt;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table1 SELECT * FROM table1;');
PREPARE stmt FROM @ins;
EXECUTE stmt;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table2 SELECT * FROM table2;');
PREPARE stmt FROM @ins;
EXECUTE stmt;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table3 SELECT * FROM table3;');
PREPARE stmt FROM @ins;
EXECUTE stmt;

等等.. 超过 100 个这样的语句。因此,当其中一个引发异常“table 不存在”时,我想忽略该错误并继续执行下一条语句,依此类推。我怎样才能做到这一点?

提前致谢!

您在 sql

中打开但未关闭其中一个报价

我找到了解决办法,其实很简单。第一步是声明一个 CONTINUE HANDLER FOR 1146(mySQL 错误代码为“Table 不存在”)然后在获取错误代码(1146)时将变量设置为 TRUE ).下一步是在 EXECUTE 之前简单地使用 If 语句来询问变量是设置为 TRUE 还是 FALSE。如果FALSEEXECUTE stmt。在每个 PREPARE 语句之前,我们需要将变量设置为 FALSE,以防它被 CONTINUE HANDLER 触发并设置为 TRUE.

示例代码如下:

DECLARE CONTINUE HANDLER FOR 1146 SET @error = TRUE;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.currentYear SET year = YEAR(now()) + 1;');
SET @error = FALSE;
PREPARE stmt FROM @ins;
IF @error = FALSE THEN EXECUTE stmt; END IF;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table1 SELECT * FROM table1;');
SET @error = FALSE;
PREPARE stmt FROM @ins;
IF @error = FALSE THEN EXECUTE stmt; END IF;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table1 SELECT * FROM table1;');
SET @error = FALSE;
PREPARE stmt FROM @ins;
IF @error = FALSE THEN EXECUTE stmt; END IF;       etc.

这样,如果目标数据库中不存在 table,我们就可以更改或添加插入语句(对于新的 tables)而不会出现错误。仍有待进一步测试,但它现在可以完成工作。我希望有人会发现这个答案有用。干杯!