介绍
在实际工作中没有测试性能,我们经常需要改造大批量的数据,手动插入是不太可能的,这时候就得用到存储过程了
CREATE TABLE `kf_user_info` (
`id` int(11) NOT NULL COMMENT '用户id',
`gid` int(11) NOT NULL COMMENT '客服组id',
`name` varchar(25) NOT NULL COMMENT '客服名字',
`nickName` varchar(64) NOT NULL COMMENT '客服昵称',
`mobile` varchar(12) NOT NULL COMMENT '手机号',
`maxChannel` int(11) NOT NULL COMMENT '最大接入数',
`createTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updateTime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `mobile` (`mobile`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客户信息表';
如何定义一个存储过程呢?
CREATE PROCEDURE 存储过程名称 ([参数列表])
BEGIN
需要执行的语句
END
举个例子,插入id为100-999的1000条数据
用Navicat执行
-- 删除之前定义的
DROP PROCEDURE IF EXISTS create_kf;
-- 开始定义
CREATE PROCEDURE create_kf(IN loop_times INT)
BEGIN
DECLARE var INT;
SET var = 100;
WHILE var < loop_times DO
INSERT INTO kf_user_info (`id`,`gid`,`name`,`nickName`,`mobile`,`maxChannel`)
VALUES (var, 1000, var, var, var, var);
SET var = var + 1;
END WHILE;
END;
-- 调用
call create_kf(1000);
存储过程的三种参数类型
参数类型 | 是否返回 | 作用 |
---|---|---|
IN | 否 | 向存储过程传入参数,存储过程中修改该参数的值,不能被返回 |
OUT | 是 | 把存储过程计算的结果放到该参数中,调用者可以得到返回值 |
INOUT | 是 | IN和OUT的结合,即用于存储过程的传入参数,同时又可以把计算结构放到参数中,调用者可以得到返回值 |
用MySQL执行
得用DELIMITER 定义新的结束符,因为默认情况下SQL采用(;)作为结束符,这样当存储过程中的每一句SQL结束之后,采用(;)作为结束符,就相当于告诉MySQL可以执行这一句了。但是存储过程是一个整体,我们不希望SQL逐条执行,而是采用存储过程整段执行的方式,因此我们就需要定义新的DELIMITER ,新的结束符可以用(//)或者($$)
因为上面的代码应该就改为如下这种方式
DELIMITER //
CREATE PROCEDURE create_kf_kfGroup(IN loop_times INT)
BEGIN
DECLARE var INT;
SET var = 100;
WHILE var <= loop_times DO
INSERT INTO kf_user_info (`id`,`gid`,`name`,`nickName`,`mobile`,`maxChannel`)
VALUES (var, 1000, var, var, var, var);
SET var = var + 1;
END WHILE;
END //
DELIMITER ;
查询已经定义的存储过程
show procedure status;