所以我有一个名为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。
答案 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