暂无图片
放假有人在吗? 问个MySQL存储过程的问题。
我来答
分享
传奇
2021-10-02
放假有人在吗? 问个MySQL存储过程的问题。
暂无图片 10M

需要对各库执行optimize操作,需要optimize的表我先存放在一张临时表里,然后想调用存储过程,但没真正执行,哪里有问题?

CREATE PROCEDURE optimizetable()

BEGIN
DECLARE l_sql VARCHAR(4000);

SET l_sql=CONCAT("select concat('optimize table ',table_name,';') from table_20211001");
SET @sql=l_sql;

PREPARE s1 FROM @sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;
END;



call optimizetable()  的结果只是生成 optimize table的语句,我是想让这些optimize 直接执行。

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
Cui Hulong

PREPARE s1 FROM @sql;

是执行上面CONCAT("select concat 语句。所以optimizer无法执行。


可以参考下面:

###########

DROP PROCEDURE IF EXISTS `sp_optimize_tables`;

DELIMITER //

CREATE PROCEDURE `sp_optimize_tables`( IN db_name varchar(255))BEGIN
-- To optimize all the tables in exact database.
DECLARE cnt int default 0;
DECLARE i int default 0;
SELECT count(*) as total FROM information_schema.tables WHERE table_schema = db_name into cnt;
WHILE i < cnt
DO
-- Get the table's exact name.
SET @stmt = concat('SELECT table_name FROM information_schema.tables WHERE table_schema = ''',db_name,''' ORDER BY table_name ASC LIMIT ',i,',1 into @tb_name');
prepare s1 from @stmt;
execute s1;
DEALLOCATE prepare s1;
SET @stmt = '';
SET @stmt = concat('OPTIMIZE TABLE ',db_name,'.',@tb_name );
PREPARE s1 FROM @stmt;
EXECUTE s1;
DEALLOCATE prepare s1;
set @stmt = '';
set i = i + 1;
END WHILE ;
END;//
DELIMITER ;


CALL sp_optimize_tables('db8');

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