最近需要往庫表插入批量數據,所以寫了個存儲過程函數,以下分享學習心得。因為項目是接口,當然造數據我們可以用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
