MySql 存储过程使用游标循环插入数据问题

gonwgenjun181 2013-08-15 05:09:42
DELIMITER $$
CREATE PROCEDURE wheelSta()
BEGIN
DECLARE inexp,income,taks,c_count,t_taks, e,c INT;
DECLARE b INT DEFAULT 0; /*是否达到记录的末尾控制变量*/
DECLARE day_1,day_2 DATE;
DECLARE cur_1 CURSOR FOR SELECT COUNT,creat_time,taks FROM `cn_members_log` WHERE taks = 12 AND DATE(creat_time) = DATE_SUB(CURDATE(),INTERVAL 1 DAY);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
OPEN cur_1;
FETCH cur_1 INTO c_count, day_1, t_taks; /*获取第一条记录*/
WHILE b=0 DO
INSERT INTO cn_members_sta(inexp,TIME,taks) VALUES(c_count, day_1, t_taks);
FETCH cur_1 INTO c_count, day_1, t_taks; /*取下一条记录*/
END WHILE;
CLOSE cur_1;
END$$
DELIMITER ;

通过SELECT COUNT,creat_time,taks FROM `cn_members_log` WHERE taks = 12 AND DATE(creat_time) = DATE_SUB(CURDATE(),INTERVAL 1 DAY);这句可以查出4条记录,但是执行后在cn_members_sta表中却一条数据都没有,求解~
...全文
426 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gonwgenjun181 2013-08-15
  • 打赏
  • 举报
回复
引用 6 楼 JenMinZhang 的回复:
和 where 条件无关,你可试试 我的脚本 ,打印每次从游标中取到的数据使用 select c_count, day_1, t_taks 来打印? 建议使用 dbForge Studio for MySQL 工具进行调试一下!
试过了。。。不行。。。哎
知道就是你 2013-08-15
  • 打赏
  • 举报
回复
和 where 条件无关,你可试试 我的脚本 ,打印每次从游标中取到的数据使用 select c_count, day_1, t_taks 来打印? 建议使用 dbForge Studio for MySQL 工具进行调试一下!
gonwgenjun181 2013-08-15
  • 打赏
  • 举报
回复
引用 4 楼 JenMinZhang 的回复:
你说自动提交 ? 你加上试试 ! 你检查一下 看看 自动提交 是否开启 ?
还是不行。。 DECLARE cur_1 CURSOR FOR SELECT COUNT,creat_time,taks FROM `cn_members_log` WHERE taks = 12 AND DATE(creat_time) = DATE_SUB(CURDATE(),INTERVAL 1 DAY); 是不是定义游标的时候 不能带where后面的啊 去掉 WHERE taks = 12 AND DATE(creat_time) = DATE_SUB(CURDATE(),INTERVAL 1 DAY); 就可以正常插入数据了 ,但是我希望插入的数据符合where后面的条件啊~
知道就是你 2013-08-15
  • 打赏
  • 举报
回复
你说自动提交 ? 你加上试试 ! 你检查一下 看看 自动提交 是否开启 ?
知道就是你 2013-08-15
  • 打赏
  • 举报
回复
感觉使用repeat遍历游标比较好,WHILE 执行单纯批量插入比较方便 ,建议修改成这样,脚本如下:


CREATE PROCEDURE wheelSta()
BEGIN
    DECLARE inexp,income,taks,c_count,t_taks, e,c INT;
    DECLARE b INT DEFAULT 0;    /*是否达到记录的末尾控制变量*/
    DECLARE day_1,day_2 DATE;   
    DECLARE cur_1 CURSOR FOR SELECT COUNT,creat_time,taks FROM `cn_members_log` WHERE taks = 12 AND DATE(creat_time) = DATE_SUB(CURDATE(),INTERVAL 1 DAY);
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
    OPEN cur_1;
    FETCH cur_1 INTO c_count, day_1, t_taks; /*获取第一条记录*/
repeat
FETCH cur1 INTO ps_lsjlid, ps_ywid, ps_fwsj, ps_fwjssj, ps_ckid;
if not b then
 INSERT INTO cn_members_sta(inexp,TIME,taks)  VALUES(c_count, day_1, t_taks);
 until b end
REPEAT;
  CLOSE cur1;
commit;
END$$
gonwgenjun181 2013-08-15
  • 打赏
  • 举报
回复
引用 1 楼 JenMinZhang 的回复:
好像少一个 commit 关键 ! 在 循环结束后,加上试试看!
mysql不需要commit的吧
知道就是你 2013-08-15
  • 打赏
  • 举报
回复
好像少一个 commit 关键 ! 在 循环结束后,加上试试看!

56,687

社区成员

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

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