# 存储过程

# 批量更新指定数据库中包含某一字段的值,更新为同一值

# 定义

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
Last Updated: 12/10/2023, 7:31:44 PM