能夠一次與一個單獨的數(shù)據(jù)進行交互的方法,然而,不能通_第1頁
能夠一次與一個單獨的數(shù)據(jù)進行交互的方法,然而,不能通_第2頁
能夠一次與一個單獨的數(shù)據(jù)進行交互的方法,然而,不能通_第3頁
能夠一次與一個單獨的數(shù)據(jù)進行交互的方法,然而,不能通_第4頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第13章 游標(biāo)的使用1311游標(biāo)的使用( 視頻講解:13分鐘)第第 章章導(dǎo)讀游標(biāo)是取用一組數(shù)據(jù)并能夠一次與一個單獨的數(shù)據(jù)進行交互的方法,然而,不能通過在整個行集中修改或者選取數(shù)據(jù)來獲得所需要的結(jié)果。本章將對游標(biāo)的使用進行詳細(xì)講解。通過閱讀本章,您可以:: 掌握游標(biāo)的概念: 了解游標(biāo)的類型: 掌握游標(biāo)的基本操作: 了解游標(biāo)系統(tǒng)存儲過程: 掌握使用系統(tǒng)過程查看游標(biāo)的方法13.1 游標(biāo)的概述視頻講解:光盤TMlx13游標(biāo)的概述.mp4游標(biāo)是取用一組數(shù)據(jù)并能夠一次與一個單獨的數(shù)據(jù)進行交互的方法。關(guān)系數(shù)據(jù)庫中的操作會對整個行集起作用。由SELECT語句返回的行集包括滿足該語句的WHERE子句中條件的所有

2、行。這種由語句返回的完整行集稱為結(jié)果集。應(yīng)用程序,特別是交互式聯(lián)機應(yīng)用程序,并不總能將整個結(jié)果集作為一個單元來有效地處理。這些應(yīng)用程序需要一種機制以便每次處理一行或一部分行。游標(biāo)就是提供這種機制并對結(jié)果集的一種擴展。游標(biāo)通過以下方式來擴展結(jié)果處理: þ 允許定位在結(jié)果集的特定行。þ 從結(jié)果集的當(dāng)前位置檢索一行或一部分行。þ 支持對結(jié)果集中當(dāng)前位置的行進行數(shù)據(jù)修改。þ 為由其他用戶對顯示在結(jié)果集中的數(shù)據(jù)庫數(shù)據(jù)所做的更改提供不同級別的可見性支持。þ 提供腳本、存儲過程和觸發(fā)器中用于訪問結(jié)果集中的數(shù)據(jù)的 Transact-SQL 語句。游標(biāo)可以定在該

3、單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行。可以對結(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)時,游標(biāo)顯得十分重要。13.1.1 游標(biāo)的實現(xiàn)游標(biāo)提供了一種從表中檢索數(shù)據(jù)并進行操作的靈活手段,游標(biāo)主要用在服務(wù)器上,處理由客戶端發(fā)送給服務(wù)器端的SQL語句,或是批處理、存儲過程、觸發(fā)器中的數(shù)據(jù)處理請求。游標(biāo)的優(yōu)點在于它可以定位到結(jié)果集中的某一行,并可以對該行數(shù)據(jù)執(zhí)行特定操作,為用戶在處理數(shù)據(jù)的過程中提供了很大方便。一個完整的游標(biāo)由5部分組成,并且這5個部分應(yīng)符合下面的順序。(1)聲明游標(biāo)。(2)打開游標(biāo)。(3)從一個游標(biāo)中查找信息。(4)關(guān)閉游標(biāo)。(5)釋放游標(biāo)。13.1.2 游標(biāo)的

