功能描述
static_ipqam_usage表中qam_id对应记录增加到四十条记录,要求增加的记录中prog_no、port_no字段信息顺序递增。
一、将static_ipqam_usage表中不重复的qam_id暂存到t_ipqam上。
二、借助游标操作t_ipqam表,循环插入记录。
-- ---------------------------- -- Procedure structure for `SP_IPQAM_INSERT_DETAIL` -- ---------------------------- DROP PROCEDURE IF EXISTS `SP_IPQAM_INSERT_DETAIL`; DELIMITER ;; CREATE DEFINER=`skip-grants user`@`skip-grants host` PROCEDURE `SP_IPQAM_INSERT_DETAIL`() BEGIN # 遍历停止标识 DECLARE done INT DEFAULT FALSE; # qamId DECLARE v_id INT; #qamId对应的记录总数 DECLARE v_count INT DEFAULT 0; #需要插入的记录数 DECLARE v_internal INT DEFAULT 0; #当前最大的节目号 DECLARE v_progNo INT DEFAULT 0; #当前最大的端口号 DECLARE v_portNo INT DEFAULT 0; #记录节目号、端口号递增步长 DECLARE v_step INT DEFAULT 1; # 游标定义,此处为后面查询的结果集,游标类似于指针作用,每次指向一条记录,从而对当前的这条记录进行操作 DECLARE cur CURSOR FOR SELECT t.qam_id FROM t_ipqam t; # 当没有找到记录时设置遍历标识 DECLARE continue HANDLER FOR NOT FOUND SET done = TRUE; # 打开定义的游标 OPEN cur; # 获取下一行数据 FETCH cur INTO v_id; # 遍历处理 WHILE NOT done DO #得到qamID对应的节目号最大值、端口号最大值、对应记录数 SELECT MAX(prog_no),MAX(port_no),count(*) INTO v_progNo,v_portNo,v_count FROM static_ipqam_usage where ipqam_id = v_id; #计算需要增加的记录数 SET v_internal = 40 - v_count; WHILE v_internal > 0 DO INSERT INTO static_ipqam_usage values(null,v_id,v_progNo+v_step,v_portNo+v_step,0,0,now()); SET v_step = v_step +1; SET v_internal = v_internal - 1; END WHILE; # 获取下一行数据 FETCH cur INTO v_id; END WHILE; # 关闭释放游标 CLOSE cur; END ;; DELIMITER ;
完整脚本:
链接:https://pan.baidu.com/s/1tKFXgOwBdgZdUHAmx3ZMPg
提取码:vtxv
调用方式:
call SP_IPQAM_INSERT_DETAIL();
最终数据验证
SELECT t.ipqam_id,count(*) from static_ipqam_usage t GROUP BY t.ipqam_id HAVING count(*) >=40
原文:https://www.cnblogs.com/hdk-19930507/p/12368524.html