(一)淺談遊標
(1)遊標的概念
遊標是指向查詢結果集的一個指標,它是一個通過定義語句與一條Select語句相關聯的一組SQL語句,即從結果集中逐一的讀取一條記錄。遊標包含兩方面的內容:
●遊標結果集:執行其中的Select語句所得到的結果集;
●遊標位置:一個指向遊標結果集內的某一條記錄的指標
利用遊標可以單獨操縱結果集中的每一行。遊標在定義以後存在兩種狀態:關閉和開啟。當遊標關閉時,其查詢結果集不存在;只有當遊標開啟時,才能按行讀取或修改結果集中的資料。
(2)淺談遊標
遊標我們可以通俗的解釋為變動的標示。正如它的解釋一樣,資料庫中的遊標其實也是一種讀取資料的方式。舉個簡單的例子來說:我有一個電話本,電話本上的號碼首先是按地區劃分的,現在我想找個家住廊坊的李四。首先我們要做的是先找到廊坊地區的電話表,找到後的表也即是我們上面所說的遊標結果集;而為了找到李四我們可能會用手一條一條逐行的掃過,以協助我們找到所需的那條記錄。對應於資料庫來說,這就是遊標的模型。所以,你可以這樣想象:表格是資料庫中的表,而我們的手好比是遊標。
總結來說遊標就好比是在電話本上逐一掃描號碼的手指。
(二)使用遊標
一個應用程式中可以使用兩種類型的遊標:前端(客戶)遊標和後端(伺服器)遊標,它們是兩個不同的概念。
但無論使用哪種遊標,都必須經過如下的步驟:
●聲明遊標
●開啟遊標
●從遊標中操作資料
●關閉遊標
下面我們主要講述下伺服器資料指標:
(1)定義遊標
使用遊標之前必須先聲明它。聲明指定定義遊標結果集的查詢。通過使用for update或for read only關鍵詞將遊標顯式定義成可更新的或唯讀。
Declare cursor_name cursor
For select_statement
[for{read only|update[of colum_name_list]}]
舉例:
Declare company_crsr cursor
For select name,salary from company where salary>2000
For update of name,salary
上面我們聲明了一個名為company_crsr的遊標。
(2)開啟遊標
open的文法為:
open
遊標名
在聲明遊標後,必須開啟它以便用fetch,update,delete讀取、修改、刪除行。在開啟一個遊標後,它將被放在遊標結果集的首行前,必須用fetch語句訪問該首行。
(3)讀取遊標資料
在聲明並開啟一個遊標後,可用fetch命令從遊標結果集中擷取資料行。
Fetch的文法為:
Fetch
[[Next | Prior | First | Last | Absolute{n|@nvar} |Relative {n|@nvar}]
From] 遊標名 [into
變數列表]
參數說明:
Next:返回結果集中當前行的下一行,如果該語句是第一次讀取結果集中資料則返回的是第一行
Prior:返回結果集中當前行的上一行,如果該語句是第一次讀取結果集中的資料則無記錄結果返回並把遊標位置設定為第一行。
First:返回遊標第一行;Last:返回遊標中的最後一行;
Absolute{n|@nvar}:如果 n
或 @nvar 為正數,返回從遊標題開始的第 n
行並將返回的行變成新的當前行。如果 n 或 @nvar
為負數,返回遊標尾之前的第 n 行並將返回的行變成新的當前行。如果 n
或 @nvar 為 0,則沒有行返回。n
必須為整型常量且 @nvar 必須為 smallint、tinyint
或 int。
RELATIVE {n | @nvar}:如果 n
或 @nvar 為正數,返回當前行之後的第 n
行並將返回的行變成新的當前行。如果 n 或 @nvar
為負數,返回當前行之前的第 n 行並將返回的行變成新的當前行。如果 n
或 @nvar 為 0,返回當前行。如果對遊標的第一次提取操作時將 FETCH RELATIVE
的 n 或 @nvar
指定為負數或 0,則沒有行返回。n
必須為整型常量且 @nvar 必須為 smallint、tinyint
或 int。
舉例:
Fetch next
company_crsr into @name,@salary
SQL Server在每次讀取後返回一個狀態值。可用@@sql_status訪問該值,下表給出了可能的@@sql_status值及其意義。
值意義:
0——Fetch語句成功
1——Fetch語句導致一錯誤
2——結果集沒有更多的資料,當前位置位於結果集最後一行,而客戶對該遊標仍發出Fetch語句時。
若遊標是可更新的,可用update和delete語句來更新和刪除行。
刪除遊標當前行的文法為:
Delete [from]
表名
where current of
遊標名
舉例:delete from authors where current of authors_crsr
當遊標刪除一行後,SQL Server將遊標置於被刪除行的前一行上。
更新遊標當前行的文法為:
update
表名
set column_name1={expression1|NULL|(select_statement)}
[,column_name2={expression2|NULL|(select_statement)}
[……]
where current of
遊標名
舉例:
update company
set name=”張三”,salary=”5000”
where current of company_crsr
(4)關閉遊標
當結束一個遊標結果集時,可用close關閉。該文法為:
close
遊標名
關閉遊標並不改變其定義,可用open再次開啟。若想放棄遊標,必須使用deallocate釋放它,deallocater的文法為:
deallocater cursor
遊標名
deallocater語句通知SQL Server釋放Declare語句使用的共用記憶體,不再允許另一進程在其上執行Open操作。