0

在我的存储过程中,我有多个从一个数据库到另一个数据库的 INSERT IGNORE INTO 语句,但它们有可能没有相同的表。所以我想做的就是跳过那个 SQL 语句,如果表不存在,则继续下一个。

这是我的代码:

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 多个这样的语句。因此,当其中一个引发异常“表不存在”时,我想忽略该错误并继续下一条语句,依此类推。我怎样才能做到这一点?

先感谢您!

4

2 回答 2

0

我找到了一个解决方案,它实际上非常简单。第一步是声明一个CONTINUE HANDLER FOR 1146(“表不存在”的mySQL错误代码)然后设置一个变量,TRUE当它得到错误代码(1146)。下一步是简单地使用Ifstatement beforeEXECUTE询问变量是否设置为TRUEor FALSE。如果FALSE, EXECUTEstmt。在每个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.

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

于 2021-06-08T10:42:45.453 回答
0

您打开并且不关闭 sql 中的引号之一

于 2021-06-04T13:15:57.750 回答