2012-02-14 105 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; 

這是行不通的;我得到一個錯誤說我在SQL語法附近「節目表從my_database_name」

當然是一個錯誤,而不是做show tables from my_database_name我真正想說的show tables from database()show tables from (select database()),這兩者都不工作。

幫助?我可以直接在SQL中執行此操作,還是需要先從我的程序中調用show tables,然後在那裏遍歷結果集?我如何創建一個光標來捕獲database()show tables之類的值?

回答

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 ;