mysql游标使用

今天在工作中遇到要需要循环把一个表中的数据添加到另外一个表中,并且需要比较是否有重复数据,如果有重复数据则进行更新,否则进行插入。

琢磨着需要用游标来解决。由于之前一直觉得游标是个复杂的东西,所以,一直不甚了解。今天了解了一下,发现,嘿,很简单啊。


以前自己碰到这样的总是用临时表来解决,现在发现,其实很多地方用游标会简单很多。

游标是用于在存储过程中迭代SELECT查询出的数据

看个例子基本就差不多会了

将代码附上方便以后查找

DELIMITER $$

USE `tistone`$$

DROP PROCEDURE IF EXISTS `USP_Ass_AddLinkStatus`$$

CREATE DEFINER=`webdev`@`%` PROCEDURE `USP_Ass_AddLinkStatus`(
$startTime DATETIME
)
BEGIN
DECLARE Done INT DEFAULT 0;
DECLARE v_linkid INT;
DECLARE v_linkusage FLOAT;
DECLARE v_seriousCnt INT;
DECLARE v_mdeiumCnt INT;
DECLARE v_commonCnt INT;

/*游标声明*/
DECLARE cur1 CURSOR FOR
SELECT a.linkid,SUM(a.bytein+a.byteout)/(30*1000*1000) AS linkusage,b.seriousCnt,b.mdeiumCnt,b.commonCnt FROM `tbl_ori_networkinfo` a
LEFT JOIN 
(SELECT linkid,SUM(IF(alarmlevel=3,1,0)) AS seriousCnt,
	SUM(IF(alarmlevel=2,1,0)) AS mdeiumCnt,
	SUM(IF(alarmlevel=1,1,0)) AS commonCnt
	FROM `tbl_ori_trafficalarm_bak` 
	WHERE UNIX_TIMESTAMP(RecordTime) >= UNIX_TIMESTAMP(DATE($startTime))
	AND UNIX_TIMESTAMP(RecordTime) < UNIX_TIMESTAMP(DATE($startTime)) + 86400
	GROUP BY linkid) b 
ON a.linkid = b.linkid
	WHERE a.RecordTime BETWEEN ($startTime - INTERVAL 30 SECOND) AND $startTime 
	GROUP BY a.linkid;
	

/*异常处理*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cur1;

/*开始循环*/
read_loop:LOOP
  FETCH cur1 INTO v_linkid,v_linkusage,v_seriousCnt,v_mdeiumCnt,v_commonCnt;
  IF done THEN
	LEAVE read_loop;
  END IF;
  
  INSERT INTO tbl_ass_linkstatus(linkID,linkStatus,linkUsage,seriousCnt,mdeiumCnt,commonCnt,createTime,modifyTime)
  VALUES(v_linkid,1,v_linkusage,v_seriousCnt,v_mdeiumCnt,v_commonCnt,NOW(),NOW())
  ON DUPLICATE KEY UPDATE 
  linkStatus=1,linkUsage=v_linkusage,seriousCnt=v_seriousCnt,mdeiumCnt=v_mdeiumCnt,commonCnt=v_commonCnt,modifyTime=NOW();
END LOOP;

/*关闭游标*/
CLOSE cur1;
END$$

DELIMITER ;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值