4、類型SQL Server提供了4種類型的游標(biāo):靜態(tài)游標(biāo)、動態(tài)游標(biāo)、只進游標(biāo)和鍵集驅(qū)動的游標(biāo)。這些游標(biāo)的檢測結(jié)果集變化的能力和內(nèi)存占用的情況都有所不同,數(shù)據(jù)源沒有辦法通知游標(biāo)當(dāng)前提取行的更改。游標(biāo)檢測這些變化的能力也受事務(wù)隔離級別的影響。1靜態(tài)游標(biāo)靜態(tài)游標(biāo)的完整結(jié)果集在游標(biāo)打開時建立在tempdb中。靜態(tài)游標(biāo)總是按照游標(biāo)打開時的原樣顯示結(jié)果集。靜態(tài)游標(biāo)在滾動期間很少或根本檢測不到變化,雖然它在tempdb中存儲了整個游標(biāo),但消耗的資源很少。盡管動態(tài)游標(biāo)使用tempdb的程度最低,在滾動期間它能夠檢測到所有變化,但消耗的資源也更多。鍵集驅(qū)動游標(biāo)介于二者之間,它能檢測到大部分的變化,但比動態(tài)游標(biāo)消耗

5、更少的資源。2動態(tài)游標(biāo)動態(tài)游標(biāo)與靜態(tài)游標(biāo)相對。當(dāng)滾動游標(biāo)時,動態(tài)游標(biāo)反映結(jié)果集中所做的所有更改。結(jié)果集中的行數(shù)據(jù)值、順序和成員在每次提取時都會改變。所有用戶做的全部UPDATE、INSERT和DELETE語句均通過游標(biāo)可見。3只進游標(biāo)只進游標(biāo)不支持滾動,它只支持游標(biāo)從頭到尾順序提取。只有從數(shù)據(jù)庫中提取出來后才能進行檢索。對所有由當(dāng)前用戶發(fā)出或由其他用戶提交、并影響結(jié)果集中的行的INSERT、UPDATE和DELETE語句,其效果在這些行從游標(biāo)中提取時是可見的。4鍵集驅(qū)動游標(biāo)打開游標(biāo)時,鍵集驅(qū)動游標(biāo)中的成員和行順序是固定的。鍵集驅(qū)動游標(biāo)由一套被稱為鍵集的唯一標(biāo)識符(鍵)控制。鍵由以唯一方式在結(jié)果

6、集中標(biāo)識行的列構(gòu)成。鍵集是游標(biāo)打開時來自所有適合SELECT語句的行中的一系列鍵值。鍵集驅(qū)動游標(biāo)的鍵集在游標(biāo)打開時建立在tempdb中。對非鍵集列中的數(shù)據(jù)值所做的更改(由游標(biāo)所有者更改或其他用戶提交)在用戶滾動游標(biāo)時是可見的。在游標(biāo)外對數(shù)據(jù)庫所做的插入在游標(biāo)內(nèi)是不可見的,除非關(guān)閉并重新打開游標(biāo)。13.2 游標(biāo)的基本操作視頻講解:光盤TMlx13游標(biāo)的基本操作.mp4游標(biāo)的基本操作包括聲明游標(biāo)、打開游標(biāo)、讀取游標(biāo)中的數(shù)據(jù)、關(guān)閉游標(biāo)和釋放游標(biāo)。本節(jié)就詳細(xì)介紹如何操作游標(biāo)。13.2.1 聲明游標(biāo)聲明游標(biāo)可以使用DECLARE CURSOR語句。此語句有兩種語法聲明格式,分別為ISO標(biāo)準(zhǔn)語法和Tran

7、sact-SQL擴展的語法,下面將分別介紹聲明游標(biāo)的兩種語法格式。1ISO標(biāo)準(zhǔn)語法語法如下:DECLARE cursor_name INSENSITIVE SCROLL CURSOR FOR select_statement FOR READ ONLY | UPDATE OF column_name ,.n 參數(shù)說明如下。þ DECLARE cursor_name:指定一個游標(biāo)名稱,其游標(biāo)名稱必須符合標(biāo)識符規(guī)則。þ INSENSITIVE:定義一個游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時復(fù)本。對游標(biāo)的所有請求都從tempdb中的臨時表中得到應(yīng)答;因此,在對該游標(biāo)進行提取操作時

