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ù)進行一個擴展。