BEGINDECLARE _id, flag INT;
DECLARE foo VARCHAR(200) DEFAULT '|';DECLARE cur_1 CURSOR FOR SELECT cateId FROM cate WHERE cateId < 2 ORDER BY cateId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;OPEN cur_1;
REPEAT
FETCH cur_1 INTO _id;
SET foo = CONCAT(foo, '|', _id);
UNTIL flag
END REPEAT;
CLOSE cur_1;SELECT foo;END运行结果:
||1|1问题:
为什么输出会有2个1,理论上来说应该是||1这样的结果,是不是我对循环的理解错了?

解决方案 »

  1.   

    DECLARE foo VARCHAR(200) DEFAULT ''; 
      

  2.   

    MYSQL HELP:
    mysql> CREATE PROCEDURE dorepeat(p1 INT)
        -> BEGIN
        ->   SET @x = 0;
        ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
        -> END
        -> //
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> CALL dorepeat(1000)//
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> SELECT @x//
    +------+
    | @x   |
    +------+
    | 1001 |
    +------+
    1 row in set (0.00 sec)
      

  3.   

    我也认为是repeat的问题,但是总不对,郁闷
      

  4.   

    用WHILE v1 > 0 DO
        ...
        SET v1 = v1 - 1;
      END WHILE;
    替换REPEAT试试
      

  5.   

    我用while来做了一次也不行……
      

  6.   

    换一下思路,
    用SELECT @ff=COUNT(*)FROM cate WHERE cateId < 2 ORDER BY cateId
    取得记录数,用WHILE WEND循环试试。
      

  7.   

    那就是完全不一样的思路了
    每次还得重新SELECT一次
      

  8.   

    但是不得不承认的是,用count做的话效率没有之前的高啊
      

  9.   

    呵呵,是,现在没有 MYSQL,无法测试,明日测试一下
      

  10.   

    顺便问一下,有没有调试mysql存储过程的工具推荐?
    现在调试起来真的好麻烦……
      

  11.   

    SQLYOG还没直接在shell下调试方便……