2012-02-14 5 views
1

データベース内のすべてのテーブルを繰り返し処理し、何らかのアクションを実行するストアドプロシージャを書きたいと思っています。MySQL: `show tables`のカーソルを宣言しますか?

drop procedure if exists p2; 

DELIMITER // 

CREATE PROCEDURE `p2`() 
LANGUAGE SQL 
DETERMINISTIC 
SQL SECURITY DEFINER 
COMMENT 'A procedure' 
BEGIN 
declare cur1 cursor for 
    show tables from my_database_name 
END// 


call p2; 

これは機能しません。私は、私は本当にshow tables from database()またはshow tables from (select database())、どちらの作品言いたいの代わりshow tables from my_database_nameを行うので、私はSQLの構文近い「my_database_nameから番組表」もちろん

でエラーが発生しているというエラーを取得します。

ヘルプ? SQLでこれを行うことはできますか?まず、自分のプログラムからshow tablesを呼び出してから、結果セットを繰り返し処理する必要がありますか? database()show tablesなどの値をキャプチャするためのカーソルを作成するにはどうすればよいですか?

答えて

3

show tablesは、—のSQLクエリ—とは異なる方法で処理されますが、the tables in the information_schema databaseをクエリできます。 SELECT table_name FROM information_schema.tables WHERE table_schema='db_name'のようなものが必要です。

+0

ありがとうございました!この場合、 'db_name'を' database() 'に置き換えることができ、期待通りに動作します。 – poundifdef

2

ここでは、すべてのテーブルの数をカウントする例を示します。

DELIMITER $$                                          

DROP PROCEDURE IF EXISTS procCountAllTables $$                                 

CREATE PROCEDURE procCountAllTables()                                   

BEGIN                                           
     DECLARE table_name VARCHAR(255);                                   
     DECLARE end_of_tables INT DEFAULT 0;                                  

     DECLARE cur CURSOR FOR                                     
      SELECT t.table_name                                     
      FROM information_schema.tables t                                  
      WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE';                          
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_of_tables = 1;                           

     OPEN cur;                                        

     tables_loop: LOOP                                      
      FETCH cur INTO table_name;                                   

      IF end_of_tables = 1 THEN                                   
       LEAVE tables_loop;                                    
      END IF;                                        

      SET @s = CONCAT('SELECT ''', table_name, ''', COUNT(*) AS Count FROM ' , table_name);                    
      PREPARE stmt FROM @s;                                    
      EXECUTE stmt;                                      

     END LOOP;                                        

     CLOSE cur;                                        
    END $$                                          

DELIMITER ; 
関連する問題