动态执行sql,游标的使用方法

----------------------传值-------------------------------------

IN _prod_name varchar(50), IN _class_id int, IN _attr_sql varchar(1000)

 

_attr_sql  传值 如下示例:

SELECT 1 AS attr_id,'32开' as attr_value,30 as prod_price UNION SELECT 2 AS attr_id,'64开' as attr_value,40 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;

    SET @pid=0;
    INSERT INTO prod_main(prod_name,prod_classid) VALUES(_prod_name,_class_id);#商品主表插入数据
    SET @pid=LAST_INSERT_ID();#获取上一条语句执行返回的主键ID

   #生成临时表 将sql语句中的数据插入其中

    DROP TEMPORARY TABLE IF EXISTS temp_a;

-------------------------动态执行SQL语句-----------BEGIN---------------------------------------------
    SET@ss=CONCAT('CREATE TEMPORARY TABLE temp_a as SELECT ? as prod_id,a.* FROM (',_attr_sql,' ) a');
    PREPARE pname FROM @ss;

   #select 中的? 替换掉 若有多个? 如:? as prod_id1,? as prod_id2 则语句为EXECUTE pname USING @pid,@pid2;
    EXECUTE pname USING @pid;
    DEALLOCATE PREPARE pname;

-------------------------动态执行SQL语句-----------END---------------------------------------------

-------------------------游标-----------BEGIN---------------------------------------------
    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 @getid = LAST_INSERT_ID();
        insert into prod_price(prod_id,prod_attr_id,prod_price) values(_prod_id,@getid,_prod_price);
        FETCH cur INTO _prod_id,_attr_id,_attr_value,_prod_price;
    END WHILE;
    CLOSE cur;

    -------------------------游标-----------END---------------------------------------------
    DROP TEMPORARY TABLE temp_a;#删除临时表 释放占用资源
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值