MySQL存储过程循环问题

时间:2011-08-12 16:13:34

标签: mysql stored-procedures

所以我有一个名为open_loop的游标进行查询,现在我想循环遍历它,检查数据库中是否存在它所存在的值,如果是,我需要更新该条目,如果没有插入它。

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

我的代码在这里:

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 ON DUPLICATE KEY UPDATE,我正在检查的不是user_id,它是一个不同的列,为简单起见我使用了user_id。

1 个答案:

答案 0 :(得分:0)

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

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

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