您的位置:首页 > 数据库 > MySQL

MYSQL 循环嵌套(自定义函数,游标)

2016-09-09 15:23 211 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: