mysql存储过程游标循环用哪种比较好

 我来答
鈾氶瓏鈾
2016-11-21 · 知道合伙人软件行家
鈾氶瓏鈾
知道合伙人软件行家
采纳数:718 获赞数:1337

向TA提问 私信TA
展开全部
如果没有则插入数据,如果有则更新的方法:
insert into `test` values (a,b) ON DUPLICATE KEY UPDATE `a`=c;

[sql] view plain copy
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

[sql] view plain copy
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
今至电子科技有限公司
2024-08-23 广告
数据库备份是确保数据安全与业务连续性的关键环节。我们上海今至电子科技有限公司高度重视数据保护,定期执行全面的数据库备份策略。这包括使用先进工具和技术,对关键业务数据进行自动化备份,并存储在安全可靠的外部存储介质或云端。通过定期验证备份的完整... 点击进入详情页
本回答由今至电子科技有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式