8、返回的數(shù)據(jù)中不反映對基表所做的修改,并且該游標(biāo)不允許修改。使用SQL-92語法時,如果省略INSENSITIVE,(任何用戶)對基表提交的刪除和更新都反映在后面的提取中。þ SCROLL:指定所有的提取選項(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。Ø FIRST:取第一行數(shù)據(jù)。Ø LAST:取最后一行數(shù)據(jù)。Ø PRIOR:取前一行數(shù)據(jù)。Ø NEXT:取后一行數(shù)據(jù)。Ø RELATIVE:按相對位置取數(shù)據(jù)。Ø ABSOLUTE:按絕對位置取數(shù)據(jù)。如果未指定SCROLL,則NEXT是

9、唯一支持的提取選項。þ select_statement:定義游標(biāo)結(jié)果集的標(biāo)準(zhǔn)SELECT語句。在游標(biāo)聲明的select_statement內(nèi)不允許使用關(guān)鍵字COMPUTE、COMPUTE BY、FOR BROWSE和INTO。þ READ ONLY:表明不允許游標(biāo)內(nèi)的數(shù)據(jù)被更新,盡管在默認(rèn)狀態(tài)下游標(biāo)是允許更新的。在UPDATE或DELETE語句的WHERE CURRENT OF子句中不允許引用游標(biāo)。þ UPDATE OF column_name ,.n :定義游標(biāo)內(nèi)可更新的列。如果指定OF column_name ,.n參數(shù),則只允許修改所列出的列。如果在UPD

10、ATE中未指定列的列表,則可以更新所有列。2Transact-SQL擴展的語法語法如下: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 DECLARE CURSOR語句的參數(shù)及說明如表13.1所示。表13.1 DECLARE CURS

11、OR語句的參數(shù)及說明參 數(shù)描 述DECLARE cursor_name指定一個游標(biāo)名稱,其游標(biāo)名稱必須符合標(biāo)識符規(guī)則LOCAL定義游標(biāo)的作用域僅限在其所在的批處理、存儲過程或觸發(fā)器中。當(dāng)建立游標(biāo)在存儲過程執(zhí)行結(jié)束后,游標(biāo)會被自動釋放GLOBAL指定該游標(biāo)的作用域?qū)B接是全局的。在由連接執(zhí)行的任何存儲過程或批處理中,都可以引用該游標(biāo)名稱。該游標(biāo)僅在脫接時隱性釋放FORWARD_ONLY指定游標(biāo)只能從第一行滾動到最后一行。FETCH NEXT是唯一受支持的提取選項非指定STATIC、KEYSET或DYNAMIC關(guān)鍵字,否則默認(rèn)為FORWARD_ONLY。STATIC、KEYSET和DYNAMIC游

12、標(biāo)默認(rèn)為SCROLL。與ODBC和ADO這類數(shù)據(jù)庫API不同,STATIC、KEYSET和DYNAMIC Transact-SQL游標(biāo)支持FORWARD_ONLY。FAST_ FORWARD和FORWARD_ONLY是互斥的;如果指定一個,則不能指定另一個STATIC定義一個游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時復(fù)本。對游標(biāo)的所有請求都從tempdb中的該臨時表中得到應(yīng)答;因此,在對該游標(biāo)進行提取操作時返回的數(shù)據(jù)中不反映對基表所做的修改,并且該游標(biāo)不允許修改KEYSET指定當(dāng)游標(biāo)打開時,游標(biāo)中行的成員資格和順序已經(jīng)固定。對行進行唯一標(biāo)識的鍵集內(nèi)置在tempdb內(nèi)一個稱為keyset的

13、表中。對基表中的非鍵值所做的更改(由游標(biāo)所有者更改或由其他用戶提交)在用戶滾動游標(biāo)時是可視的。其他用戶進行的插入是不可視的(不能通過Transact-SQL服務(wù)器游標(biāo)進行插入)。如果某行已刪除,則對該行的提取操作將返回FETCH_STATUS值-2。從游標(biāo)外更新鍵值類似于刪除舊行后接著插入新行的操作。含有新值的行不可視,對含有舊值的行的提取操作將返回FETCH_STATUS值-2。如果通過指定WHERE CURRENT OF子句用游標(biāo)完成更新,則新值可視DYNAMIC定義一個游標(biāo),以反映在滾動游標(biāo)時對結(jié)果集內(nèi)的行所做的所有數(shù)據(jù)的更改。行的數(shù)據(jù)值、順序和成員在每次提取時都會更改。動態(tài)游標(biāo)不支持A

