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_名称,它可以按预期工作。