SQL Server遊標

  • SQL遊標概念

SQL的遊標是一種臨時的數據庫對象,既能夠存放儲存在數據庫表中數據行的副本,也指向數據行的指針。數據庫

  • 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語句檢索數據

剛纔講了建立遊標的語法,結合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語句和定位DELETE語句
//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

相關文章
相關標籤/搜索