# 存储过程
# 批量更新指定数据库中包含某一字段的值,更新为同一值
# 定义
DROP PROCEDURE IF EXISTS upd_column_value;
-- 入参 1.数据库名称, 2.字段名称 3.字段值
CREATE DEFINER=`root`@`%` PROCEDURE `upd_column_value`(DBName VARCHAR(50),ColumnName VARCHAR(50), ColumnValue VARCHAR(50))
BEGIN
-- 需要定义接收游标数据的变量
DECLARE table_xx VARCHAR ( 64 );
-- 需要定义接收游标数据的变量
DECLARE SqlStr VARCHAR ( 6400 );
-- 定义已经执行的sql
DECLARE dealSqlStr VARCHAR ( 10000 );
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
-- 声明游标
DECLARE cur CURSOR FOR SELECT table_name FROM information_schema.COLUMNS WHERE column_name = ColumnName and table_schema = DBName;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 打开游标
OPEN cur;
-- 开始循环
read_loop: LOOP
-- 将查询结果绑定到变量table_xx中
FETCH cur INTO table_xx;
-- 声明结束的时候
IF done = 1 THEN LEAVE read_loop;
END IF;
-- 拼接语句
IF ColumnValue IS NULL THEN SET SqlStr := CONCAT( 'UPDATE ', table_xx, ' SET ', ColumnName,'= NULL' );
ELSE SET SqlStr := CONCAT( 'UPDATE ', table_xx, ' SET ', ColumnName,'= ', ColumnValue );
END IF;
IF (SqlStr<>'') THEN SET @SQL1 = SqlStr;
-- 拼接已执行过的sql
SET dealSqlStr := CONCAT(ifnull(CONCAT(dealSqlStr,';'),''),@SQL1);
-- 执行
PREPARE stmt1
FROM
@SQL1;
EXECUTE stmt1;
END IF;
END LOOP;
CLOSE cur;
-- 打印待执行的sql
select dealSqlStr;
END
# 使用
call upd_column_value('test', 'version', 1);
将test数据库中,所有包含version的表,的version字段更新为1