在存储过程中检查var是NULL

时间:2014-02-17 09:58:40

标签: mysql stored-procedures if-statement drop-table

我有一个删除所有表的脚本。

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'mydb';

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1; 

只有至少一个表存在时,它才能完美运行一次。 第二次运行给了我一个错误:

  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“NULL”附近使用正确的语法SQL.sql 9 1

我正在尝试使用IF语句,但它仍然不起作用:

IF @tables IS NOT NULL THEN
  SET @tables = CONCAT('DROP TABLE ', @tables);
  PREPARE stmt FROM @tables;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END IF;
  

您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在“if @tables IS NOT NULL THEN”附近使用正确的语法       第1行的SET @tables = CONCAT('DROP TABLE',@ table)'SQL.sql 8 1

在这种情况下使用IF的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

当您为会话变量分配值并在查询中使用相同时,然后
它的价值将取代占位符。由于这个原因,

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables

成为

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO NULL  

完全没有任何意义。

相反,您应该直接使用变量而不预先设置其值 所以不要使用

SET @tables = NULL;

其次,语句块不能由数据库引擎直接编译,除非它们的作用域是在块下定义的。这通常使用存储过程或触发器完成。如果在某个程序中,它们必须介于BEGINEND之间。

以下是错误的:

IF @tables IS NOT NULL THEN
  SET @tables = CONCAT('DROP TABLE ', @tables);
  PREPARE stmt FROM @tables;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END IF;

您应该遵循为存储过程定义的语法以使用范围变量。

请参阅我对类似问题的回答,如下所述:

  1. MySQL Syntax error.
  2. 另请参阅:Variables declaration and scope