kingschan1204 / blog

个人技术blog
https://github.com/kingschan1204/blog/issues
1 stars 1 forks source link

利用mysql游标循环修改数据 #25

Open kingschan1204 opened 5 years ago

kingschan1204 commented 5 years ago

在开发中遇到一个这样的场景,就是得把一张表里的某个字段,在原有的基础上格式化成:第一位+空格+剩下的字符。解决思路:我的想法是直接用sql脚本写一个游标,在游标里循环取到数据,然后再用update语句一一修改。

脚本如下


drop procedure if exists baolvAppendSpace;
CREATE   PROCEDURE baolvAppendSpace()
BEGIN  
DECLARE total INT; 
DECLARE pid VARCHAR(35); 
##首字母
DECLARE first_barcode VARCHAR(1); 
##第二段
DECLARE second_barcode VARCHAR(35);
##创建接收游标数据的变量  
DECLARE barcode VARCHAR(35); 
#创建结束标志变量  
DECLARE done INT DEFAULT false;  
#创建游标  
DECLARE cur CURSOR FOR SELECT   PACKAGE_ID, PACKAGE_BAR_CODE,LEFT(package_bar_code,1) a,SUBSTR(package_bar_code,2) b FROM   lms_wms_goods_package t WHERE   t.COMPANY_ID = '2c94953262fc18e70162fc2e58480006' AND t.`STATUS` <> 'Gsouted' AND t.PACKAGE_BAR_CODE REGEXP '^[[:alnum:]]{2}';
#指定游标循环结束时的返回值  
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true; 
SET total = 0;   
OPEN cur;  
WHILE(NOT done) 
DO  
    FETCH cur INTO pid, barcode,first_barcode,second_barcode;  
            SET total = total + 1;  
            ##SELECT CONCAT(first_barcode,' ',second_barcode);
            UPDATE lms_wms_goods_package set  package_bar_code=CONCAT(first_barcode,' ',second_barcode) where PACKAGE_ID=pid;
END WHILE;  

CLOSE cur;  
SELECT CONCAT('修改行数:',total);  

END

call baolvAppendSpace()