3

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'

私の推測では、私のフェッチステートメントは何らかの理由でフェッチしていません。そこで、selectステートメントを確認しましたが、結果セットがあります。エラーを解決する方法や、mysqlデータベースのすべてのビューを削除する方法についてのアイデアはありますか?

4

1 に答える 1

6

これらのクエリを実行するには、プリペアドステートメントを使用する必要があります。文字列「DROPVIEW...」を作成し、プリペアドステートメントを使用してステートメントを実行します。

例えば ​​-

...
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条件を変更します。

于 2012-10-23T10:56:23.770 に答える