-- 该文件$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);
mysql 存储过程 多店铺复制多规格(下划线拼接)、且每次id不一致处理记录
最新推荐文章于 2025-03-10 11:24:51 发布