2019-09-02

Msql使用儲存過程做批量操作

雖然在日常的使用中, 批量操作可以通過sql命令,類似于insert into tab values (select * from anotherTab)這種形式進行批量操作,但是對于大數(shù)據(jù)量的批量操作來說,在速度執(zhí)行速度方面會有軟肋,而且通過使用存儲過程的形式,可以在數(shù)據(jù)庫中定義定時任務(wù)執(zhí)行定義的存儲函數(shù)(例如定時對昨天的交易數(shù)據(jù)進行統(tǒng)計等),這個是手動寫一個sql無法實現(xiàn)的。

首先,先貼出整個腳本的代碼,然后再一行行的進行解析:

CREATE PROCEDURE `update_destTab`(
        in var_begin varchar(30),
        in var_end varchar(30)
)                                 
BEGIN
    DECLARE row_id bigint;
    DECLARE row_chargeFeeTime   varchar(20); 
    DECLARE count INT DEFAULT 0;  
    DECLARE done INT;

DECLARE var_cursor CURSOR FOR
SELECT ah.id, a.chargeFeeTime
FROM demo_destTab ah force index (INDEX_destTab_CREATEDATE), demo_account a 
where ah.accountId = a.id
and ah.CREATEDATE >= str_to_date(var_begin,'%Y%m%d %H:%i:%s')
and ah.CREATEDATE < str_to_date(var_end,'%Y%m%d %H:%i:%s')
and ah.chargeFeeTime is null;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

set count=0;

OPEN var_cursor;
cursor_loop:LOOP
FETCH var_cursor INTO row_id,row_chargeFeeTime;

IF done=1 THEN
leave cursor_loop;
END IF;


update demo_destTab set chargeFeeTime=row_chargeFeeTime where id=row_id;

set count=count+1;

if count%2000=0 then 
  commit;
end if;

END LOOP cursor_loop;
CLOSE var_cursor;
commit;
END


set autocommit=0;
CALL demo_rw.update_destTab('20171001 00:00:00','20171101 00:00:00');
  • 首先 Create Prodcedure 定義了創(chuàng)建一個存儲過程,并定義了接收的參數(shù)
  • 使用 DECLARE 聲明將要使用的變量
  • 使用 DECLARE CURSOR FROM 定義了游標(biāo),通過游標(biāo),可以對自定義的 SELECT 語句獲取的數(shù)據(jù)進行進一步的操作
  • DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 這句話的意思是,當(dāng)游標(biāo)到達數(shù)據(jù)聚合末的時候,定義一個結(jié)束的標(biāo)志,這是一個固定的寫法
  • set count=0; 這句話其實并沒什么特定的作用,只是和下面的這一段

if count%2000=0 then
commit;
end if;

當(dāng)數(shù)據(jù)打到一定數(shù)量的時候進行一個事務(wù)的提交,避免數(shù)據(jù)量太大造成讀寫的延遲

  • OPEN var_cursor; cursor_loop:LOOP FETCH var_cursor INTO row_id,row_chargeFeeTime;
    這三句,打開游標(biāo),將游標(biāo)的數(shù)據(jù)賦值到開頭 DECLARE 定義的變量中,然后對變量進行自定義的操作,在這個腳本中是對數(shù)據(jù)進行 update
  • 最后 END LOOP cursor_loop; 語句,在執(zhí)行完成后進行游標(biāo)的關(guān)閉以及事務(wù)的提交,結(jié)束存儲過程
  • 調(diào)用該存儲過程,使用 CALL 函數(shù)名稱(參數(shù)。。) 進行調(diào)用

展示了一個簡單的存儲函數(shù)的使用方法,通過select撈出數(shù)據(jù)然后通過update進行數(shù)據(jù)操作??梢援?dāng)成一個模板,修改select和update兩個語句塊,定義需要的變量,根據(jù)需要對該函數(shù)進行一個擴展。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容