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 版权协议,转载请附上原文出处链接和本声明。