在存储过程中填充表,mysql

时间:2014-10-13 22:12:09

标签: mysql loops stored-procedures

任何人都可以解释为什么这不会循环该函数并填充临时表?我已经尝试了很多东西,充其量只能获得填充的第一个值。我正在尝试获取一个值和一个“:”分隔的字符串(在此过程中查询)来填充表,以便我可以在更大的查询中引用它。函数SPLIT_STR本身很好用,但我似乎无法增加值“a”,以便它为每个字段的每个值分隔所有值。

BEGIN

 DECLARE platform_val VARCHAR(255);
 DECLARE productName_val VARCHAR(255);
 DECLARE no_more_rows BOOLEAN;
 DECLARE num_rows INT DEFAULT 0;
 DECLARE loop_cntr INT DEFAULT 0;
 DECLARE str VARCHAR(255);
 DECLARE a INT DEFAULT 1;


    DECLARE cur1 CURSOR FOR SELECT
    ProductName,
    ProductPlatforms
    FROM Feed
    limit 10;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;

 OPEN cur1;

 select FOUND_ROWS() into num_rows;

  the_loop: LOOP

FETCH  cur1
INTO   productName_val,
       platform_val;

SET str = platform_val;
WHILE a< num_rows DO
SET str=SPLIT_STR(str,":",a);
    insert into temp values (productName_val, str);
    SET a=a+1;
END WHILE;



END LOOP the_loop;

END

1 个答案:

答案 0 :(得分:0)

这是我提出的想法

CREATE PROCEDURE `col2lines`()
BEGIN
    declare v_platform,v_productName,v_platformAll varchar(255) default null;
    declare v_finished int default 0;

    declare curs cursor for select ProductName,ProductPlatforms from Feed limit 10;
    declare continue handler for not found set v_finished = 1;

    drop temporary table if exists temp_table;
    create temporary table temp_table (
        productName varchar(255),
        platform varchar(255)
    );

    open curs;

    parent: LOOP
        fetch curs into v_productName, v_platformAll;

        if (v_finished = 1) then LEAVE parent; end if;

        child: LOOP
            set v_platform = substring_index(v_platformAll, '::', 1);
            set @strlen = char_length(v_platform);
            if (@strlen > 0) then
                insert into temp_table values (v_productName, v_platform);
                set v_platformAll = substr(v_platformAll, @strlen + 3);
                iterate child;
            end if;
            LEAVE child;
        END LOOP child;

        iterate parent;
    END LOOP parent;

    close curs;

    select * from temp_table;
END
相关问题