以下說明基於mysql 5.5。
概述:我知道大部分人對於mysql游標使用的不多。mysql大多數情況可以用“集合”操作,即可滿足90%的需求。mysql cursor作為對“記錄”操作,是操作數據的一種補充。
mysql cursor三大特性(大三“坑”):
1、只讀的:cursor本身不提供修改數據的操作,只能fetch columns into variables。(當然你可以把數據拿出來以后,再用update語句更新。但是有坑,第三點說明)。
2、不能滾動的:只能向一個方向遍歷數據,不能回滾,不能隨意進退,不能跳過某些記錄。
3、數據敏感的(大坑):游標分為兩類,一類為數據敏感類型的游標,一類為非數據敏感類型的游標。
- 數據敏感類型游標:游標指向實際的數據,遍歷數據時,如果其他session修改了當前cursor遍歷的數據集合,會影響當前游標的行為。
- 非數據敏感類型游標:游標查詢的數據集合放入到一個臨時表中,游標指向臨時表的記錄集合。
- mysql cursor: 是數據敏感類型游標。官方英文說明:The server may or may not make a copy of its result table.
- 基於以上說明: 不要更新mysql游標打開表的數據。(也有部分資料說:不要更新游標聲明語句中select statement的where條件字段)
mysql cursor無關緊要的特性:
1、游標只能在存儲過程中使用,包含在BEGIN ... END statement中。
2、需要close cursor關閉游標,釋放資源。其實如果不釋放,在END statement結束以后,自動釋放cursor。
3、游標的聲明語句必須放在所有變量的聲明語句之后。
4、游標的聲明語句必須關聯select statement。
5、定義一個CONTINUE HANDLER FOR NOT FOUND,可以幫助游標在fetch no data的時候,跳出fetch循環。
6、CONTINUE HANDLER FOR NOT FOUND 這個條件不僅僅針對游標沒有找到數據會觸發,針對其他select statement(在沒有檢索到數據的情況下)也會觸發。