如何在MySQL存储过程中遍历逗号分隔值并用于SELECT语句
实现多数据库批量更新的MySQL存储过程
以下是能实现你需求的完整存储过程,它会接收逗号分隔的数据库名称,循环遍历每个库,对对应库中的sample表执行更新操作:
DELIMITER && CREATE PROCEDURE update_multi_db (IN db_list VARCHAR(1000)) BEGIN DECLARE current_db VARCHAR(100); DECLARE remaining_dbs VARCHAR(1000); DECLARE current_id INT; DECLARE done INT DEFAULT 0; -- 声明游标读取Test.Sample中的ID DECLARE id_cursor CURSOR FOR SELECT ID FROM Test.Sample; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 初始化剩余数据库列表 SET remaining_dbs = db_list; -- 循环拆分逗号分隔的数据库名 WHILE remaining_dbs != '' DO -- 取出第一个数据库名 SET current_db = TRIM(SUBSTRING_INDEX(remaining_dbs, ',', 1)); -- 更新剩余数据库列表 SET remaining_dbs = TRIM(SUBSTRING(remaining_dbs, LENGTH(current_db) + 2)); -- 遍历Test.Sample中的每个ID,执行更新 OPEN id_cursor; id_loop: LOOP FETCH id_cursor INTO current_id; IF done = 1 THEN LEAVE id_loop; END IF; -- 动态拼接更新语句 SET @sql = CONCAT( 'UPDATE `', current_db, '`.`sample` SET COL = 0 WHERE ID = ?' ); -- 预处理并执行 PREPARE stmt FROM @sql; SET @id = current_id; EXECUTE stmt USING @id; DEALLOCATE PREPARE stmt; END LOOP id_loop; CLOSE id_cursor; -- 重置done标记,准备下一个库的遍历 SET done = 0; END WHILE; END && DELIMITER ;
关键说明
- 拆分逗号分隔参数:通过
SUBSTRING_INDEX和字符串截取,逐个提取数据库名,直到处理完所有库。 - 避免使用USE语句:直接在UPDATE中用
数据库名.表名的全限定格式,解决USE不能用变量的问题。 - 安全处理动态SQL:用预处理语句传递ID参数,避免SQL注入风险,同时提升执行效率。
- 游标遍历ID:从
Test.Sample表读取需要更新的ID,对每个数据库的对应记录执行更新。
使用示例
调用存储过程时传入逗号分隔的数据库名:
CALL update_multi_db('DataBase1,Database2,Database10');
内容的提问来源于stack exchange,提问作者mohan111
相关产品推荐
相关产品推荐