14、BSOLUTE提取選項FAST_FORWARD指明一個FORWARD_ONLY、READ_ONLY型游標(biāo)SCROLL_LOCKS指定確保通過游標(biāo)完成的定位更新或定位刪除可以成功。將行讀入游標(biāo)以確保它們可用于以后的修改時,SQL Server會鎖定這些行。如果還指定了FAST_FORWARD,則不能指定SCROLL_LOCKSOPTIMISTIC指明在數(shù)據(jù)被讀入游標(biāo)后,如果游標(biāo)中某行數(shù)據(jù)已發(fā)生變化,那么對游標(biāo)數(shù)據(jù)進行更新或刪除可能會導(dǎo)致失敗TYPE_WARNING指定如果游標(biāo)從所請求的類型隱性轉(zhuǎn)換為另一種類型,則給客戶端發(fā)送警告消息【例13.1】 創(chuàng)建一個名為Cur_Emp的標(biāo)準(zhǔn)游標(biāo)。(實例位置

15、:光盤TMsl131)SQL語句如下:USE db_2012DECLARE Cur_Emp CURSOR FORSELECT * FROM EmployeeGO運行結(jié)果如圖13.1所示。【例13.2】 創(chuàng)建一個名為Cur_Emp_01的只讀游標(biāo)。(實例位置:光盤TMsl132)SQL語句如下:USE db_2012DECLARE Cur_Emp_01 CURSOR FORSELECT * FROM EmployeeFOR READ ONLY -只讀游標(biāo)GO運行結(jié)果如圖13.2所示。 圖13.1 創(chuàng)建標(biāo)準(zhǔn)游標(biāo)   圖13.2 創(chuàng)建只讀游標(biāo)【例13.3】 創(chuàng)建一個名為Cur_Emp_02

16、的更新游標(biāo)。(實例位置:光盤TMsl133)SQL語句如下:USE db_2012DECLARE Cur_Emp_02 CURSOR FORSELECT Name,Sex,Age FROM EmployeeFOR UPDATE -更新游標(biāo)GO運行結(jié)果如圖13.3所示。圖13.3 創(chuàng)建更新游標(biāo)13.2.2 打開游標(biāo)打開一個聲明的游標(biāo)可以使用OPEN命令。語法如下:OPEN GLOBAL cursor_name | cursor_variable_name 參數(shù)說明如下。þ GLOBAL:指定cursor_name為全局游標(biāo)。þ cursor_name:已聲明的游標(biāo)名稱,如果全

17、局游標(biāo)和局部游標(biāo)都使用cursor_name作為其名稱,那么如果指定了GLOBAL,cursor_name指的是全局游標(biāo),否則,cursor_name指的是局部游標(biāo)。þ cursor_variable_name:游標(biāo)變量的名稱,該名稱引用一個游標(biāo)。如果使用INSENSITIV或STATIC選項聲明了游標(biāo),那么OPEN將創(chuàng)建一個臨時表以保留結(jié)果集。如果結(jié)果集中任意行的大小超過SQL Server表的最大行大小,OPEN將失敗。如果使用KEYSET選項聲明了游標(biāo),那么OPEN將創(chuàng)建一個臨時表以保留鍵集。臨時表存儲在tempdb中。【例13.4】 首先聲明一個名為Emp_01的游標(biāo),然后使

