使用游标将数据更新,陷入死循环,求解释

coFinder 2013-08-05 06:02:43
数据迁移
要将老的数据库里面的数据导入到新的数据库。
数据表不一样,只是有些字段一样。
我要
将这个库里面的user 表的数据导入到
NEW_DB的`USER_ACCOUNT表,下面这样居然陷入了循环,运行了十几分钟
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `pr_test3`()
BEGIN
DECLARE p_username VARCHAR(20);
DECLARE p_email VARCHAR(20) ;
DECLARE Done INT;
#得到游标,选择老的表里面的username和email
DECLARE rs CURSOR FOR SELECT username,email FROM user LIMIT 100;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;

OPEN rs;
FETCH NEXT FROM rs INTO p_username,p_email;
#开始遍历
REPEAT
IF NOT Done THEN
#执行需要的操作
SELECT @p_username;
#插入到新的库的表
INSERT INTO NEW_DB.`USER_ACCOUNT` (USERID,`PASSWORD`,`EMAIL`,`REGTIME`,`MODTIME`) VALUES (p_username,,'123456',p_email,NOW(),NOW());
#下一条
FETCH NEXT FROM rs INTO p_username,p_email;
END IF;
UNTIL Done END REPEAT;
CLOSE rs;
END$$
DELIMITER ;
...全文
229 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
知道就是你 2013-08-08
  • 打赏
  • 举报
回复
你是直接执行我的写的脚本吗?如果是,方便的话共享一下你的数据库表结构 ,我试试看 ;如果不是请直接执行我的脚本,之前我一次修改10多万数据都没有问题。
coFinder 2013-08-07
  • 打赏
  • 举报
回复
最后干脆用insert into DB1.USER select XXX from DB2.user 来解决了
coFinder 2013-08-07
  • 打赏
  • 举报
回复
引用 4 楼 ecshop528 的回复:
DECLARE Done INT default 0
这个也做了 你是发开ecshop的吗
coFinder 2013-08-07
  • 打赏
  • 举报
回复
引用 3 楼 thomasks 的回复:
找个像dbForge工具调试看看吧。不过有一个地方看着都别扭: DECLARE rs CURSOR FOR SELECT username,email FROM user LIMIT 100; 获取的数据是期望的吗?只从代码上看不出为什么出现死循环。
我这样做更本就没有得到数据 select @p_username 都是null
coFinder 2013-08-07
  • 打赏
  • 举报
回复
引用 9 楼 JenMinZhang 的回复:
另外补充一点 “VALUES (p_username,,'123456',p_email,NOW(),NOW());”多了一个分号 ,就是 "p_username"与 “'123456'” 之间。
虽然得到的了结果 但是还是会出现 Error Code : 1329 No data - zero rows fetched, selected, or processed 已经有 DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done = 1; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
知道就是你 2013-08-07
  • 打赏
  • 举报
回复
另外补充一点 “VALUES (p_username,,'123456',p_email,NOW(),NOW());”多了一个分号 ,就是 "p_username"与 “'123456'” 之间。
知道就是你 2013-08-07
  • 打赏
  • 举报
回复
你的存储过程结构好像不太标准 ,循环取值时,只需要出现一次(是否存在下一条记录判断之前)即可,我整理后的脚本如下 :
DELIMITER $$ 
 CREATE PROCEDURE `pr_test3`()  
BEGIN
DECLARE done1 INT DEFAULT 0;
DECLARE p_username VARCHAR(20);  
 DECLARE p_email VARCHAR(20) ;   
DECLARE cur1 cursor for  SELECT username,email FROM  user LIMIT 100;   
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = 1;
open cur1;
repeat
FETCH cur1 INTO p_username,p_email;   #开始遍历  
if not done1 then
  INSERT INTO NEW_DB.`USER_ACCOUNT` (USERID,`PASSWORD`,`EMAIL`,`REGTIME`,`MODTIME`) VALUES (p_username,,'123456',p_email,NOW(),NOW()); 
end IF;
until done1 end
REPEAT;
  CLOSE cur1;
commit;
END$$ DELIMITER ; 
ecshop528 2013-08-06
  • 打赏
  • 举报
回复
DECLARE Done INT default 0
thomasLand 2013-08-06
  • 打赏
  • 举报
回复
找个像dbForge工具调试看看吧。不过有一个地方看着都别扭: DECLARE rs CURSOR FOR SELECT username,email FROM user LIMIT 100; 获取的数据是期望的吗?只从代码上看不出为什么出现死循环。
coFinder 2013-08-06
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
改成这个再试 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
加入这个还是死循环,我干脆把 IF NOT Done THEN END; 这两条语句去掉了
ACMAIN_CHM 2013-08-05
  • 打赏
  • 举报
回复
改成这个再试 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

56,677

社区成员

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

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