遊標的概念
遊標提供了一種從表中檢索資料並進行操作的靈活手段,遊標主要用在伺服器上,處理由用戶端發送給伺服器端的SQL語句,或是批處理、預存程序、觸發器中的資料處理請求。遊標的優點在於它可以定位到結果集中的某一行,並可以對該行資料執行特定操作,為使用者在處理資料的過程中提供了很大方便。一個完整的遊標由5部分組成,並且這5個部分應符合下面的順序。
(1)聲明遊標。
(2)開啟遊標。
(3)從一個遊標中尋找資訊。
(4)關閉遊標。
(5)釋放遊標。
聲明遊標
首先來學習如何聲明一個遊標,聲明遊標使用DECLARE CURSOR語句。此語句有兩種文法聲明格式,分別為SQL 92標準格式和SQL Server擴充(擴充了聲明遊標的參數)格式,下面將分別介紹聲明遊標的兩種文法格式。
1.SQL-92文法格式
文法:
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
參數說明:
l DECLARE cursor_name:指定一個遊標名稱,其遊標名稱必須符合標識符規則。
l INSENSITIVE:定義一個遊標,以建立將由該遊標使用的資料的臨時複本。對遊標的所有請求都從tempdb中的暫存資料表中得到應答;因此,在對該遊標進行提取操作時返回的資料中不反映對基表所做的修改,並且該遊標不允許修改。使用SQL-92文法時,如果省略INSENSITIVE,(任何使用者)對基表提交的刪除和更新都反映在後面的提取中。
l SCROLL:指定所有的提取選項(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。
² FIRST:取第一行資料。
² LAST:取最後一行資料。
² PRIOR:取前一行資料。
² NEXT:取後一行資料。
² RELATIVE:按相對位置取資料。
² ABSOLUTE:按絕對位置取資料。
如果未指定SCROLL,則NEXT是惟一支援的提取選項。
l select_statement:定義遊標結果集的標準SELECT語句。在遊標聲明的select_statement內不允許使用關鍵字COMPUTE、COMPUTE BY、FOR BROWSE和INTO。
l READ ONLY:表明不允許遊標內的資料被更新,儘管在預設狀態下遊標是允許更新的。在UPDATE或DELETE語句的WHERE CURRENT OF子句中不允許引用遊標。
l UPDATE [ OF column_name [ ,...n ] ]:定義遊標內可更新的列。如果指定OF column_name [,...n]參數,則只允許修改所列出的列。如果在UPDATE中未指定列的列表,則可以更新所有列。
2.SQL Server擴充格式
文法:
DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
參數說明:
l DECLARE cursor_name:指定一個遊標名稱,其遊標名稱必須符合標識符規則。
l LOCAL:定義遊標的範圍僅限在其所在的批處理、預存程序或觸發器中。當建立遊標在預存程序執行結束後,遊標會被自動釋放。
l GLOBAL:指定該遊標的範圍對串連是全域的。在由串連執行的任何預存程序或批處理中,都可以引用該遊標名稱。該遊標僅在脫接時隱性釋放。
l FORWARD_ONLY:指定遊標只能從第一行滾動到最後一行。FETCH NEXT是惟一受支援的提取選項非指定STATIC、KEYSET或DYNAMIC關鍵字,否則預設為FORWARD_ONLY。STATIC、 KEYSET和DYNAMIC遊標預設為SCROLL。與ODBC和ADO這類資料庫API不同,STATIC、KEYSET和 DYNAMICTransact-SQL遊標支援FORWARD_ONLY。FAST_FORWARD和FORWARD_ONLY是互斥的;如果指定一個,則不能指定另一個。
l STATIC:定義一個遊標,以建立將由該遊標使用的資料的臨時複本。對遊標的所有請求都從tempdb中的該暫存資料表中得到應答;因此,在對該遊標進行提取操作時返回的資料中不反映對基表所做的修改,並且該遊標不允許修改。
l KEYSET:指定當遊標開啟時,遊標中行的成員資格和順序已經固定。對行進行惟一標識的鍵集內建在tempdb內一個稱為keyset的表中。對基表中的非索引值所做的更改(由遊標所有者更改或由其他使用者提交)在使用者滾動遊標時是可視的。其他使用者進行的插入是不可視的(不能通過Transact-SQL伺服器資料指標進行插入)。如果某行已刪除,則對該行的提取操作將返回@@FETCH_STATUS值-2。從遊標外更新索引值類似於刪除舊行後接著插入新行的操作。含有新值的行不可視,對含有舊值的行的提取操作將返回@@FETCH_STATUS值-2。如果通過指定WHERE CURRENT OF子句用遊標完成更新,則新值可視。
l DYNAMIC:定義一個遊標,以反映在滾動遊標時對結果集內的行所做的所有資料的更改。行的資料值、順序和成員在每次提取時都會更改。動態資料指標不支援ABSOLUTE提取選項。
l FAST_FORWARD:指明一個FORWARD_ONLY、READ_ONLY型遊標。
l SCROLL_LOCKS:指定確保通過遊標完成的定點更新或定位刪除可以成功。將行讀入遊標以確保它們可用於以後的修改時,SQL Server會鎖定這些行。如果還指定了FAST_FORWARD,則不能指定SCROLL_LOCKS。
l OPTIMISTIC:指明在資料被讀入遊標後,如果遊標中某行資料已發生變化,那麼對遊標資料進行更新或刪除可能會導致失敗。
l TYPE_WARNING:指定如果遊標從所請求的類型隱性轉換為另一種類型,則給用戶端發送警告訊息。
使用DECLARE CURSOR語句建立以下幾種形式的遊標。
(1)樣本:建立一個名為“MyCursor”的標準遊標。
USE 銷售管理系統
DECLARE MyCursor CURSOR FOR
SELECT * FROM 操作員資訊表
GO
(2)樣本:建立一個名為“MyCursor_01”的唯讀遊標。
USE 銷售管理系統
DECLARE MyCursor_01 CURSOR FOR
SELECT * FROM 操作員資訊表
FOR READ ONLY --唯讀遊標
GO
(3)樣本:建立一個名為“MyCursor_02”的更新遊標。
USE 銷售管理系統
DECLARE MyCursor_02 CURSOR FOR
SELECT 操作員編號,操作員姓名,操作員年齡 FROM 操作員資訊表
FOR UPDATE --更新遊標
GO
開啟遊標
開啟一個聲明的遊標使用OPEN命令。
文法:
OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
參數說明:
l GLOBAL:指定cursor_name為全域遊標。
l cursor_name:已聲明的遊標名稱,如果全域遊標和局部遊標都使用cursor_name作為其名稱,那麼如果指定了GLOBAL,cursor_name指的是全域遊標,否則,cursor_name指的是局部遊標。
l cursor_variable_name:遊標變數的名稱,該名稱引用一個遊標。
說明:如果使用INSENSITIV或STATIC選項聲明了遊標,那麼OPEN將建立一個暫存資料表以保留結果集。如果結果集中任意行的大小超過 SQL Server表的最大行大小,OPEN將失敗。如果使用KEYSET選項聲明了遊標,那麼OPEN將建立一個暫存資料表以保留鍵集。暫存資料表儲存在tempdb 中。
首先聲明一個名為MyCursor_001的遊標,然後使用OPEN命令開啟該遊標。
操作步驟如下:
(1)在作業系統中選擇“開始”→“所有程式”→“Microsoft SQL Server”→“查詢分析器”命令,開啟查詢分析器。
(2)在查詢分析器的工具列中選擇要串連的資料庫,這裡選擇“銷售管理系統”。
(3)在代碼編輯區中編寫如下代碼。
SQL語句如下:
USE 銷售管理系統
DECLARE MyCursor_001 CURSOR FOR --聲明遊標
SELECT 操作員編號,操作員姓名,操作員年齡 FROM 操作員資訊表
WHERE 操作員編號 = 'CY20040604006'
OPEN MyCursor_001 --開啟遊標
GO
從遊標中讀取資料
當開啟一個遊標之後,就可以讀取遊標中的資料了。可以使用FETCH命令讀取遊標中的某一行資料。
文法:
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
參數說明:
l NEXT:返回緊跟當前行之後的結果行,並且當前行遞增為結果行。如果FETCH NEXT為對遊標的第一次提取操作,則返回結果集中的第一行。NEXT為預設的遊標提取選項。
l PRIOR:返回緊臨當前行前面的結果行,並且當前行遞減為結果行。如果FETCH PRIOR為對遊標的第一次提取操作,則沒有行返回並且遊標置於第一行之前。
l FIRST:返回遊標中的第一行並將其作為當前行。
l LAST:返回遊標中的最後一行並將其作為當前行。
l ABSOLUTE {n | @nvar}:如果n或@nvar為正數,返回從遊標題開始的第n行,並將返回的行變成新的當前行。如果n或@nvar為負數,返回遊標尾之前的第n行,並將返回的行變成新的當前行。如果n或@nvar為0,則沒有行返回。
l RELATIVE {n | @nvar}:如果n或@nvar為正數,返回當前行之後的第n行,並將返回的行變成新的當前行。如果n或@nvar為負數,返回當前行之前的第n行,並將返回的行變成新的當前行。如果n或@nvar為0,返回當前行。如果對遊標的第一次提取操作時將FETCHRELATIVE的n或@nvar指定為負數或0,則沒有行返回。n必須為整型常量且@nvar必須為smallint、tinyint或int。
說明:在前兩個參數中,包含了n和@nvar其表示遊標相對與作為基準的資料行所偏離的位置。
l GLOBAL:指定cursor_name為全域遊標。
l cursor_name:要從中進行提取的開放遊標的名稱。如果同時有以cursor_name作為名稱的全域和局部遊標存在,若指定為GLOBAL,則cursor_name對應於全域遊標,未指定GLOBAL,則對應於局部遊標。
l @cursor_variable_name:遊標變數名,引用要進行提取操作的開啟的遊標。
l INTO @variable_name[,...n]:允許將提取操作的列資料放到局部變數中。列表中的各個變數從左至右與遊標結果集中的相應列相關聯。各變數的資料類型必須與相應的結果列的資料類型匹配或是結果列資料類型所支援的隱性轉換。變數的數目必須與遊標挑選清單中的列的數目一致。
l @@FETCH_STATUS:返回上次執行FETCH命令的狀態。在每次用FETCH從遊標中讀取資料時,都應檢查該變數,以確定上次FETCH操作是否成功,決定如何進行下一步處理。@@FETCH_STATUS變數有3個不同的傳回值,說明如下:
² 傳回值為0:FETCH 語句成功。
² 傳回值為-1:FETCH 語句失敗或此行不在結果集中。
² 傳回值為-2:被提取的行不存在。
說明:當使用SQL-92文法來聲明一個遊標時,沒有選擇SCROLL選項,則只能使用FETCH NEXT命令來從遊標中讀取資料,即只能從結果集第一行按順序地每次讀取一行。由於不能使用FIRST、LAST、PRIOR,所以無法復原讀取以前的資料。如果選擇了SCROLL選項,則可以使用所有的FETCH操作。
通常遊標取數的操作與WHILE迴圈緊密結合,下面將使用@@FETCH_STATUS控制在一個WHILE迴圈中的遊標活動。
程式運行結果1所示。
圖1 從遊標中讀取資料
SQL語句如下:
USE 銷售管理系統 --引入資料庫
DECLARE ReadCursor CURSOR FOR --聲明一個遊標
SELECT 操作員編號,操作員姓名,操作員性別,操作員住址
FROM 操作員資訊表
OPEN ReadCursor --開啟遊標
FETCH NEXT FROM ReadCursor --執行取數操作
WHILE @@FETCH_STATUS=0 --檢查@@FETCH_STATUS,以確定是否還可以繼續取數
BEGIN
FETCH NEXT FROM ReadCursor
END
關閉遊標
當遊標使用完畢之後,使用CLOSE語句可以關閉遊標,但不釋放遊標佔用的系統資源。
文法:
CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }
參數說明:
l GLOBAL:指定cursor_name為全域遊標。
l cursor_name:開放遊標的名稱。如果全域遊標和局部遊標都使用cursor_name作為它們的名稱,那麼當指定GLOBAL時,cursor_name引用全域遊標;否則,cursor_name引用局部遊標。
l cursor_variable_name:與開放遊標關聯的遊標變數名稱。
樣本:
聲明一個名為“CloseCursor”的遊標,並使用Close語句關閉遊標。
SQL語句如下:
USE 銷售管理系統 --引入資料庫
DECLARE CloseCursor Cursor FOR --聲明遊標
SELECT * FROM 銷售表
FOR READ ONLY
OPEN CloseCursor --開啟遊標
CLOSE CloseCursor --關閉遊標
釋放遊標
當遊標關閉之後,並沒有在記憶體中釋放所佔用的系統資源,所以可以使用DEALLOCATE命令刪除遊標引用。當釋放最後的遊標引用時,組成該遊標的資料結構由SQL Server釋放。
文法:
DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }
參數說明:
l cursor_name:已聲明遊標的名稱。當全域和局部遊標都以cursor_name作為它們的名稱存在時,如果指定GLOBAL,則cursor_name引用全域遊標,如果未指定GLOBAL,則cursor_name引用局部遊標。
l @cursor_variable_name:cursor變數的名稱。@cursor_variable_name必須為cursor類型。
當使用DEALLOCATE @cursor_variable_name來刪除遊標時,遊標變數並不會被釋放,除非超過使用該遊標的預存程序和觸發器的範圍。
樣本:
使用DEALLOCATE命令釋放名為“FreeCursor”的遊標。
SQL語句如下:
USE 銷售管理系統
DECLARE FreeCursor Cursor FOR --聲明遊標
SELECT * FROM 銷售表
OPEN FreeCursor --開啟遊標
Close FreeCursor --關閉遊標
DEALLOCATE FreeCursor --釋放遊標
建立遊標變數
在批處理或過程的本文中用DECLARE語句聲明變數,並用SET或SELECT語句給其指派值。遊標變數可通過該語句聲明,並且可用在其他與遊標相關的語句中。所有變數在聲明後均初始化為NULL。
首先建立一個遊標並開啟該遊標,之後建立一個遊標變數並將遊標的值(SELECT * FROM Jobs)賦給遊標變數,並通過FETCH語句讀取遊標變數中的值,最後關閉並釋放遊標。
程式運行結果1所示。
圖1 建立遊標變數
SQL語句如下:
USE pubs
DECLARE MyCursor_001 Cursor FOR --建立遊標
SELECT * FROM Jobs
OPEN MyCursor_001 --開啟遊標DECLARE @CursorVar Cursor --建立遊標變數
SET @CursorVar = MyCursor_001 --為遊標變數賦值
FETCH NEXT FROM @CursorVar --讀取遊標變數中的值
CLOSE MyCursor_001 --關閉遊標
DEALLOCATE MyCursor_001 --釋放遊標
靜態資料指標
靜態資料指標的完整結果集在遊標開啟時建立在tempdb中。靜態資料指標總是按照遊標開啟時的原樣顯示結果集。靜態資料指標在滾動期間很少或根本檢測不到變化,雖然它在tempdb中儲存了整個遊標,但消耗的資源很少。儘管動態資料指標使用tempdb的程度最低,在滾動期間它能夠檢測到所有變化,但消耗的資源也更多。鍵集驅動遊標介於二者之間,它能檢測到大部分的變化,但比動態資料指標消耗更少的資源。
動態資料指標
動態資料指標與靜態資料指標相對。當滾動遊標時,動態資料指標反映結果集中所做的所有更改。結果集中的行資料值、順序和成員在每次提取時都會改變。所有使用者做的全部UPDATE、INSERT和DELETE語句均通過遊標可見。
順向資料指標
順向資料指標不支援滾動,它只支援遊標從頭到尾順序提取。只在從資料庫中提取出來後才能行檢索。對所有由目前使用者發出或由其他使用者提交、並影響結果集中的行的INSERT、UPDATE和DELETE語句,其效果在這些行從遊標中提取時是可見的。
鍵集驅動遊標
開啟遊標時,鍵集驅動遊標中的成員和行順序是固定的。鍵集驅動遊標由一套被稱為鍵集的惟一標識符(鍵)控制。鍵由以惟一方式在結果集中標識行的列構成。鍵集是遊標開啟時來自所有適合SELECT語句的行中的一系列索引值。鍵集驅動遊標的鍵集在遊標開啟時建立在tempdb中。
對非鍵集列中的資料值所做的更改(由遊標所有者更改或其他使用者提交)在使用者滾動遊標時是可見的。在遊標外對資料庫所做的插入在遊標內是不可見的,除非關閉並重新開啟遊標。
使用遊標修改資料
本節主要介紹如何使用遊標修改資料
在查詢分析器中聲明變數,並設定@id變數的值,然後聲明一個遊標並開啟該遊標,使用FETCH NEXT方法來擷取遊標的下一行資料,並將此資料賦值給變數,如果FETCH語句執行成功則判斷當前遊標所指定的操作員編號是否與變數@id相等,如果相等則更新資料,最後關閉遊標並釋放遊標所佔用的資源。
程式運行結果1所示。
將編號為“CY20061010001”的操作員年齡修改為“30”歲
圖1 使用遊標修改資料
SQL語句如下:
Declare @id char(20) /*聲明變數*/
declare @ids char(20)
declare @names char(20)
set @id='CY20061010001' --為變數賦值
DECLARE authors_cursor CURSOR --聲明遊標
FOR SELECT 操作員編號,操作員姓名 FROM 操作員資訊表
OPEN authors_cursor --開啟遊標
FETCH NEXT FROM authors_cursor --擷取遊標的下一行資料
into @ids,@names --使變數獲得當前遊標指定行的操作員編號和操作員姓名
WHILE @@FETCH_STATUS = 0 --FETCH語句執行成功
BEGIN
if @id=@ids --判斷變數的值是否與遊標指定的操作員編號相等
begin
--更新指定條件的操作員年齡
update 操作員資訊表 set 操作員年齡=30 where 操作員編號 = @ids
end
FETCH NEXT FROM authors_cursor --擷取遊標的下一行
into @ids,@names --使變數獲得當前遊標指定行的操作員編號和操作員姓名
End
CLOSE authors_cursor --關閉遊標
DEALLOCATE authors_cursor --釋放遊標
SELECT * FROM 操作員資訊表 --重新選擇操作員資訊表
使用遊標刪除資料
Transact-SQL指令碼、預存程序和觸發器可以使用DELETE語句中的WHERE CURRENT OF子句刪除它們當前所處的遊標行。
文法:
Delete table_name
SET column_name1-{expression1|NULL(select_statement)}
[,column_name2={expression2|NULL(select_statement)}
WHERE CURRENT OF cursor_name
參數說明:
l table_name:用來指定UPDATE或DELETE的表名。
l column_name:用來指定UPDATE的列名。
l cursor_name:用來指定遊標的名稱。
下面介紹如何使用WHERE CURRENT OF方法刪除資料
聲明一個遊標並開啟,然後使用FETCH NEXT方法將遊標指標下移一行,最後使用WHERE CURRENT OF方法刪除指定條件的資料,然後關閉並釋放遊標所佔用的系統資源。
SQL語句如下:
USE 銷售管理系統 --引入資料庫
DECLARE deletecursor CURSOR --聲明遊標
FOR SELECT * FROM 操作員資訊表
WHERE 操作員編號 = 'CY20061010211'
OPEN deletecursor --開啟遊標
GO
FETCH NEXT FROM deletecursor --遊標指標下移一行
DELETE 操作員資訊表
WHERE CURRENT OF deletecursor --刪除指定條件的資料
FETCH NEXT FROM deletecursor
GO
CLOSE deletecursor --關閉遊標
DEALLOCATE deletecursor --釋放遊標
GO
下面介紹如何使用遊標刪除資料
在查詢分析器中聲明變數,並設定@age變數的值,然後聲明一個遊標並開啟該遊標,使用FETCH NEXT方法來擷取遊標的下一行資料,並將此資料賦值給變數,如果FETCH語句執行成功,則判斷當前遊標所指定的操作員年齡是否與變數@age相等,如果相等,則刪除此資料,最後關閉遊標並釋放遊標所佔用的系統資源。
SQL語句如下:
USE 銷售管理系統 --引入資料庫
DECLARE @id char(20) /*聲明變數*/
DECLARE @names char(20)
DECLARE @age int
SET @age = 30 --為變數賦值
DECLARE @ages int
DECLARE deletecursor Cursor For --聲明遊標
SELECT 操作員編號,操作員姓名,操作員年齡 FROM 操作員資訊表
OPEN deletecursor --開啟遊標
FETCH NEXT FROM deletecursor --擷取遊標的下一行
--使變數獲得當前遊標指定行的操作員編號,操作員姓名,操作員年齡
into @id,@names,@ages
WHILE @@FETCH_STATUS = 0 --FETCH語句執行成功
BEGIN
if @age = @ages --判斷變數的值是否與遊標指定的操作員年齡相等
BEGIN
--刪除指定條件的資料
DELETE 操作員資訊表 WHERE 操作員年齡 = @ages
END
FETCH NEXT FROM deletecursor --擷取遊標的下一行
--使變數獲得當前遊標指定行的操作員編號,操作員姓名,操作員年齡
into @id,@names,@ages
END
CLOSE deletecursor --關閉遊標
DEALLOCATE deletecursor --釋放遊標
將遊標中的資料進行排序顯示
在DECLARE CURSOR語句中,將ORDER BY子句添加到查詢中使遊標資料排序。
ORDERY BY子句文法:
ORDER BY <column name> [ ASC | DESC ]
[ ,...<last column name> [ ASC | DESC ]]
注意:與非遊標的SELECT語句中的ORDER BY子句不同,只有在查詢的SELECT子句中列出的供顯示的列才能作為ORDER BY子句中的列出現(在非遊標的SELECT語句中,表中任何在查詢的FROM子句中列出的列都可能出現在ORDER BY子句中,即使列沒有在SELECT子句中)。
下面將遊標中的資料進行排序顯示
在聲明的mycursor遊標中選擇指定的資料列,並將庫存數量進行降序顯示。
程式運行結果1所示。
SQL語句如下:
USE 銷售管理系統
DECLARE mycursor CURSOR
FOR SELECT 商品編號,商品名稱,庫存數量,庫存金額
FROM 庫存表
ORDER BY 庫存數量 DESC
OPEN mycursor
FETCH NEXT FROM mycursor
WHILE @@FETCH_STATUS = 0
FETCH NEXT FROM mycursor
CLOSE mycursor
DEALLOCATE mycursor
使用FETCH語句將資料值存入變數
本例將“操作員資訊表”中“操作員性別”為“男”的資料存放區在變數中,然後利用PRINT語句將變數中的資料一一輸出。
程式運行結果1所示。
圖1 使用FETCH語句將資料值存入變數
SQL語句如下:
USE 銷售管理系統
GO
DECLARE @names char(20),@age char(20),@sex char(20) --聲明變數
DECLARE mycursor Cursor FOR --聲明遊標
SELECT 操作員姓名,操作員年齡,操作員性別 FROM 操作員資訊表
WHERE 操作員性別 = '男'
ORDER BY 操作員編號 --按操作員編號進行排序
OPEN mycursor --開啟遊標
PRINT '操作員姓名 '+'操作員年齡 '+'操作員性別 ' --使用PRINT語句輸出字串
FETCH NEXT FROM mycursor --遊標指標下移一行
INTO @names,@age,@sex
WHILE @@FETCH_STATUS = 0 --FETCH語句執行成功
BEGIN
PRINT + @names + @age + @sex --使用PRINT語句將資料輸出
FETCH NEXT FROM mycursor
INTO @names,@age,@sex
END
CLOSE mycursor --關閉遊標
DEALLOCATE mycursor --釋放遊標
GO
在遊標中包含計算資料行
本執行個體介紹如何在遊標中包含計算資料行。
聲明一個遊標,在SELECT語句中選擇資料表中的某些資料欄位,並將數量欄位與金額欄位中的資料進行相乘計算,然後通過FETCH NEXT語句每次向下移動遊標指標,將當前指定的資料進行計算,最後關閉並釋放遊標。
程式運行結果1所示。
圖1 計算商品銷售總金額
SQL語句如下:
DECLARE cur CURSOR --聲明遊標
FOR SELECT 商品編號,商品名稱,數量,金額,
數量*金額 as 銷售總額
FROM 銷售表
OPEN cur庫 --開啟遊標
FETCH NEXT FROM cur
WHILE @@FETCH_STATUS = 0 --FETCH語句執行成功
BEGIN
FETCH NEXT FROM cur
END
CLOSE cur --關閉遊標
DEALLOCATE cur --釋放遊標
SELECT * FROM 銷售表 --選擇銷售表
轉:http://ntk2006.blog.sohu.com/135331235.html