MySQL 存储过程是从 MySQL 5.0 开始增加的新功能,目的是数据库 SQL 语言层面的代码封装与重用。
以下是一个向目标数据库写大量模拟数据的 存储过程 示例:
DROP PROCEDURE IF EXISTS proc_initData;
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
DECLARE i INT DEFAULT 80000;
WHILE i>0 DO
insert into SC (sc_id,s_id,c_id,score) value (i, FLOOR(RAND() * 10), FLOOR(RAND() * 10), FLOOR(RAND() * 100));
SET i = i-1;
END WHILE;
END $
CALL proc_initData();
DELIMITER ;
示例各语句含义详解:
- DROP PROCEDURE IF EXISTS proc_initData
查询是否有该存储过程,如果有,停止它- DELIMITER $
定义分隔符为 $ ,因为存储过程语句中含有;
分隔的语句,避免和存储过程语句本身混淆- CREATE PROCEDURE proc_initData()
创建一个 名为 proc_initData 的存储过程- BEGIN
begin 和 end 是mysql中复合语句的定界符。- END $
结束,自定义的分隔符$
表示到这里该语句结束- DECLARE i INT DEFAULT 80000;
定义变量 i 类型为 int,初始默认值为 80000- WHILE i>0 DO
开启循环语句,如果i
大于0,则执行下面语句- insert into SC (sc_id,s_id,c_id,score) value (i, FLOOR(RAND() * 10), FLOOR(RAND() * 10), FLOOR(RAND() * 100));
写入数据- SET i = i-1;
设置 i 的值,每执行一次对该值进行更新- END WHILE;
循环语句结束- CALL proc_initData();
在定义好该存储过程后,执行调用- DELIMITER ;
恢复分隔符为默认的;
存储过程其他知识点:
- 查询存储过程
show procedure status where db='数据库名';
- 查询存储过程的定义语句
show create procedure 数据库.存储过程名;
- 存储过程的参数使用
存储过程中的参数分别是 in,out,inout三种类型;- in代表输入参数(默认情况下为in参数),表示该参数的值必须由调用程序指定。
- ou代表输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用程序。
- inout代表即时输入参数,又是输出参数,表示该参数的值即可有调用程序制定,又可以将inout参数的计算结果返回给调用程序。
# (入参类型 变量名 变量类型, ...) create procedure proc_initData(in i_int int, out o_varchar varchar(255))
对随机数的额外说明
- FLOOR(n)
对传入的 数值n 进行向下取整 - RAND(seed)
生成一个 0~1 的随机数, 传入的参数seed是随机数种子,一般可以不用传
由 floor() 和 rand() 配合使用可以随机生成任何区域值:
# 生成一个 0 ~ 100 的数
floor(rand()*100)
# 生成一个 0 ~ 12 的数
floor(rand()*12)
# 生成一个 5~95 的数
floor(5+rand()*90)