mysql 存储过程 查询结果循环插入

  • Post author:
  • Post category:mysql


A表

-- ----------------------------
-- Table structure for test1
-- ----------------------------
DROP TABLE IF EXISTS `test1`;
CREATE TABLE `test1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_bin NOT NULL,
  `type` tinyint(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- ----------------------------
-- Records of test1
-- ----------------------------
INSERT INTO `test1` VALUES ('1', '11212', '1');
INSERT INTO `test1` VALUES ('2', '222222', '1');
INSERT INTO `test1` VALUES ('3', '33', '2');

B表

-- ----------------------------
-- Table structure for test2
-- ----------------------------
DROP TABLE IF EXISTS `test2`;
CREATE TABLE `test2` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `x` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `name` varchar(255) COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=39065 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

需求:

把A表符合条件的name  插入的B表中 ;因为第一次使用存储过程 整个代码都是百度之后完成;有不对的请指点;因为是帮朋友写的  所以其中的corpId 是朋友的表字段  没有特殊意义 ;

直接看存储过程的代码注释 :


DROP PROCEDURE IF EXISTS _inertDepartment_corpid;
DELIMITER //
CREATE PROCEDURE _inertDepartment_corpid() #这个是存储过程名称 随便起;
BEGIN
	##定义从A表里面取的值;这个是单条记录的corpid的值 
	DECLARE _corpid varchar(50);
	
	#需要插入表内存在同样值的条数 ; 这个值用来判断是否已经存在
	DECLARE p_count int;

	#这个s  是系统自带的  可以判断select取出的list 是否已经空了 
	DECLARE s int DEFAULT 0;


	## _test1_name 是集合名称  里面是  name的集合 ; cursor 是集合的意思 ;_test_name 也可以存对象形式的list
	DECLARE _test1_name CURSOR FOR 
		SELECT `name` FROM test1 WHERE `type`=1;
#定义declare continue handler,这个会根据上下文是否有结果判断是否执行SET notfound = 1  这个不用看  是标准化的 系统会自动判断  如果集合里面空了  自动设置为1
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;

	# 使用select取出来的list  必须先open
	OPEN _test1_name;

  ## 赋值  从_test1_name集合里面取出一个值  赋值给_corpid 
	FETCH _test1_name INTO _corpid;	
	
	###循环判断  只要集合里面有值  就开始循环
	WHILE s <> 1  DO

  #初始化 需要插入的表里面没有重复值;
	set p_count=0;	

  #查询老表中这个值存不存在;
	SELECT COUNT(id) INTO p_count from test2 where `name` = _corpid;
	
  #如果不存在 
	IF p_count=0 then

  #就插入  你的insert语句 
	insert INTO test2 (id,x,`name`)VALUE (null,null,_corpid);

	END IF;

## 循环结束  从list里面再取一个值 赋值给_corpid
FETCH _test1_name INTO _corpid;	
	
	
		
	END WHILE;
	## 关闭
	CLOSE _test1_name; 
END//  
DELIMITER ; 









# mybatis里面直接用这个语句调用 ;
CALL _inertDepartment_corpid();



版权声明:本文为weixin_42072721原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。