18、用OPEN命令打開該游標(biāo)。(實例位置:光盤TMsl134)SQL語句如下:USE db_2012DECLARE Emp_01 CURSOR FOR-聲明游標(biāo)SELECT * FROM EmployeeWHERE ID = '1'OPEN Emp_01-打開游標(biāo)GO運行結(jié)果如圖13.4所示。圖13.4 打開游標(biāo)13.2.3 讀取游標(biāo)中的數(shù)據(jù)當(dāng)打開一個游標(biāo)之后,就可以讀取游標(biāo)中的數(shù)據(jù)了。可以使用FETCH命令讀取游標(biāo)中的某一行數(shù)據(jù)。語法如下:FETCH NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | nvar | RELATIVE n | nv

19、ar FROM GLOBAL cursor_name | cursor_variable_name INTO variable_name ,.n FETCH命令的參數(shù)及說明如表13.2所示。表13.2 FETCH命令的參數(shù)及說明參 數(shù)描 述NEXT返回緊跟當(dāng)前行之后的結(jié)果行,并且當(dāng)前行遞增為結(jié)果行。如果FETCH NEXT為對游標(biāo)的第一次提取操作,則返回結(jié)果集中的第一行。NEXT為默認(rèn)的游標(biāo)提取選項PRIOR返回緊臨當(dāng)前行前面的結(jié)果行,并且當(dāng)前行遞減為結(jié)果行。如果FETCH PRIOR為對游標(biāo)的第一次提取操作,則沒有行返回并且游標(biāo)置于第一行之前FIRST返回游標(biāo)中的第一行并將其作為當(dāng)前行LAS

20、T返回游標(biāo)中的最后一行并將其作為當(dāng)前行ABSOLUTE n | nvar如果n或nvar為正數(shù),返回從游標(biāo)頭開始的第n行,并將返回的行變成新的當(dāng)前行。如果n或nvar為負(fù)數(shù),返回游標(biāo)尾之前的第n行,并將返回的行變成新的當(dāng)前行。如果n或nvar為0,則沒有行返回RELATIVE n | nvar如果n或nvar為正數(shù),返回當(dāng)前行之后的第n行,并將返回的行變成新的當(dāng)前行。如果n或nvar為負(fù)數(shù),返回當(dāng)前行之前的第n行,并將返回的行變成新的當(dāng)前行。如果n或nvar為0,返回當(dāng)前行。如果對游標(biāo)的第一次提取操作時將FETCHRELATIVE的n或nvar指定為負(fù)數(shù)或0,則沒有行返回。n必須為整型常量且n

21、var必須為smallint、tinyint或intGLOBAL指定cursor_name為全局游標(biāo)cursor_name要從中進行提取的開放游標(biāo)的名稱。如果同時有以cursor_name作為名稱的全局和局部游標(biāo)存在,若指定為GLOBAL,則cursor_name對應(yīng)于全局游標(biāo),未指定GLOBAL,則對應(yīng)于局部游標(biāo)cursor_variable_name游標(biāo)變量名,引用要進行提取操作的打開的游標(biāo)INTO variable_name,.n允許將提取操作的列數(shù)據(jù)放到局部變量中。列表中的各個變量從左到右與游標(biāo)結(jié)果集中的相應(yīng)列相關(guān)聯(lián)。各變量的數(shù)據(jù)類型必須與相應(yīng)的結(jié)果列的數(shù)據(jù)類型匹配或是結(jié)果列數(shù)據(jù)類型所

22、支持的隱性轉(zhuǎn)換。變量的數(shù)目必須與游標(biāo)選擇列表中的列的數(shù)目一致FETCH_STATUS返回上次執(zhí)行FETCH命令的狀態(tài)。在每次用FETCH從游標(biāo)中讀取數(shù)據(jù)時,都應(yīng)檢查該變量,以確定上次FETCH操作是否成功,決定如何進行下一步處理。FETCH_STATUS變量有3個不同的返回值,說明如下:(1)返回值為0,F(xiàn)ETCH語句成功;(2)返回值為-1,F(xiàn)ETCH語句失敗或此行不在結(jié)果集中;(3)返回值為-2,被提取的行不存在(1)在前兩個參數(shù)中,包含n和nvar其表示游標(biāo)相對于作為基準(zhǔn)的數(shù)據(jù)行所偏離的位置。(2)當(dāng)使用SQL-92語法來聲明一個游標(biāo)時,沒有選擇SCROLL選項,則只能使用FETCH N

