1 ? ?什么是游標:
關系數據庫中的操作會對整個行集起作用。 例如,由 SELECT 語句返回的行集包括滿足該語句的 WHERE 子句中條件的所有行。 這種由語句返回的完整行集稱為結果集。 應用程序,特別是交互式聯機應用程序,并不總能將整個結果集作為一個單元來有效地處理。 這些應用程序需要一種機制以便每次處理一行或一部分行。 游標就是提供這種機制的對結果集的一種擴展。
游標通過以下方式來擴展結果處理:
- 允許定位在結果集的特定行。
- 從結果集的當前位置檢索一行或一部分行。
- 支持對結果集中當前位置的行進行數據修改。
- 為由其他用戶對顯示在結果集中的數據庫數據所做的更改提供不同級別的可見性支持。
- 提供腳本、存儲過程和觸發(fā)器中用于訪問結果集中的數據的 Transact-SQL 語句。 ?
——MSDN
不難理解,游標與其他數據庫操作的最大不同就是對象是單條記錄而不是結果集,一般用于過程化程序里嵌入的SQL語句。在數據庫服務程序里用到了自動隱含創(chuàng)建的游標。
?
2 ? ?基本用法:
2.1 聲明游標
DECLARE 游標名 CURSOR
FOR SELECT語句
2.2 打開游標
OPEN 游標名
2.3 從游標獲取數據
FETCH NEXT FROM 游標名 [ INTO FETCH_LIST ]
從游標獲取數據需要注意可能到達游標末尾,以下方法解決這個問題以避免用戶在關閉游標時產生錯誤
1
BEGIN
2
DECLARE
@custname
VARCHAR
(
20
)
3
DECLARE
namecursor
CURSOR
FOR
SELECT
CUST_NAME
FROM
TBL_CUSTOMER
OPEN
namecursor
4
FETCH
NEXT
FROM
namecursor
INTO
@custname
5
WHILE
(
@@FETCH_STATUS
<>
-
1
)
6
BEGIN
7
IF
(
@@FETCH_STATUS
<>
-
2
)
8
BEGIN
9
--
操作游標變量
10
END
11
FETCH
NEXT
FROM
namecursor
INTO
@custname
12
END
13
CLOSE
namecursor
14
DEALLOCATE
namecursor
15
END
2.4 關閉游標
CLOSE 游標名
關閉后不能對游標進行讀取等操作,但可以使用OPEN語句再次打開
2.5 釋放游標
DEALLOCATE 游標名
即刪除游標,不可再使用
?
3 ? ?一個有意思的小例子:
雖然知道了游標的概念和基本用法,但對于什么時候用游標還很模糊,甚至誤認為游標可以被子查詢所代替。直到遇到了這個有意思的小例子:
表結構如下:
題目要求是: 列出從事同一種工作但屬于不同部門的雇員的不同組合
即如下結果:
在想盡了子查詢、表連接、建臨時表等等辦法之后,我發(fā)現我遇到了一個不可逾越的障礙:無法排除兩個名字組合的唯一性。即:我得到的結果可能是如下
| ANAME | BNAME |
| Adams | James |
| James | Adams |
?
?
?
最終我想到了剛學到的游標,代碼如下
1
SELECT
A.Ename
AS
ANAME, B.Ename
AS
BNAME
2
INTO
#t
3
FROM
EMP A
4
JOIN
EMP B
5
ON
A.job
=
B.job
AND
A.deptNo
<>
B.deptNo
and
A.Ename
<>
b.Ename
6
ORDER
BY
ANAME
7
8
DECLARE
TEST_CURSOR
CURSOR
FOR
9
SELECT
ANAME, BNAME
FROM
#t
10
11
OPEN
TEST_CURSOR
12
DECLARE
@ANAME
VARCHAR
(
20
)
13
DECLARE
@BNAME
VARCHAR
(
20
)
14
15
FETCH
NEXT
FROM
TEST_CURSOR
INTO
@ANAME
,
@BNAME
16
DELETE
FROM
#t
WHERE
ANAME
=
@BNAME
AND
BNAME
=
@ANAME
17
WHILE
@@FETCH_STATUS
=
0
18
BEGIN
19
FETCH
NEXT
FROM
TEST_CURSOR
INTO
@ANAME
,
@BNAME
20
DELETE
FROM
#t
WHERE
ANAME
=
@BNAME
AND
BNAME
=
@ANAME
21
END
22
23
CLOSE
TEST_CURSOR
24
DEALLOCATE
TEST_CURSOR
25
26
SELECT
*
FROM
#t
最終得到了預期結果,但我想這個問題可能不止這一種解法,希望有其他解法的大牛能指點一二 ^^
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

