MySQL存储过程,和游标相关,急

Cain 2008-09-17 11:56:00
BEGIN

DECLARE _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这样的结果,是不是我对循环的理解错了?
...全文
217 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWWWA 2008-09-18
  • 打赏
  • 举报
回复
怎么解决的?共享一下
Cain 2008-09-18
  • 打赏
  • 举报
回复
SQLYOG还没直接在shell下调试方便……
WWWWA 2008-09-18
  • 打赏
  • 举报
回复
用SQLYOG试试
WWWWA 2008-09-17
  • 打赏
  • 举报
回复
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)
WWWWA 2008-09-17
  • 打赏
  • 举报
回复
应该是REPEAT UNTIL的问题
懒得去死 2008-09-17
  • 打赏
  • 举报
回复
DECLARE foo VARCHAR(200) DEFAULT '';
Cain 2008-09-17
  • 打赏
  • 举报
回复
顺便问一下,有没有调试mysql存储过程的工具推荐?
现在调试起来真的好麻烦……
Cain 2008-09-17
  • 打赏
  • 举报
回复
跟踪了下变量_id,原来是对定义处理程序时的理解出来问题。
WWWWA 2008-09-17
  • 打赏
  • 举报
回复
呵呵,是,现在没有 MYSQL,无法测试,明日测试一下
Cain 2008-09-17
  • 打赏
  • 举报
回复
但是不得不承认的是,用count做的话效率没有之前的高啊
WWWWA 2008-09-17
  • 打赏
  • 举报
回复
原来的代码类似于捕获错误,这种代码感觉是比较正宗的数据库操作方法,呵呵,个人观点
Cain 2008-09-17
  • 打赏
  • 举报
回复
那就是完全不一样的思路了
每次还得重新SELECT一次
WWWWA 2008-09-17
  • 打赏
  • 举报
回复
换一下思路,
用SELECT @ff=COUNT(*)FROM cate WHERE cateId < 2 ORDER BY cateId
取得记录数,用WHILE WEND循环试试。
Cain 2008-09-17
  • 打赏
  • 举报
回复
我用while来做了一次也不行……
WWWWA 2008-09-17
  • 打赏
  • 举报
回复
用WHILE v1 > 0 DO
...
SET v1 = v1 - 1;
END WHILE;
替换REPEAT试试
Cain 2008-09-17
  • 打赏
  • 举报
回复
我也认为是repeat的问题,但是总不对,郁闷

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