【问题标题】:How to drop all views in mysql database with stored procedure?如何使用存储过程删除mysql数据库中的所有视图?
【发布时间】:2012-10-13 06:09:14
【问题描述】:

我希望我的 mysql 服务器删除数据库中的所有视图。我已经为存储过程创建了一个事件:

开始

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;

结束

但是,此过程会产生以下错误:

错误代码:1051。未知表'view_name'

我的猜测是我的 fetch 语句由于某种原因没有获取。所以我检查了 select 语句,它确实有一个结果集。关于如何解决错误或如何将所有视图删除到 mysql 数据库中的任何想法?

【问题讨论】:

标签: mysql stored-procedures sql-view


【解决方案1】:

您需要使用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 条件。

【讨论】:

  • 太棒了!没有注意到应该构建一个字符串。
  • 总是欣赏“无光标”版本。尤其是在 MySQL 中。
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多