MySQL:为“show tables”声明一个游标?

MySQL:为“show tables”声明一个游标?,mysql,stored-procedures,cursor,Mysql,Stored Procedures,Cursor,我想编写一个存储过程,它遍历数据库中的所有表并执行一些操作 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

我想编写一个存储过程,它遍历数据库中的所有表并执行一些操作

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;
这是行不通的;我收到一个错误,说我在“从我的\u数据库\u名称显示表”附近的SQL语法中有错误

当然,我不想从我的数据库名称中显示表,而是想说从数据库中显示表或从选择数据库中显示表,两者都不起作用


帮忙?我可以在纯SQL中执行此操作,还是需要首先从程序中调用show tables,然后在那里迭代结果集?如何创建游标来捕获数据库或show tables之类的值?

show tables不是SQL查询,它的处理方式不同,但您可以进行查询。您需要类似于“从中选择表名称”,其中表\u schema='db\u name.

显示表不是SQL查询-它的处理方式不同-但您可以查询。您需要类似于从WHERE table_schema='db_name'中选择table_name的内容。

下面是一个示例,可以为您提供所有表的计数

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 ;

下面是一个示例,它为您提供了所有表的计数

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 ;

太棒了,谢谢你!在这种情况下,我可以用数据库替换db_名称,它可以正常工作。太棒了,谢谢!在本例中,我可以用数据库替换db_名称,它可以按预期工作。