/*我們有時候會遇到需要對 從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; /*刪除臨時存儲過程*/