需求

不同的商品属性规格具有不同的价格,譬如《Java从入门到跳楼》的开本属性。

分为 “16开” 和 “32开” (既书本大小不一样)。价格就不同了。分为¥30 和 ¥35


临时表: TEMPORARY TABLE

DROP TEMPORARY TABLE IF EXISTS temp_a;
create TEMPORARY TABLE temp_a AS SELECT 3 AS id;
SELECT * FROM temp_a;


添加属性价格表prod_price

-- ----------------------------
-- Table structure for `prod_price`
-- ----------------------------
DROP TABLE IF EXISTS `prod_price`;
CREATE TABLE `prod_price` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `prod_id` int(11) NOT NULL,
  `prod_attr_id` int(11) NOT NULL DEFAULT '0',
  `prod_price` decimal(5,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

了解这段sql的作用

select 1 as attr_id, '中国出版社' as attr_value, 0 as prod_price union
select 3 as attr_id, '16开' as attr_value, 30 as prod_price union
select 3 as attr_id, '32开' as attr_value, 35 as prod_price


添加存储过程

BEGIN
  # 该定义必须放在顶部
  DECLARE _isend INT DEFAULT 0;
  DECLARE _prod_id INT;  
  DECLARE _attr_id INT;
  DECLARE _attr_value VARCHAR(20);
  DECLARE _prod_price DECIMAL(5, 2);
  DECLARE _cur CURSOR FOR SELECT prod_id, attr_id, attr_value, prod_price FROM temp_a;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET _isend = 1;   

  # 插入主表,获取商品id
  INSERT INTO prod_main(prod_name, prod_classid) VALUES (_prod_name, _prod_classid);
  SET @pid = LAST_INSERT_ID();

  # 创建临时表 + 动态执行sql
  DROP TEMPORARY TABLE IF EXISTS temp_a;
  SET @ss = CONCAT('CREATE TEMPORARY TABLE temp_a AS SELECT ? AS prod_id, a.* FROM (', _attr_sql ,' ) AS a');
  PREPARE pname FROM @ss;
  EXECUTE pname USING @pid;
  DEALLOCATE PREPARE pname;

  # 游标
  OPEN _cur;
      FETCH _cur INTO _prod_id, _attr_id, _attr_value, _prod_price; 
      WHILE _isend != 1 DO
          INSERT INTO prod_attr(prod_id, attr_id, attr_value) VALUES (_prod_id, _attr_id, _attr_value);
          SET @prod_attr_id = LAST_INSERT_ID(); 
          INSERT INTO prod_price(prod_id, prod_attr_id, prod_price) VALUES (_prod_id, @prod_attr_id, _prod_price);
          FETCH _cur INTO _prod_id, _attr_id, _attr_value, _prod_price; 
      END WHILE;
  CLOSE _cur;

  # 删除临时表
  DROP TEMPORARY TABLE temp_a; 
END

调用示例:

call sp_shop_fuck('abc书', 1, '
    select 1 as attr_id, \'中国出版社\' as attr_value, 0 as prod_price union
    select 3 as attr_id, \'16开\' as attr_value, 30 as prod_price union
    select 3 as attr_id, \'32开\' as attr_value, 35 as prod_price
')

results matching ""

    No results matching ""