MySQL通過游標來實現通過查詢記錄集循環


/*我們有時候會遇到需要對 從A表查詢的結果集S_S 的記錄 進行遍歷並做一些操作(如插入),且這些操作需要的數據或許部分來自S_S集合*/
/*臨時存儲過程,沒辦法,不能直接在查詢窗口做這些事。*/
drop procedure if exists proc_tmp; create procedure proc_tmp() BEGIN
/*這種寫法也可以:DECLARE done INT DEFAULT FALSE;*/ declare done
int default 0; /*用於判斷是否結束循環*/ declare hostId bigint; /*用於存儲結果集S_S的記錄(因為我這里S_S的記錄只有一列且為bigint類型)*/
/*定義游標*/ declare idCur cursor
for select A.HostId from dev_host as A, sys_hostconfig as B where A.HostId != B.HostId;
/*定義 設置循環結束標識done值怎么改變 的邏輯*/ declare
continue handler for not FOUND set done = 1; /*done = true;亦可*/ open idCur; /*打開游標*/
/* 循環開始 */ REPEAT
/* 如果要fetch多列應該這樣寫,fetch cur/*對應下面的idCur*/ into rowId, rowName;但是注意rowId和rowName要先declare,且declare cur時也要select兩列,且這兩列和rowId、rowName對應 */ fetch idCur into hostId; /*這部分可以看看書,還可以fetch多列(假設結果集S_S的記錄不是單列的話)*/
if not done THEN /*數值為非0,MySQL認為是true*/ insert into sys_hostconfig(HostId, AElecCap, BElecCap, CElecCap, RemElecCap, ATmpCap, BTmpCap, CTmpCap, BoxTmpCap, CreateTime)
/*注意這里用到了hostId和now()*/ values(hostId,
80, 80, 80, 500, 80, 80, 80, 80, NOW()); end if; until done end repeat; close idCur; /*關閉游標*/ END
/* 循環結束 */
call proc_tmp(); drop procedure proc_tmp; /*刪除臨時存儲過程*/

 


免責聲明!

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



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