概述
功能需求:A、B两张表,A是主表,B是备用表。B表要从A表拉取部分字段(订单号,部分状态等),如果B表存在订单,则更新其他字段,否则就添加。
思路:如果使用开发脚本实现,效率无法满足,打算使用游标循环实现。
工具:navicat
使用LOOP:
CREATE DEFINER=`root`@`localhost` PROCEDURE `copy_order`()
BEGIN
DECLARE os VARCHAR(64);
DECLARE coors VARCHAR(255);
DECLARE done INT DEFAULT FALSE; -- 自定义控制游标循环变量,默认false
DECLARE stop INT DEFAULT 0;
DECLARE cur CURSOR FOR (SELECT order_code,receiver_coordinate FROM order
limit 100 ;
/*这把 游标 异常后 捕捉并设置 循环使用 变量 stop 为 null 跳出循环。*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE;
OPEN cur;
-- 打开游标
cur_loop: LOOP
FETCH cur INTO os,coors;
IF done THEN
LEAVE cur_loop;
END IF;
--
order_copy表要设置个UNIQUE KEY(order_code),如果存在订单就更新。
INSERT INTO order_copy (order_code,receiver_coordinate) VALUES(os,coors) ON DUPLICATE KEY UPDATE receiver_coordinate = coors;
COMMIT;
END LOOP cur_loop;
CLOSE cur; -- 游标向下走一步
END
使用while:
-- 使用while 循环更新字段
DELIMITER $$
DROP PROCEDURE IF EXISTS copy_order$$
CREATE PROCEDURE copy_order()
BEGIN
DECLARE os VARCHAR(20);
DECLARE coors VARCHAR(255);
DECLARE NO_MORE_RECORD INT DEFAULT 0;
-- 缓存数据到游标
DECLARE trade_cur CURSOR FOR (SELECT order_code,receiver_coordinate FROM order
limit 100 ;
-- 针对NOT FOUND的条件,当没有记录时赋值为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET NO_MORE_RECORD = 1;
OPEN trade_cur; -- 打开游标
WHILE NO_MORE_RECORD != 1 DO
FETCH trade_cur INTO os, coors ;
# 如果不加判断,会多循环一次。最后一次读取游标时,NO_MORE_RECORD是1,但是进入循环之前是0,故可以进入循环,会多循环一次;
IF NO_MORE_RECORD != 1 THEN
-- 插入、更新操作
INSERT INTO order_copy (order_code,receiver_coordinate) VALUES(os,coors) ON DUPLICATE KEY UPDATE receiver_coordinate = coors;
END IF ;
END WHILE;
CLOSE trade_cur; -- 关闭游标
END$$
DELIMITER;
使用REPEAT:
整体的思路都是差不多的。
DELIMITER $$
DROP PROCEDURE IF EXISTS Repeat_P$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Repeat_P`()
BEGIN
DECLARE os VARCHAR(64);
DECLARE os VARCHAR(20);
DECLARE coors VARCHAR(255);
DECLARE done INT DEFAULT FALSE; -- 自定义控制游标循环变量,默认false
DECLARE stop INT DEFAULT 0;
DECLARE cur CURSOR FOR (SELECT order_code,receiver_coordinate FROM order
limit 100 ;
/*这把 游标 异常后 捕捉并设置 循环使用 变量 stop 为 null 跳出循环。*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
REPEAT
FETCH cur INTO os;
INSERT INTO order_copy (order_code,receiver_coordinate) VALUES(os,coors) ON DUPLICATE KEY UPDATE receiver_coordinate = coors;
UNTIL done END REPEAT;
CLOSE cur;
END$$
DELIMITER;
以上三种均可以使用,因为没有找到for循环(查了百度说Mysql暂不支持Mysql),所以就没记录(以上仅供参考!)
最后
以上就是繁荣白猫为你收集整理的navicat 游标使用(循环语句)的全部内容,希望文章能够帮你解决navicat 游标使用(循环语句)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复