博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MYSQL 循环嵌套(自定义函数,游标)
阅读量:6225 次
发布时间:2019-06-21

本文共 2389 字,大约阅读时间需要 7 分钟。

  hot3.png

针对ecshop,传入的商品ID提前查找出来保存在了临时表,商品ID必须是只有2个属性的商品;

CREATE FUNCTION in_attr_prod(goodsid INT)        RETURNS VARCHAR(32)BEGIN    DECLARE attr1,attr2 INT DEFAULT 0;  #商品属性ID    DECLARE a1_id,a2_id INT DEFAULT 0;  #商品属性值ID    DECLARE productid INT DEFAULT 0;        #货品表最大ID    DECLARE pro_sn VARCHAR(32);                 #货品编号    DECLARE do1, do2 INT DEFAULT FALSE; #记录下一个游标位置是否存在      DECLARE cur_a CURSOR FOR SELECT attr_id FROM nmsb_goods_attr WHERE goods_id = goodsid;   #取出商品属性的游标    DECLARE attr_1 CURSOR FOR SELECT goods_attr_id FROM nmsb_goods_attr WHERE goods_id = goodsid AND attr_id = attr1;   #取出第一个商品属性的所有值的游标    DECLARE attr_2 CURSOR FOR SELECT goods_attr_id FROM nmsb_goods_attr WHERE goods_id = goodsid AND attr_id = attr2;   #取出第二个商品属性的所有值的游标    DECLARE CONTINUE HANDLER FOR NOT FOUND SET do1 = TRUE;      /* 条件限制,查询出来商品的属性只有两个,不需要循环 */    OPEN cur_a;    FETCH cur_a INTO attr1;    FETCH cur_a INTO attr2;    CLOSE cur_a;      /* 打开第一个属性值游标 */    OPEN attr_1;              /* 第一个循环开始 */        read_loop:LOOP                          FETCH attr_1 INTO a1_id;    #取第一个属性的值              IF do1            THEN LEAVE read_loop;   #游标下一个位置无值了退出循环            END IF;                          /* 这里开始做循环内需要的操作 */            BEGIN                DECLARE CONTINUE HANDLER FOR NOT FOUND SET do2 = TRUE;  #申明变量保存第二个属性值游标的下一个位置                  /* 打开第二个属性值游标 */                OPEN attr_2;                    /* 第二个循环开始,内层嵌套循环 */                    read_loop1:LOOP                          FETCH attr_2 INTO a2_id;    #取第二个属性的值                          IF do2                        THEN LEAVE read_loop1;      #第二个属性值游标下一个位置无值了退出循环                        END IF;                                                      SELECT MAX(product_id) INTO productid FROM nmsb_products;   #取出货品表目前最大ID值                                                          SET productid = productid + 1;      #最大值加一作为下一条记录的ID                            SET pro_sn = CONCAT(goodsid, 'g_p', productid); #给货品编号赋值                            INSERT INTO nmsb_products VALUES (productid, goodsid, CONCAT(a1_id, '|', a2_id), pro_sn, 20);   #插入货品表                    END LOOP;                    /* 第二个循环结束 */                CLOSE attr_2;                /* 关闭第二个属性值游标 */            END;          END LOOP;        /* 第一个循环结束 */    CLOSE attr_1;    /* 关闭第一个属性值游标 */RETURN '';END

转载于:https://my.oschina.net/bokly/blog/176240

你可能感兴趣的文章
java路径Java开发中获得非Web项目的当前项目路径
查看>>
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>
Kali-linux Arpspoof工具
查看>>
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
查看>>
JavaScript 数据类型
查看>>
量子通信和大数据最有市场突破前景
查看>>
StringBuilder用法小结
查看>>
对‘初学者应该选择哪种编程语言’的回答——计算机达人成长之路(38)
查看>>
如何申请开通微信多客服功能
查看>>
Sr_C++_Engineer_(LBS_Engine@Global Map Dept.)
查看>>
非监督学习算法:异常检测
查看>>
jquery的checkbox,radio,select等方法总结
查看>>
Linux coredump
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>
Myeclipes快捷键
查看>>