现在需要在mysql中查询所有库中的表的数据量,
了解到tables中的table_rows不是很准确,
就准备用存储过程,循环查询,累计数据量
用chat gpt生成了一个,感觉没什么问题
但是执行的时候发现同样一个查询语句,在外面执行是好的,在存储过程中,就有一列值是空的
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_total_row_count`()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE schema_name VARCHAR(255);
DECLARE table_name VARCHAR(255);
DECLARE total_rows INT DEFAULT 0;
DECLARE row_count INT;
DECLARE cur CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema like 'tes%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 此处测试查询语句在存储过程中的执行
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables;
-- WHERE table_type = 'BASE TABLE'
-- AND table_schema like 'tes%';
OPEN cur;
read_loop: LOOP
FETCH cur INTO schema_name, table_name;
IF done THEN
LEAVE read_loop;
END IF;
SET @sql = CONCAT('SELECT COUNT(*) INTO @row_count FROM ', schema_name, '.', table_name);
select @sql;
PREPARE stmt FROM @sql ;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt;
SET total_rows = total_rows + @row_count;
END LOOP;
CLOSE cur;
SELECT total_rows;
END
下面是在查询中正常执行
以下回答参考了chatGPT,你看下是否可以帮你解决问题:
根据您提供的存储过程代码,我看到您正在尝试使用游标来获取特定模式下所有表的行数,并计算总行数。但是,在存储过程中执行查询时遇到了问题,即在存储过程中执行查询语句时,某一列的值是空的。
问题可能出现在以下几个地方:
注释部分代码:您在存储过程中注释掉了一部分查询语句,但是没有注释符号 --
开头。请确保注释部分的代码正确注释,不会影响存储过程的执行。
查询结果未被捕获:在存储过程中执行查询时,虽然查询语句被执行了,但没有将结果存储到任何变量中或输出到相关结果集中。这可能导致某一列的值为空。
为了解决这个问题,您可以在存储过程中添加一个变量来存储查询结果,然后在适当的位置使用该变量。
以下是修改后的存储过程代码示例:
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_total_row_count`()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE schema_name VARCHAR(255);
DECLARE table_name VARCHAR(255);
DECLARE total_rows INT DEFAULT 0;
DECLARE row_count INT;
DECLARE cur CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema like 'tes%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 修改部分开始
DECLARE cur_result CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables;
OPEN cur_result;
FETCH cur_result INTO schema_name, table_name; -- 获取结果集中的第一行
WHILE NOT done DO
-- 执行你想要的操作,例如输出、赋值等
SELECT TABLE_SCHEMA, TABLE_NAME; -- 示例代码,将查询结果输出到结果集
FETCH cur_result INTO schema_name, table_name; -- 获取下一行结果集
END WHILE;
CLOSE cur_result;
-- 修改部分结束
OPEN cur;
read_loop: LOOP
FETCH cur INTO schema_name, table_name;
IF done THEN
LEAVE read_loop;
END IF;
SET @sql = CONCAT('SELECT COUNT(*) INTO @row_count FROM ', schema_name, '.', table_name);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET total_rows = total_rows + @row_count;
END LOOP;
CLOSE cur;
SELECT total_rows;
END
请注意,我只是在存储过程中添加了一个游标和相关逻辑,以便处理查询结果。您可能需要根据实际需求对该部分进行进一步修改和优化。
希望这能帮助您解决问题!如果还有其他疑问,请随时提问。
问问Chat试试呢