2012-10-23 67 views
2

我想我的MySQL服務器刪除數據庫中的所有視圖。我媒體鏈接創建了一個存儲過程的事件:如何使用存儲過程刪除mysql數據庫中的所有視圖?

BEGIN

DECLARE done INT DEFAULT FALSE; 
DECLARE VIEW_NAME CHAR(255); 
DECLARE VIEW_NAMES CURSOR FOR SELECT table_name FROM information_schema.views; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

OPEN VIEW_NAMES; 

read_loop: LOOP  
    FETCH VIEW_NAMES INTO VIEW_NAME; 
    IF done THEN 
     LEAVE read_loop; 
    END IF;  
    DROP VIEW VIEW_NAME; 
END LOOP; 

CLOSE VIEW_NAMES; 

END

然而,這個過程產生以下錯誤:

Error Code: 1051. Unknown table 'view_name'

我的猜測是,我的fetch語句由於某種原因沒有獲取。所以我檢查了select語句,它有一個結果集。任何人有關如何解決錯誤或如何去掉mysql數據庫中的所有視圖的任何想法?

+0

試試這個:http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html – Rob

+0

我爲什麼要做檢查? – Rafiek

回答

6

您需要使用prepared statements來執行這些查詢。構建一個字符串'DROP VIEW ...',然後使用預處理語句執行語句。

例如 -

... 
read_loop: LOOP  
    FETCH VIEW_NAMES INTO VIEW_NAME; 
    IF done THEN 
     LEAVE read_loop; 
    END IF;  

    SET @query = CONCAT('DROP VIEW ', VIEW_NAME); 
    PREPARE stmt FROM @query; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

END LOOP; 
... 

另一個變體,而無需打開光標:

SET @views = NULL; 

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

SET @views = CONCAT('DROP VIEW ', @views); 
PREPARE stmt FROM @views; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

...修改WHERE條件,如你所願。

+0

太棒了!沒有注意到應該建立一個字符串。 – Rafiek

+0

總是欣賞「無遊標」版本。特別是在MySQL中。 –

相關問題