2014-02-17 18 views
1

我有一個刪除所有表的腳本。在存儲過程中檢查var爲NULL

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; 

它完美地工作只有一次 - 當至少有一個表存在。 第二輪給我一個錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1 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; 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if @tables IS NOT NULL THEN SET @tables = CONCAT('DROP TABLE ', @tables)' at line 1 SQL.sql 8 1

什麼是使用IF正確的方法這個案例?

回答

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