23、EXT命令來從游標(biāo)中讀取數(shù)據(jù),即只能從結(jié)果集第一行按順序地每次讀取一行。由于不能使用FIRST、LAST、PRIOR,所以無法回滾讀取以前的數(shù)據(jù)。如果選擇了SCROLL選項,則可以使用所有的FETCH操作。【例13.5】 用FETCH_STATUS 控制一個WHILE循環(huán)中的游標(biāo)活動,SQL語句及運行結(jié)果如圖13.5所示。(實例位置:光盤TMsl135)圖13.5 從游標(biāo)中讀取數(shù)據(jù)SQL語句如下:USE db_2012 -引入數(shù)據(jù)庫DECLARE ReadCursor CURSOR FOR-聲明一個游標(biāo)SELECT * FROM StudentOPEN ReadCursor-打開游標(biāo)FETCH

24、 NEXT FROM ReadCursor-執(zhí)行取數(shù)操作WHILE FETCH_STATUS=0-檢查FETCH_STATUS,以確定是否還可以繼續(xù)取數(shù)BEGIN FETCH NEXT FROM ReadCursorEND13.2.4 關(guān)閉游標(biāo)當(dāng)游標(biāo)使用完畢之后,使用CLOSE語句可以關(guān)閉游標(biāo),但不釋放游標(biāo)占用的系統(tǒng)資源。語法如下:CLOSE GLOBAL cursor_name | cursor_variable_name 參數(shù)說明如下。þ GLOBAL:指定cursor_name為全局游標(biāo)。þ cursor_name:開放游標(biāo)的名稱。如果全局游標(biāo)和局部游標(biāo)都使用curs

25、or_name作為它們的名稱,那么當(dāng)指定GLOBAL時,cursor_name引用全局游標(biāo);否則,cursor_name引用局部游標(biāo)。þ cursor_variable_name:與開放游標(biāo)關(guān)聯(lián)的游標(biāo)變量名稱。【例13.6】 聲明一個名為CloseCursor的游標(biāo),并使用Close語句關(guān)閉游標(biāo)。(實例位置:光盤 TMsl136)SQL語句如下:USE db_2012DECLARE CloseCursor Cursor FOR SELECT * FROM StudentFOR READ ONLYOPEN CloseCursorCLOSE CloseCursor運行結(jié)果如圖13.6所示

26、。圖13.6 關(guān)閉游標(biāo)13.2.5 釋放游標(biāo)當(dāng)游標(biāo)關(guān)閉之后,并沒有在內(nèi)存中釋放所占用的系統(tǒng)資源,所以可以使用DEALLOCATE命令刪除游標(biāo)引用。當(dāng)釋放最后的游標(biāo)引用時,組成該游標(biāo)的數(shù)據(jù)結(jié)構(gòu)由SQL Server釋放。語法如下:DEALLOCATE GLOBAL cursor_name | cursor_variable_name 參數(shù)說明如下。þ cursor_name:已聲明游標(biāo)的名稱。當(dāng)全局和局部游標(biāo)都以cursor_name作為它們的名稱存在時,如果指定GLOBAL,則cursor_name引用全局游標(biāo),如果未指定GLOBAL,則cursor_name引用局部游標(biāo)。þ

27、; cursor_variable_name:cursor變量的名稱。cursor_variable_name必須為cursor類型。當(dāng)使用DEALLOCATE cursor_variable_name來刪除游標(biāo)時,游標(biāo)變量并不會被釋放,除非超過使用該游標(biāo)的存儲過程和觸發(fā)器的范圍。【例13.7】 使用DEALLOCATE命令釋放名為FreeCursor的游標(biāo)。(實例位置:光盤TMsl137)SQL語句如下:USE db_2012DECLARE FreeCursor Cursor FORSELECT * FROM StudentOPEN FreeCursorClose FreeCursorDEA

