暂无图片
mysql一个问题,自己拼接出来的动态sql怎么执行,下述写法只能执行一条,加循环也不行?
我来答
分享
暂无图片 匿名用户
mysql一个问题,自己拼接出来的动态sql怎么执行,下述写法只能执行一条,加循环也不行?
drop PROCEDURE P_BACKUP;
create PROCEDURE P_BACKUP()
BEGIN 
DECLARE i INT;  # 申明变量
SET i = 0;  # 变量赋值
WHILE i<5 DO # 结束循环的条件: 当i大于5时跳出while循环
select @Sql:=concat('create table vendor_moodle_hs.',table_name,'_hs as select *,now() as etl_date from vendor_moodle.',table_name,';') from information_schema.tables where table_schema='vendor_moodle' and table_type='base table' and table_name  like 'mdl_%';
prepare stmt from @Sql;
execute stmt;
deallocate prepare stmt;
SET i = i+1;    # 循环一次,i加1
END WHILE;  # 结束while循环
END;
call P_BACKUP()

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
严少安
暂无图片

这里的now()未生效,被包在字符串里了
select @Sql:=concat ... now()

暂无图片 评论
暂无图片 有用 0
暂无图片
DarkAthena
2022-01-13
他是想把基于这个查询条件的所有表都备份一次,在这个逻辑里有没有now()都没关系,now()只是作为备份表上的一个备份日期进行记录
DarkAthena

这与now()在里面还是外面没有关系。他是想拼出下面这些sql,一条一条去执行

create table vendor_moodle_hs.表1_hs as select *,now() as etl_date from vendor_moodle.表1; create table vendor_moodle_hs.表2_hs as select *,now() as etl_date from vendor_moodle.表2; create table vendor_moodle_hs.表3_hs as select *,now() as etl_date from vendor_moodle.表3; create table vendor_moodle_hs.表4_hs as select *,now() as etl_date from vendor_moodle.表4;

首先你这个查询条件,是查出来有多条记录还是只有一条记录?

如果是多条记录的话,你@sql参数接收的是什么东西?用i来循环的话,这个i又没有在循环里用到,这有什么用?

正确的做法应该是,在循环里拼sql,一次只拼一个表,那么很明显,你应该用这个sql查出来的表名作为游标,来循环执行拼接

暂无图片 评论
暂无图片 有用 0
严少安
2022-01-13
now在里面是定量,执行不了啊
DarkAthena
答主
2022-01-13
这只是拼一个动态sql的字符串而已,now()不必要在外面执行,now()没有影响任何有关循环的逻辑
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