MySQL动态批量插入数据

功能描述

  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 ;
View Code

 

 

 

完整脚本:

链接: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
View Code

 

 

 

 

 

  

 

posted @ 2020-02-26 19:06  coder_hdk  阅读(109)  评论(0)    收藏  举报