mysql存儲過程批量插入數據方法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM