最近需要往库表插入批量数据,所以写了个存储过程函数,以下分享学习心得。因为项目是接口,当然造数据我们可以用jmeter或者LoadRunner写好脚本往数据库压数据
1:参考文档:https://www.cnblogs.com/wt645631686/p/6868192.html
2:参考文档:https://www.cnblogs.com/kenshinobiy/p/9194147.html
一:存储过程简介
SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
二:MySQL存储过程语法
2.1:语法:CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体
语法实例:CREATE PROCEDURE `proc_auto_insertdata`(in start int)
BEGIN
DECLARE num INTEGER ;
END;
参数解析:参数
存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:
- IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
- OUT:该值可在存储过程内部被改变,并可返回
- INOUT:调用时指定,并且可被改变和返回
过程体
过程体的开始与结束使用BEGIN与END进行标识。
2.2:变量
语法:DECLARE 变量名1[,变量名2...] 数据类型 [默认值];
2.3:变量赋值
语法:SET 变量名 = 变量值 [,变量名= 变量值 ...]
2.4:用户变量
用户变量一般以@开头
2.5:存储过程调用
用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。
三:实例
1:往order表批量插入数据,写了一个流水号生成函数,在存储过程中调用该函数,拼接流水
运行截图:
#生成流水号函数
create function rand_num( )
returns int(5)
begin
declare i int default 0;
set i = floor(10+rand()*500);
#set i = CEIL(RAND() * 9000000000) + 1000000000;
return i;
end;
DROP PROCEDURE IF EXISTS `proc_auto_insertdata`;
CREATE PROCEDURE `proc_auto_insertdata`()
BEGIN
DECLARE num INTEGER ;
DECLARE order_no varchar(32);
DECLARE trans_code varchar(32);
DECLARE out_order_no varchar(32);
#set autocommit = 0 //把autocommit设置成0,这样可以只提交一次,否则。。。。。
set num=1;
set order_no=2018062600000;
set trans_code=870210;
set out_order_no=201806260000000;
START TRANSACTION;
WHILE num <=2 DO
set order_no=order_no+1;
set out_order_no=out_order_no+1;
INSERT INTO `epay`.`orders` (`order_no`, `user_no`, `trans_code`, `out_order_no`, `out_date_time`, `origional_order_no`, `mer_no`, `payer_name`, `payer_no`, `payer_acct_no`, `payer_acct_type`, `channel_flag`, `pay_serial_id`, `pay_amount`, `currency`, `busi_date`, `trans_fee`, `fee_currency`, `recv_name`, `recv_no`, `recv_branch_no`, `recv_account_no`, `recv_acct_type`, `recv_type`, `realtime_type`, `order_type`, `agent_order_type`, `detail_flag`, `in_account_date`, `order_desc`, `prod_code`, `prod_name`, `pay_type`, `assoc_no`, `in_out_flag`, `channel_name`, `order_status`, `create_time`, `update_time`, `end_time`, `sys_order_flag`, `receive_url`, `pickup_url`, `sms_confirm`, `order_valid_time`, `scan_flag`, `memo`, `extfld1`, `extfld2`, `extfld3`)
VALUES (CONCAT('order_now',rand_num( )), NULL, trans_code, CONCAT('out_order_no',DATE_FORMAT(now(),'%Y%m%d'),rand_num( )), '20170103103518', NULL, '50000001', NULL, NULL, NULL, NULL, '3', 'f7eac91b03dc4fb08595db4bdb7d688a', '0.01', 'CNY', DATE_FORMAT(now(),'%Y%m%d'), '0.00', 'CNY', '批量插入', NULL, NULL, '6214855712316351', '1', '0', NULL, 'R', '1', '3', NULL, '123', NULL, NULL, NULL, NULL, '1', 'YEEPAY_PAY', '2', '20170103103520', '20170103103527', NULL, NULL, NULL, NULL, NULL, NULL, '0', 'guxw自动化用例', NULL, '顾夏炜,330211198807290073,15858297732,null,null,308584001547,招商银行', NULL);
set num =num+1;
end WHILE;
COMMIT ;
END;
#调用存储过程
call proc_auto_insertdata();
四:设置mysql的自动提交开关
第一步过程写好了,本以为就可以万事大吉了,但是实际去执行这个过程,你会发现速度太慢了,一千万条数据估计得跑十几个小时。设置mysql的自动提交开关是提速的关键所在。
(1)打开命令列界面
输入命令:show variables like 'autocommit';
(2)输入命令set autocommit = 0;
执行完命令后,我们可以看到autocommit 为OFF,说明mysql的自动提交开关已经关闭
(3)执行过程;存储过程写好, mysql的自动提交开关给关上,然后再执行过程,你会发现,一千万数据很快就能造完了。
(4)输入命令set autocommit = 1;还原mysql的自动提交开关的默认设置。
数据制造完之后一定要还原mysql的自动提交开关的默认设置,不然直接执行的所有的insert、update这样的修改语句都需要手动commit