SQL的遊標是一種臨時的數據庫對象,既能夠存放儲存在數據庫表中數據行的副本,也指向數據行的指針。數據庫
1.遍歷數據行;數據結構
2.保存查詢結果,方便下文調用。概念中提到使用遊標會保存數據行的副本,那麼建立遊標後,下文查詢便可從副本中查詢,要比直接查數據庫快不少。fetch
語法:spa
declare cursor_name --遊標名稱,惟一標識 [insensitive] [scroll] cursor for select_statement --查詢語句 [for {read only| update [of column_name [,...n]]}]
insensitive指針 告訴DBMS產生查詢結果的臨時副本,而不是使用指針指向數據庫表中源數據。code 指定insensitive時,對底層表任何改動都不會反映到遊標數據中。反之,對底層表的改動都會反映到遊標數據中。對象 insensitive遊標是隻讀的,所以不能修改其內容,也不能經過它修改底層表數據。blog scrollit 代表全部的提取操做,即fetch選項(具體選項在下文提到),若不指定只能進行next提取。io read only 設置遊標數據只讀,指定read only後,對底層表的改動不會更新其遊標數據。 update [of column_name[,...n]] 定義在遊標中可被更改的列。若是隻指定了update,表示全部列均可以更新。 |
剛纔講了建立遊標的語法,結合fetch語句先寫個例子吧:
--建立遊標 declare cursor_school scroll cursor for select Num,ChineseName from School order by Num --打開遊標 open cursor_school --定義變量 declare @num bigint, @schoolname nvarchar(50) --提取最後一行學校信息 fetch last from cursor_school into @num, @schoolname print '學校編號:' + cast(@num as varchar) + '學校名稱:' + @schoolname --關閉遊標 close cursor_school
結果集:
輸出結果:
學校編號:609781000000學校名稱:香港凱莉山學校
注意上文中order by以後的列必須在select中出現。
fetch語句中,SQL Server提供了6種定位選項:
next 返回結果集當前行的下一行,首次提取返回第一行。 frior 返回結果集的上一行,首次提取無數據返回。 first 返回結果集第一行。 last 返回結果集最後一行。 absolute 移動到結果集的第n行。若是n爲正數,從結果集的第一行(包含第一行)起移到第n行;若是n爲負數,則從結果集的最後一行起移到第n行。 relative 從遊標指針的當前位置移動n行。若是n爲正數,則讀取遊標當前位置起向後的第n行數據;若是n爲負數,則讀取遊標當前位置起向前的第n行數據。 |
//update update table_name set column_name,... where current of cursor_name //delete delete from table_name where current of cursor_name
使用update或delete語句時要先建立遊標。
CLOSE(關閉)遊標後不會釋放其佔用的數據結構。那麼想要釋放佔用的數據結構須要用DEALLOCATE語句,該語句不只刪除遊標中的數據,還會將遊標做爲對象從數據庫中刪除。
釋放遊標語句:deallocate cusor_name