使用存储过程批量修改表数据

背景如下:线上有一个表的字段保存的是逗号分隔的图片链接集合,类似"http://123.jpg?asss=xasda,http://12333.jpg?asss=xasda1"这种。因为配置错误导致部分链接的后缀错误,图片无法访问。需要去掉每个链接?之后的内容,如下:"http://123.jpg,http://12333.jpg"结果。

思路就是:

查出要修改的所有记录,循环,使用CHAR_LENGTH(url)-CHAR_LENGTH(REPLACE(url,',',''))计算字符串逗号的个数num,循环num+1次。

使用SUBSTRING_INDEX(url, ',', i);获取字符串中逗号前的子串http://123.jpg?asss=xasda。使用SUBSTRING_INDEX(str, '?', 1)获取?号前子串http://123.jpg。拼接到结果中CONCAT(str_arr, str, ',')

最后判断去掉结尾的逗号,if (RIGHT(str_arr,1)=',') THEN
                     set str_arr=LEFT(str_arr,LENGTH(str_arr)-1);

小技巧:存储过程的调式比较困难 ,可以通过在代码中插入SELECT语句来查看变量值如SELECT tid,url;

代码如下:


CREATE PROCEDURE `updateUrl`(in p1 VARCHAR(255))
 BEGIN
 	   DECLARE done INT DEFAULT FALSE;
     -- 定义字段变量
     DECLARE tid INT;
     DECLARE url TEXT;
     DECLARE i INT DEFAULT 1;
 	 DECLARE num INT DEFAULT 1;
     DECLARE str TEXT;
     DECLARE str_arr TEXT DEFAULT '';
    -- 声明游标变量
     DECLARE cur CURSOR FOR SELECT id,img_url_list as url FROM `zhcj_park_record` WHERE create_time>p1  ORDER BY create_time DESC;
    -- 定义绑定游标结果的变量有值时done = TRUE
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;	        
     -- 打开游标
     OPEN cur;
    
    -- 开始循环
     loop_label: LOOP
         SET str_arr = '';
        -- 获取下一条数据
         FETCH cur INTO tid, url;
         SELECT tid,url;
        -- 判断是否已经遍历完所有数据
         IF done THEN
             LEAVE loop_label;
         END IF;
	-- 逗号个数
 			set num= CHAR_LENGTH(url)-CHAR_LENGTH(REPLACE(url,',',''));
 	WHILE (i <= num+1) DO
 	SET str = SUBSTRING_INDEX(url, ',', i);
 	SET url=REPLACE(url,CONCAT(str, ','),'');
 	SET str = SUBSTRING_INDEX(str, '?', 1);
 	SET str_arr = CONCAT(str_arr, str, ',');
 	SELECT str_arr;
 	SET i = i + 1;
 	END WHILE;
 			if (RIGHT(str_arr,1)=',') THEN
 					set str_arr=LEFT(str_arr,LENGTH(str_arr)-1);
 			END IF;
        -- 执行更新操作
         UPDATE zhcj_park_record SET img_url_list = str_arr WHERE id = tid;
     END LOOP loop_label;  
    -- 关闭游标
     CLOSE cur;
 		SELECT 1;
 END
 CALL updateUrl('2023-09-06 20:00:37');

你可能感兴趣的:(java,jvm,开发语言,mysql,数据库开发)