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