mysql 存储过程 多店铺复制多规格(下划线拼接)、且每次id不一致处理记录

该博客内容涉及数据库存储过程的编写,用于在多店铺环境下复制多规格商品信息。通过获取商品ID和店铺ID,利用游标遍历原始数据,处理规格ID并进行更新或插入操作。主要步骤包括计算SKU_ID中的下划线数量,逐个提取规格ID,处理后生成新的SKU_ID,并批量提交到目标表。
摘要由CSDN通过智能技术生成
-- 该文件$shop$不可变动$
-- 多店铺复制多规格
-- wxappId 多店铺
-- goodsId 商品id


-- 思路。获取  sku_id  比如 为:: 7654_7698_7782_7788
-- 第一步 获取下划线总数
-- 第二步 更具总数 一次获取一个规格id
-- 第三步 处理规格id 信息
-- 第四部 比如有新的id。则CONCAT新的sku_id 8865_8866_8867_8868

DROP PROCEDURE IF EXISTS IndDealerShop;
DELIMITER $$
create PROCEDURE `$shop$`.IndDealerShop(wxappId int(11),in goodsId int(11))
BEGIN
-- 创建变量用来接收游标数据  变量的声明、游标的声明和HANDLER声明的顺序不能乱,必须是先声明变量,再申明游标,最后声明HANDLER
-- 变量的定义不要和你的select的列的键同名!否则fetch into 会失败
 DECLARE v_goods_id INT(11) DEFAULT 0;

 DECLARE v_goods_sku_id INT(11) DEFAULT 0;
 DECLARE v_spec_sku_id VARCHAR(255) DEFAULT '';


 DECLARE v_sku_count INT(11) DEFAULT 0;
 DECLARE v_count INT(11) DEFAULT 0;
 
 DECLARE v_i int(2) DEFAULT 1;
 DECLARE v_save_spec_sku_id VARCHAR(255) DEFAULT '';
 DECLARE v_spe_id int(11) DEFAULT 0;
 
 DECLARE createTime INT(11) DEFAULT unix_timestamp(now()); -- 时间 11位字符串
    
 DECLARE done INT DEFAULT 0;
 
 
  
    DECLARE rs_cursor CURSOR FOR
        SELECT `hugoshop_goods_sku`.`goods_sku_id`,`hugoshop_goods_sku`.`spec_sku_id` FROM `$shop$`.`hugoshop_goods_sku` where `goods_id`=goodsId  and `wxapp_id`=wxappId;
        -- 指定游标循环结束时的返回值 ,在游标循环到最后会将 done 设置为 1
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;


 -- 打开游标
 OPEN rs_cursor;
 -- 关闭事务自动提交,这里只是临时关闭,存储过程执行完成后autocommit还是原来系统的状态
 SET autocommit=0;
 -- 开始循环
 read_loop: LOOP
     -- 提取游标里的数据到上面声明的变量中
     FETCH rs_cursor INTO v_goods_sku_id,v_spec_sku_id;
      -- 声明何时结束循环
     IF done=1 THEN
         LEAVE read_loop;
     END IF;


        -- UPDATE `$shop$`.`hugoshop_goods` set `is_ind_dealer`=isindDealer,`dealer_money_type`=dealerMoneyType,`first_money`=firstMoney,`second_money`=secondMoney,`third_money`=thirdMoney,`update_time`=createTime where `hugoshop_goods`.`goods_id`=v_goods_id;
        

 
        SELECT CHAR_LENGTH(v_spec_sku_id)-CHAR_LENGTH(REPLACE(v_spec_sku_id,'_','')) + 1 INTO v_sku_count;
        
        set v_i= 1;
        SELECT v_sku_count;
        
        WHILE v_i<=v_sku_count DO
            SELECT v_i;
            set v_spe_id = 0;
            SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(v_spec_sku_id,'_',v_i),'_',-1) INTO v_spe_id;
            
            
            if v_i=1 THEN
                set v_save_spec_sku_id = CONCAT("1-",v_spe_id);
            ELSE
                set v_save_spec_sku_id = CONCAT(v_save_spec_sku_id,"_",v_spe_id);
            END IF;
            
            set v_i = v_i+1;
        
        END WHILE;
        
        
        SELECT v_save_spec_sku_id;
    
       -- 循环时的事件
         -- 向表B插入数据,表B和表A结构一致,为提升插入效率每10000条commit一次
         SET v_count = v_count + 1;
         IF MOD(v_count,10000)=0  THEN
             COMMIT;
             SET v_count = 0;
        END IF;
 -- 关闭循环
 END LOOP read_loop;
 -- 导入数据不是10000整数倍时需要在loop结束后在提交一次
 COMMIT;
 -- 关闭游标
CLOSE rs_cursor;

END$$

call IndDealerShop(10005,19090);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值