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

项目中要显示每个表的记录条数,但是因为数据库中的索引表中(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值