首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL存储过程循环问题

问MySQL存储过程循环问题
EN

Stack Overflow用户
提问于 2011-08-13 00:13:34
回答 1查看 344关注 0票数 1

因此,我有一个名为open_loop的游标,它执行查询,现在我想遍历它,检查它持有的值是否存在于数据库中,如果存在,我需要更新该条目,如果不存在,则插入它。

问题是,我退出循环的方式是等待状态02000,即:Success, but no rows found。不幸的是,如果用户表中没有条目,也会发生这种情况,因此循环会立即被切断!如何才能使它不触发该事件,但仍然在loop_cur耗尽条目时触发,或者找到退出循环的不同方法?

我的代码如下:

代码语言:javascript
复制
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN loop_cur;

REPEAT

    FETCH  loop_cur
    INTO   user_id, user_info

    SELECT Id INTO user_id  FROM users WHERE Id = user_id;

    IF user_id IS NOT NULL THEN

      UPDATE users
      SET info = user_info
      WHERE Id = user_id;

    ELSE
      INSERT INTO users (user_info);
    END IF;
  UNTIL done END REPEAT;
CLOSE loop_cur;

请注意,这被简化了,因为我实际上插入和获取了更多的值,并且loop_cur的查询非常复杂,所以我没有包括它,但它确实可以工作。

最后,我不能在重复键更新时使用INSERT,我检查的并不是一个真正的user_id,它是一个不同的列,为了简单起见我使用了user_id。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-13 01:50:47

在循环中使用设置为true的布尔变量。

为简单起见,删除了不相关的代码:

代码语言:javascript
复制
DECLARE found boolean default false;

...

REPEAT

    FETCH  loop_cur ...

    SET found = true;

    ...

UNTIL done END REPEAT;

-- found is now true if you got some rows, false otherwise
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7043097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档