您的位置:首页 > 数据库 > MySQL

MySql存储过程中执行动态SQL(表名是变量)

2017-05-29 00:00 337 查看
项目中要显示每个表的记录条数,但是因为数据库中的索引表中(infomation_schema.tables)记录的每个表的数据条数不是那么实时(超过3w多就不准了),所以要手动持久化一下再显示,持久化的过程中需要把表名作为参数,所以只能用动态SQL执行,以下就是一个例子:

CREATE DEFINER=`root`@`%` PROCEDURE `XXXXXX`
BEGIN
-- By Minghan Sui, 由于information_schema.TABLES 表统计的记录数不完全准确,
-- 所以建立此存储过程定时更新元数据表中的记录数record_number
-- 循环标识
DECLARE Done INT DEFAULT 0;
-- 元数据ID
DECLARE meta_id VARCHAR(36);
-- 元数据 表名称
DECLARE meta_table_name VARCHAR(100);
-- 声明游标
DECLARE C_META CURSOR FOR SELECT id, table_name FROM info_metadata_table;
-- 当下一条没数据时 Done设置成1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done = 1;
-- 打开游标
OPEN C_META;
-- 逐个取出当前记录字段的值
FETCH C_META INTO meta_id, meta_table_name;
-- 遍历数据表
WHILE Done <> 1 DO
-- 动态SQL查询出记录数放在变量meta_rows里
SET @sqlstr = concat("SELECT COUNT(1) INTO @META_ROWS FROM ", meta_table_name);
PREPARE p_sqlstr FROM @sqlstr;
EXECUTE p_sqlstr;
DEALLOCATE PREPARE p_sqlstr;

-- 更新记录数
UPDATE info_metadata_table SET record_number = @META_ROWS WHERE id = meta_id;

-- 获取下一条游标信息
FETCH C_META INTO meta_id, meta_table_name;
END WHILE;
-- 关闭游标
CLOSE C_META;
END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL