使用遊標(cursor)
1.聲明遊標
CURSOR FOR select_statement
這個語句聲明一個遊標。也可以在子程式中定義多個遊標,但是一個塊中的每一個遊標必須有唯一的名字。聲明遊標後也是單條操作的,但是不能用SELECT語句不能有INTO子句。
2. 遊標OPEN語句
這個語句開啟先前聲明的遊標。
3. 遊標FETCH語句
INTO var_name [, var_name] ...
這個語句用指定的開啟遊標讀取下一行(如果有下一行的話),並且前進遊標指標。
4. 遊標CLOSE語句
這個語句關閉先前開啟的遊標。
下面是建立預存程序,使用遊標迴圈更新操作的例子:
-- Procedure "useCursor" DDLCREATE PROCEDURE `useCursor`()BEGIN /*局部變數的定義 declare*/ declare aid bigint default 0 ; declare mdsl bigint default 0; declare stop int default 0; declare cur CURSOR FOR (select count(area_info.id) as mdsl, area_info.id as aid from area_info right join subbranch_info on subbranch_info.i_subbran_area=area_info.idwhere area_info.i_record_status=0 and subbranch_info.i_record_status=0 group by area_info.id); /* mysql 不知道為什麼用異常加入判斷 ? * 這把 遊標 異常後 捕捉 * 並設定 迴圈使用 變數 stop 為 null 跳出迴圈。 */ declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop = null; /*開遊標*/OPEN cur;/*遊標向下走一步,將查詢出來的兩個值付給定義的兩個變數*/FETCH cur INTO mdsl,aid;/* 迴圈體 這很明顯 把遊標查詢出的 name 都加起並用 ; 號隔開 */WHILE ( stop is not null) DOupdate zlgsydrsp.area_info set i_subbran_count=mdsl where id = aid ;/*遊標向下走一步*/FETCH cur INTO mdsl,aid;END WHILE;CLOSE cur;END;