mysql在存储过程中,为什么查不到table_name

现在需要在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

img

img

下面是在查询中正常执行

img


有没有老师傅能解答一下,问题出在哪了,实在是没搜到

以下回答参考了chatGPT,你看下是否可以帮你解决问题:
根据您提供的存储过程代码,我看到您正在尝试使用游标来获取特定模式下所有表的行数,并计算总行数。但是,在存储过程中执行查询时遇到了问题,即在存储过程中执行查询语句时,某一列的值是空的。

问题可能出现在以下几个地方:

  1. 注释部分代码:您在存储过程中注释掉了一部分查询语句,但是没有注释符号 -- 开头。请确保注释部分的代码正确注释,不会影响存储过程的执行。

  2. 查询结果未被捕获:在存储过程中执行查询时,虽然查询语句被执行了,但没有将结果存储到任何变量中或输出到相关结果集中。这可能导致某一列的值为空。

为了解决这个问题,您可以在存储过程中添加一个变量来存储查询结果,然后在适当的位置使用该变量。

以下是修改后的存储过程代码示例:

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试试呢