MySQL存储过程 游标循环的使用

本文详细介绍了SQL游标的应用场景,包括如何避免变量冲突、实现无重复数据插入及更新,通过实例演示了游标在数据遍历与批量操作中的高效应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游标的使用 

实例1:

这里有一个比较坑的地方,注意,变量的定义不要和你的select的列的键同名!不然,fetch into 会失败!

另外 :

如果没有则插入数据,如果有则更新的方法:

insert into `test` values (a,b) ON DUPLICATE KEY UPDATE `a`=c;


CREATE PROCEDURE `test`.`new_procedure` ()
BEGIN
-- 需要定义接收游标数据的变量 
  DECLARE a CHAR(16);
  -- 游标
  DECLARE cur CURSOR FOR SELECT i FROM test.t;
  -- 遍历数据结束标志
  DECLARE done INT DEFAULT FALSE;
  -- 将结束标志绑定到游标
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  -- 打开游标
  OPEN cur;
  
  -- 开始循环
  read_loop: LOOP
    -- 提取游标里的数据,这里只有一个,多个的话也一样;
    FETCH cur INTO a;
    -- 声明结束的时候
    IF done THEN
      LEAVE read_loop;
    END IF;
    -- 这里做你想做的循环的事件

    INSERT INTO test.t VALUES (a);

  END LOOP;
  -- 关闭游标
  CLOSE cur;

END

实例2

	BEGIN
       DECLARE Done INT DEFAULT 0;
    
      DECLARE CurrentLingQi INT;
     
      DECLARE ShizuName VARCHAR(30);
      /* 声明游标 */
      DECLARE rs CURSOR FOR SELECT NodeName, LingQi FROM socialrelation;
      /* 异常处理 */
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
     
      /* 打开游标 */
      OPEN rs;  
     
      /* 逐个取出当前记录LingQi字段的值,需要进行最大值的判断 */
      FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;     
      /* 遍历数据表 */
      REPEAT
            IF NOT Done THEN
               SET CurrentLingQi = CurrentLingQi + 60;
               /* 如果更新后灵气值大于允许的最大值,则就设置为最大值 */
               IF CurrentLingQi >= 1800 THEN
                  UPDATE socialrelation SET LingQi = 1800 WHERE NodeName = ShizuName;
               ELSE
               /* 否则,正常更新 */
                  UPDATE socialrelation SET LingQi = LingQi + 60 WHERE NodeName = ShizuName;
               END IF;
            END IF;
           
      FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;
 
      UNTIL Done END REPEAT;
     
      /* 关闭游标 */
      CLOSE rs;
 END



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值