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

Licensed under CC BY-NC-SA 4.0
本文链接:http://JohnneyAnn.github.io/2017/12/23/MySQL存储过程/