业务需求
1.将当前数据库里的所有表中的某一个字段修改成指定的值
2.思路分析:
2.1 :首先查询到当前库中的所有的表
2.2 :将查询到的表的信息修改成我们需要的sql语句 例:
update 动态表名 set xx=xx
2.3:外部采用存储过程来封装
2.3:内部采用游标的形式来编写,通过游标我们可以清楚的获取到查询到的结果集的每一行
2.4:在通过预处理的方式进行查询。
2.5:在查询的时候需要先判断当前表是否拥有该字段,如果没有拥有该字段则不进行修改,如果有了则进行修改
代码如下
#判断存储过程是否存在
DROP PROCEDURE IF EXISTS zhousan_tenant_id_2;
delimiter $
#创建存储过程
create PROCEDURE zhousan_tenant_id_2()
BEGIN
DECLARE zhoushan_name varchar(15000); -- 表名
DECLARE done INT DEFAULT 0; -- 结束
-- 定义游标,该sql是查询当前库下面的所有表
DECLARE cur_account CURSOR FOR select table_name from information_schema.tables where table_schema='gov_performance_communication';
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 打开游标
OPEN cur_account;
-- 遍历
read_loop:LOOP
# 取值 取多个字段
FETCH NEXT from cur_account INTO zhoushan_name;
# 如果非0就代表结束
IF done!=0
THEN
LEAVE read_loop;
END IF;
# 赋值,sql的含义是:查看当前表是否有当前字段,如果有则>0 ,并且将得到的结果赋值给count_column
set @select_column=concat("SELECT count(1) into @count_column FROM information_schema.columns WHERE table_name='",zhoushan_name,"' and column_name='tenant_id'");
# 准备预处理执行
PREPARE pr1 FROM @select_column;
EXECUTE pr1;
DEALLOCATE PREPARE pr1;
# 判断是否拥有列名
IF @count_column>0
then
# 有列名就进行修改
set zhoushan_name=concat("update ",zhoushan_name," set tenant_id=2;");
set @select_name=zhoushan_name;
# 执行预处理
PREPARE pr2 FROM @select_name;
EXECUTE pr2;
DEALLOCATE PREPARE pr2;
END IF;
END LOOP;
CLOSE cur_account;
END $
#调用存储过程
call zhousan_tenant_id_2();