28、LLOCATE FreeCursor運行結(jié)果如圖13.7所示。圖13.7 釋放游標(biāo)13.3 使用系統(tǒng)過程查看游標(biāo)視頻講解:光盤TMlx13使用系統(tǒng)過程查看游標(biāo).mp4創(chuàng)建游標(biāo)后,通常使用sp_cursor_list和sp_describe_cursor查看游標(biāo)的屬性。sp_cursor_list用來報告當(dāng)前為連接打開的服務(wù)器游標(biāo)的屬性,sp_describe_cursor用于報告服務(wù)器游標(biāo)的屬性。本節(jié)就詳細(xì)介紹這兩個系統(tǒng)過程。13.3.1 sp_cursor_listsp_cursor_list報告當(dāng)前為連接打開的服務(wù)器游標(biāo)的屬性。語法如下:sp_cursor_list cursor_retu

29、rn = cursor_variable_name OUTPUT , cursor_scope = cursor_scope參數(shù)說明如下。þ cursor_return = cursor_variable_name OUTPUT:已聲明的游標(biāo)變量的名稱。cursor_ variable_name的數(shù)據(jù)類型為 cursor,無默認(rèn)值。游標(biāo)是只讀的可滾動動態(tài)游標(biāo)。þ cursor_scope = cursor_scope:指定要報告的游標(biāo)級別。cursor_scope的數(shù)據(jù)類型為int,無默認(rèn)值,可取值如表13.3所示。表13.3 cursor_scope可取的值值說 明1報告

30、所有本地游標(biāo)2報告所有全局游標(biāo)3報告本地游標(biāo)和全局游標(biāo)【例13.8】 聲明一個游標(biāo)Cur_Employee,并使用sp_cursor_list報告該游標(biāo)的屬性。(實例位置:光盤TMsl138)SQL語句如下:USE db_2012GODECLARE Cur_Employee CURSOR FORSELECT NameFROM EmployeeWHERE Name LIKE '王%'OPEN Cur_EmployeeDECLARE Report CURSOREXEC master.dbo.sp_cursor_list cursor_return = Report OUTPUT,

31、cursor_scope = 2FETCH NEXT from ReportWHILE (FETCH_STATUS <> -1)BEGIN FETCH NEXT from ReportENDCLOSE ReportDEALLOCATE ReportGOCLOSE Cur_EmployeeDEALLOCATE Cur_EmployeeGO運行結(jié)果如圖13.8所示。圖13.8 sp_cursor_list屬性13.3.2 sp_describe_cursorsp_describe_cursor用于報告服務(wù)器游標(biāo)的屬性。語法如下:sp_describe_cursor cursor_ret

32、urn = output_cursor_variable OUTPUT , cursor_source = N'local' , cursor_identity = N'local_cursor_name' | , cursor_source = N'global' , cursor_identity = N'global_cursor_name' | , cursor_source = N'variable' , cursor_identity = N'input_cursor_variable'

33、 sp_describe_cursor語句的參數(shù)及說明如表13.4所示。表13.4 sp_describe_cursor語句的參數(shù)及說明參 數(shù)描 述 cursor_return = output_ cursor_variable OUTPUT用于接收游標(biāo)輸出的聲明游標(biāo)變量的名稱。output_cursor_variable的數(shù)據(jù)類型為cursor,無默認(rèn)值。調(diào)用sp_describe_cursor時,該參數(shù)不得與任何游標(biāo)關(guān)聯(lián)。返回的游標(biāo)是可滾動的動態(tài)只讀游標(biāo) cursor_source = N'local'| N'global' | N'variable' 指定是使用局部游標(biāo)的名稱、全局游標(biāo)的名稱還是游標(biāo)變量的名稱來指定要報告的游標(biāo)。該參數(shù)的類型為nvarchar(30) cursor_identity = N'local_ cursor_name' 由具有LOCAL關(guān)鍵字或默認(rèn)設(shè)置為LOCAL的DECLARE CURSOR語句創(chuàng)建的游標(biāo)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論