1.使用in和out传入参数和接收返回值
DELIMITER $$#将语句的分隔符设置为$$
CREATE PROCEDURE multi(IN a INT, IN b INT, OUT c INT)
BEGIN
#这里写存储过程要实现的逻辑
SET c = a * b;
END $$
DELIMITER ;#将分隔符改为;
DELIMITER:用于改变语句的分隔符。默认情况下,mysql会以分号“;”作为语句的分隔符,存储过程包含多个sql语句,所以会被解析为多个sql依次执行。因此必须改变分隔符,将创建存储过程的多个sql视作一个整体
IN:入参,后跟参数名、类型
OUT:返回结果,后跟参数名、类型
2.通过select语句给变量赋值
DELIMITER $$
CREATE PROCEDURE total(OUT total INT)
BEGIN
SELECT COUNT(*) INTO total FROM `db3`.`test`;#将查询到的值赋值给total
END $$
DELIMITER ;
3.接收存储过程的返回值
以上述total存储过程为例,调用方式如下:
call total(@c);#@c代表声明了一个c变量
select @c;#查看存储过程结果
4.测试用,批量插入n条数据模板
#插入指定条记录
DELIMITER $$
CREATE PROCEDURE add_batch(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1;#声明临时变量i,默认1
WHILE i <= num DO
#把这里替换为自己的插入逻辑即可
INSERT INTO db3.test(`name`, `age`) VALUES(CONCAT('user',i), 20);
SET i = i + 1;
END WHILE;
END $$
DELIMITER ;
注意,像这种批量插入一定要在一个事务中执行,不然mysql会把每一次insert当作一个事务,那么会导致存储过程执行速度很慢。调用示例如下:
start transaction;
call add_batch(1000000);#插入100w条数据
commit;
注:每次自己进行小测试时,需要往mysql中插入几十上百万的模拟数据,老是忘了存储过程、while循环怎么写,于是借助博客记录一下。虽然可以使用jdbc或者其他工具来批量插入,但架不住存储过程最直接、方便。