MySQL存储过程
有这样一个需求,从A表中查询出结果,作为B表插入的查询条件,之后循环查询并插入。从网上看了些解决方案,这里写了一个存储过程的DEMO。
DROP PROCEDURE IF EXISTS SELECT_4_INSERT;-- 若存在此存储过程先删除
DELIMITER $$ -- 定义结束符 避免与存储过程中“;”冲突 语句到"$$"才算结束
CREATE PROCEDURE SELECT_4_INSERT() -- 创建存储过程
BEGIN
-- 定义结束标识 用于判断是否结束循环 也可以用FALSE,MYSQL认为非0为TRUE
DECLARE DONE INT DEFAULT 0;
-- 用于存储结果集的记录 这里的记录只有一列 多列需要定义多个 VARCHAR需指定长度
DECLARE STYPE VARCHAR(128);
-- 定义游标 使用游标进行遍历
DECLARE STYPE_CURSOR CURSOR FOR SELECT DATA_TYPE FROM BASE_STYPE_INFO WHERE ID > 1000000;
-- 定义 结束标识DONE何时改变
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
-- 打开游标
OPEN STYPE_CURSOR;
-- 循环开始
REPEAT
-- 可FETCH多列 需对应上
FETCH STYPE_CURSOR INTO STYPE;
-- 结果集没读完则继续
IF NOT DONE THEN
-- 假设这里需要做一下类型转换 使用CAST将字符转成数值
INSERT INTO BASE_OTHER_TABLE(ID, TYPE_NAME, CREATE_TIME)
SELECT ID+1000000 ID, 'TEST' TYPE_NAME, 1563445355 CREATE_TIME FROM BASE_ANOTHER_TABLE
WHERE TYPE = CAST(STYPE AS SIGNED);
END IF;
UNTIL DONE END REPEAT;
-- 关闭游标
CLOSE STYPE_CURSOR;
-- 循环结束
END $$
DELIMITER;-- 结束符恢复
-- 调用存储过程
CALL SELECT_4_INSERT();
-- 若为临时存储过程 调用完删除
DROP PROCEDURE SELECT_4_INSERT;
还有一种情况,将A表中的查询结果全部塞到B表中,只做一些字段匹配调整,可直接使用INSERT…SELECT…
A表中字段:ID FIRST_NAME LAST_NAME GENDER
B表中字段:ID NAME FLAG HOBBIES
INSERT INTO BASE_B_INFO(ID, NAM, FLAG, HOBBIES)
SELECT ID+1000000 ID, CONCAT(FIRST_NAME, LAST_NAME) NAME , 0 FLAG ,'无' HOBBIES
FROM BASE_A_INFO
2017.12.23 00:13