



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第13章 游標(biāo)的使用1311游標(biāo)的使用( 視頻講解:13分鐘)第第 章章導(dǎo)讀游標(biāo)是取用一組數(shù)據(jù)并能夠一次與一個(gè)單獨(dú)的數(shù)據(jù)進(jìn)行交互的方法,然而,不能通過(guò)在整個(gè)行集中修改或者選取數(shù)據(jù)來(lái)獲得所需要的結(jié)果。本章將對(duì)游標(biāo)的使用進(jìn)行詳細(xì)講解。通過(guò)閱讀本章,您可以:: 掌握游標(biāo)的概念: 了解游標(biāo)的類型: 掌握游標(biāo)的基本操作: 了解游標(biāo)系統(tǒng)存儲(chǔ)過(guò)程: 掌握使用系統(tǒng)過(guò)程查看游標(biāo)的方法13.1 游標(biāo)的概述視頻講解:光盤TMlx13游標(biāo)的概述.mp4游標(biāo)是取用一組數(shù)據(jù)并能夠一次與一個(gè)單獨(dú)的數(shù)據(jù)進(jìn)行交互的方法。關(guān)系數(shù)據(jù)庫(kù)中的操作會(huì)對(duì)整個(gè)行集起作用。由SELECT語(yǔ)句返回的行集包括滿足該語(yǔ)句的WHERE子句中條件的所有
2、行。這種由語(yǔ)句返回的完整行集稱為結(jié)果集。應(yīng)用程序,特別是交互式聯(lián)機(jī)應(yīng)用程序,并不總能將整個(gè)結(jié)果集作為一個(gè)單元來(lái)有效地處理。這些應(yīng)用程序需要一種機(jī)制以便每次處理一行或一部分行。游標(biāo)就是提供這種機(jī)制并對(duì)結(jié)果集的一種擴(kuò)展。游標(biāo)通過(guò)以下方式來(lái)擴(kuò)展結(jié)果處理: þ 允許定位在結(jié)果集的特定行。þ 從結(jié)果集的當(dāng)前位置檢索一行或一部分行。þ 支持對(duì)結(jié)果集中當(dāng)前位置的行進(jìn)行數(shù)據(jù)修改。þ 為由其他用戶對(duì)顯示在結(jié)果集中的數(shù)據(jù)庫(kù)數(shù)據(jù)所做的更改提供不同級(jí)別的可見(jiàn)性支持。þ 提供腳本、存儲(chǔ)過(guò)程和觸發(fā)器中用于訪問(wèn)結(jié)果集中的數(shù)據(jù)的 Transact-SQL 語(yǔ)句。游標(biāo)可以定在該
3、單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行??梢詫?duì)結(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)時(shí),游標(biāo)顯得十分重要。13.1.1 游標(biāo)的實(shí)現(xiàn)游標(biāo)提供了一種從表中檢索數(shù)據(jù)并進(jìn)行操作的靈活手段,游標(biāo)主要用在服務(wù)器上,處理由客戶端發(fā)送給服務(wù)器端的SQL語(yǔ)句,或是批處理、存儲(chǔ)過(guò)程、觸發(fā)器中的數(shù)據(jù)處理請(qǐng)求。游標(biāo)的優(yōu)點(diǎn)在于它可以定位到結(jié)果集中的某一行,并可以對(duì)該行數(shù)據(jù)執(zhí)行特定操作,為用戶在處理數(shù)據(jù)的過(guò)程中提供了很大方便。一個(gè)完整的游標(biāo)由5部分組成,并且這5個(gè)部分應(yīng)符合下面的順序。(1)聲明游標(biāo)。(2)打開游標(biāo)。(3)從一個(gè)游標(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)、動(dòng)態(tài)游標(biāo)、只進(jìn)游標(biāo)和鍵集驅(qū)動(dòng)的游標(biāo)。這些游標(biāo)的檢測(cè)結(jié)果集變化的能力和內(nèi)存占用的情況都有所不同,數(shù)據(jù)源沒(méi)有辦法通知游標(biāo)當(dāng)前提取行的更改。游標(biāo)檢測(cè)這些變化的能力也受事務(wù)隔離級(jí)別的影響。1靜態(tài)游標(biāo)靜態(tài)游標(biāo)的完整結(jié)果集在游標(biāo)打開時(shí)建立在tempdb中。靜態(tài)游標(biāo)總是按照游標(biāo)打開時(shí)的原樣顯示結(jié)果集。靜態(tài)游標(biāo)在滾動(dòng)期間很少或根本檢測(cè)不到變化,雖然它在tempdb中存儲(chǔ)了整個(gè)游標(biāo),但消耗的資源很少。盡管動(dòng)態(tài)游標(biāo)使用tempdb的程度最低,在滾動(dòng)期間它能夠檢測(cè)到所有變化,但消耗的資源也更多。鍵集驅(qū)動(dòng)游標(biāo)介于二者之間,它能檢測(cè)到大部分的變化,但比動(dòng)態(tài)游標(biāo)消耗
5、更少的資源。2動(dòng)態(tài)游標(biāo)動(dòng)態(tài)游標(biāo)與靜態(tài)游標(biāo)相對(duì)。當(dāng)滾動(dòng)游標(biāo)時(shí),動(dòng)態(tài)游標(biāo)反映結(jié)果集中所做的所有更改。結(jié)果集中的行數(shù)據(jù)值、順序和成員在每次提取時(shí)都會(huì)改變。所有用戶做的全部UPDATE、INSERT和DELETE語(yǔ)句均通過(guò)游標(biāo)可見(jiàn)。3只進(jìn)游標(biāo)只進(jìn)游標(biāo)不支持滾動(dòng),它只支持游標(biāo)從頭到尾順序提取。只有從數(shù)據(jù)庫(kù)中提取出來(lái)后才能進(jìn)行檢索。對(duì)所有由當(dāng)前用戶發(fā)出或由其他用戶提交、并影響結(jié)果集中的行的INSERT、UPDATE和DELETE語(yǔ)句,其效果在這些行從游標(biāo)中提取時(shí)是可見(jiàn)的。4鍵集驅(qū)動(dòng)游標(biāo)打開游標(biāo)時(shí),鍵集驅(qū)動(dòng)游標(biāo)中的成員和行順序是固定的。鍵集驅(qū)動(dòng)游標(biāo)由一套被稱為鍵集的唯一標(biāo)識(shí)符(鍵)控制。鍵由以唯一方式在結(jié)果
6、集中標(biāo)識(shí)行的列構(gòu)成。鍵集是游標(biāo)打開時(shí)來(lái)自所有適合SELECT語(yǔ)句的行中的一系列鍵值。鍵集驅(qū)動(dòng)游標(biāo)的鍵集在游標(biāo)打開時(shí)建立在tempdb中。對(duì)非鍵集列中的數(shù)據(jù)值所做的更改(由游標(biāo)所有者更改或其他用戶提交)在用戶滾動(dòng)游標(biāo)時(shí)是可見(jiàn)的。在游標(biāo)外對(duì)數(shù)據(jù)庫(kù)所做的插入在游標(biāo)內(nèi)是不可見(jiàn)的,除非關(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語(yǔ)句。此語(yǔ)句有兩種語(yǔ)法聲明格式,分別為ISO標(biāo)準(zhǔn)語(yǔ)法和Tran
7、sact-SQL擴(kuò)展的語(yǔ)法,下面將分別介紹聲明游標(biāo)的兩種語(yǔ)法格式。1ISO標(biāo)準(zhǔn)語(yǔ)法語(yǔ)法如下:DECLARE cursor_name INSENSITIVE SCROLL CURSOR FOR select_statement FOR READ ONLY | UPDATE OF column_name ,.n 參數(shù)說(shuō)明如下。þ DECLARE cursor_name:指定一個(gè)游標(biāo)名稱,其游標(biāo)名稱必須符合標(biāo)識(shí)符規(guī)則。þ INSENSITIVE:定義一個(gè)游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時(shí)復(fù)本。對(duì)游標(biāo)的所有請(qǐng)求都從tempdb中的臨時(shí)表中得到應(yīng)答;因此,在對(duì)該游標(biāo)進(jìn)行提取操作時(shí)
8、返回的數(shù)據(jù)中不反映對(duì)基表所做的修改,并且該游標(biāo)不允許修改。使用SQL-92語(yǔ)法時(shí),如果省略INSENSITIVE,(任何用戶)對(duì)基表提交的刪除和更新都反映在后面的提取中。þ SCROLL:指定所有的提取選項(xiàng)(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。Ø FIRST:取第一行數(shù)據(jù)。Ø LAST:取最后一行數(shù)據(jù)。Ø PRIOR:取前一行數(shù)據(jù)。Ø NEXT:取后一行數(shù)據(jù)。Ø RELATIVE:按相對(duì)位置取數(shù)據(jù)。Ø ABSOLUTE:按絕對(duì)位置取數(shù)據(jù)。如果未指定SCROLL,則NEXT是
9、唯一支持的提取選項(xiàng)。þ select_statement:定義游標(biāo)結(jié)果集的標(biāo)準(zhǔn)SELECT語(yǔ)句。在游標(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語(yǔ)句的WHERE CURRENT OF子句中不允許引用游標(biāo)。þ UPDATE OF column_name ,.n :定義游標(biāo)內(nèi)可更新的列。如果指定OF column_name ,.n參數(shù),則只允許修改所列出的列。如果在UPD
10、ATE中未指定列的列表,則可以更新所有列。2Transact-SQL擴(kuò)展的語(yǔ)法語(yǔ)法如下: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語(yǔ)句的參數(shù)及說(shuō)明如表13.1所示。表13.1 DECLARE CURS
11、OR語(yǔ)句的參數(shù)及說(shuō)明參 數(shù)描 述DECLARE cursor_name指定一個(gè)游標(biāo)名稱,其游標(biāo)名稱必須符合標(biāo)識(shí)符規(guī)則LOCAL定義游標(biāo)的作用域僅限在其所在的批處理、存儲(chǔ)過(guò)程或觸發(fā)器中。當(dāng)建立游標(biāo)在存儲(chǔ)過(guò)程執(zhí)行結(jié)束后,游標(biāo)會(huì)被自動(dòng)釋放GLOBAL指定該游標(biāo)的作用域?qū)B接是全局的。在由連接執(zhí)行的任何存儲(chǔ)過(guò)程或批處理中,都可以引用該游標(biāo)名稱。該游標(biāo)僅在脫接時(shí)隱性釋放FORWARD_ONLY指定游標(biāo)只能從第一行滾動(dòng)到最后一行。FETCH NEXT是唯一受支持的提取選項(xiàng)非指定STATIC、KEYSET或DYNAMIC關(guān)鍵字,否則默認(rèn)為FORWARD_ONLY。STATIC、KEYSET和DYNAMIC游
12、標(biāo)默認(rèn)為SCROLL。與ODBC和ADO這類數(shù)據(jù)庫(kù)API不同,STATIC、KEYSET和DYNAMIC Transact-SQL游標(biāo)支持FORWARD_ONLY。FAST_ FORWARD和FORWARD_ONLY是互斥的;如果指定一個(gè),則不能指定另一個(gè)STATIC定義一個(gè)游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時(shí)復(fù)本。對(duì)游標(biāo)的所有請(qǐng)求都從tempdb中的該臨時(shí)表中得到應(yīng)答;因此,在對(duì)該游標(biāo)進(jìn)行提取操作時(shí)返回的數(shù)據(jù)中不反映對(duì)基表所做的修改,并且該游標(biāo)不允許修改KEYSET指定當(dāng)游標(biāo)打開時(shí),游標(biāo)中行的成員資格和順序已經(jīng)固定。對(duì)行進(jìn)行唯一標(biāo)識(shí)的鍵集內(nèi)置在tempdb內(nèi)一個(gè)稱為keyset的
13、表中。對(duì)基表中的非鍵值所做的更改(由游標(biāo)所有者更改或由其他用戶提交)在用戶滾動(dòng)游標(biāo)時(shí)是可視的。其他用戶進(jìn)行的插入是不可視的(不能通過(guò)Transact-SQL服務(wù)器游標(biāo)進(jìn)行插入)。如果某行已刪除,則對(duì)該行的提取操作將返回FETCH_STATUS值-2。從游標(biāo)外更新鍵值類似于刪除舊行后接著插入新行的操作。含有新值的行不可視,對(duì)含有舊值的行的提取操作將返回FETCH_STATUS值-2。如果通過(guò)指定WHERE CURRENT OF子句用游標(biāo)完成更新,則新值可視DYNAMIC定義一個(gè)游標(biāo),以反映在滾動(dòng)游標(biāo)時(shí)對(duì)結(jié)果集內(nèi)的行所做的所有數(shù)據(jù)的更改。行的數(shù)據(jù)值、順序和成員在每次提取時(shí)都會(huì)更改。動(dòng)態(tài)游標(biāo)不支持A
14、BSOLUTE提取選項(xiàng)FAST_FORWARD指明一個(gè)FORWARD_ONLY、READ_ONLY型游標(biāo)SCROLL_LOCKS指定確保通過(guò)游標(biāo)完成的定位更新或定位刪除可以成功。將行讀入游標(biāo)以確保它們可用于以后的修改時(shí),SQL Server會(huì)鎖定這些行。如果還指定了FAST_FORWARD,則不能指定SCROLL_LOCKSOPTIMISTIC指明在數(shù)據(jù)被讀入游標(biāo)后,如果游標(biāo)中某行數(shù)據(jù)已發(fā)生變化,那么對(duì)游標(biāo)數(shù)據(jù)進(jìn)行更新或刪除可能會(huì)導(dǎo)致失敗TYPE_WARNING指定如果游標(biāo)從所請(qǐng)求的類型隱性轉(zhuǎn)換為另一種類型,則給客戶端發(fā)送警告消息【例13.1】 創(chuàng)建一個(gè)名為Cur_Emp的標(biāo)準(zhǔn)游標(biāo)。(實(shí)例位置
15、:光盤TMsl131)SQL語(yǔ)句如下:USE db_2012DECLARE Cur_Emp CURSOR FORSELECT * FROM EmployeeGO運(yùn)行結(jié)果如圖13.1所示?!纠?3.2】 創(chuàng)建一個(gè)名為Cur_Emp_01的只讀游標(biāo)。(實(shí)例位置:光盤TMsl132)SQL語(yǔ)句如下:USE db_2012DECLARE Cur_Emp_01 CURSOR FORSELECT * FROM EmployeeFOR READ ONLY -只讀游標(biāo)GO運(yùn)行結(jié)果如圖13.2所示。 圖13.1 創(chuàng)建標(biāo)準(zhǔn)游標(biāo) 圖13.2 創(chuàng)建只讀游標(biāo)【例13.3】 創(chuàng)建一個(gè)名為Cur_Emp_02
16、的更新游標(biāo)。(實(shí)例位置:光盤TMsl133)SQL語(yǔ)句如下:USE db_2012DECLARE Cur_Emp_02 CURSOR FORSELECT Name,Sex,Age FROM EmployeeFOR UPDATE -更新游標(biāo)GO運(yùn)行結(jié)果如圖13.3所示。圖13.3 創(chuàng)建更新游標(biāo)13.2.2 打開游標(biāo)打開一個(gè)聲明的游標(biāo)可以使用OPEN命令。語(yǔ)法如下:OPEN GLOBAL cursor_name | cursor_variable_name 參數(shù)說(shuō)明如下。þ 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)變量的名稱,該名稱引用一個(gè)游標(biāo)。如果使用INSENSITIV或STATIC選項(xiàng)聲明了游標(biāo),那么OPEN將創(chuàng)建一個(gè)臨時(shí)表以保留結(jié)果集。如果結(jié)果集中任意行的大小超過(guò)SQL Server表的最大行大小,OPEN將失敗。如果使用KEYSET選項(xiàng)聲明了游標(biāo),那么OPEN將創(chuàng)建一個(gè)臨時(shí)表以保留鍵集。臨時(shí)表存儲(chǔ)在tempdb中?!纠?3.4】 首先聲明一個(gè)名為Emp_01的游標(biāo),然后使
18、用OPEN命令打開該游標(biāo)。(實(shí)例位置:光盤TMsl134)SQL語(yǔ)句如下:USE db_2012DECLARE Emp_01 CURSOR FOR-聲明游標(biāo)SELECT * FROM EmployeeWHERE ID = '1'OPEN Emp_01-打開游標(biāo)GO運(yùn)行結(jié)果如圖13.4所示。圖13.4 打開游標(biāo)13.2.3 讀取游標(biāo)中的數(shù)據(jù)當(dāng)打開一個(gè)游標(biāo)之后,就可以讀取游標(biāo)中的數(shù)據(jù)了??梢允褂肍ETCH命令讀取游標(biāo)中的某一行數(shù)據(jù)。語(yǔ)法如下: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ù)及說(shuō)明如表13.2所示。表13.2 FETCH命令的參數(shù)及說(shuō)明參 數(shù)描 述NEXT返回緊跟當(dāng)前行之后的結(jié)果行,并且當(dāng)前行遞增為結(jié)果行。如果FETCH NEXT為對(duì)游標(biāo)的第一次提取操作,則返回結(jié)果集中的第一行。NEXT為默認(rèn)的游標(biāo)提取選項(xiàng)PRIOR返回緊臨當(dāng)前行前面的結(jié)果行,并且當(dāng)前行遞減為結(jié)果行。如果FETCH PRIOR為對(duì)游標(biāo)的第一次提取操作,則沒(méi)有行返回并且游標(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,則沒(méi)有行返回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)前行。如果對(duì)游標(biāo)的第一次提取操作時(shí)將FETCHRELATIVE的n或nvar指定為負(fù)數(shù)或0,則沒(méi)有行返回。n必須為整型常量且n
21、var必須為smallint、tinyint或intGLOBAL指定cursor_name為全局游標(biāo)cursor_name要從中進(jìn)行提取的開放游標(biāo)的名稱。如果同時(shí)有以cursor_name作為名稱的全局和局部游標(biāo)存在,若指定為GLOBAL,則cursor_name對(duì)應(yīng)于全局游標(biāo),未指定GLOBAL,則對(duì)應(yīng)于局部游標(biāo)cursor_variable_name游標(biāo)變量名,引用要進(jìn)行提取操作的打開的游標(biāo)INTO variable_name,.n允許將提取操作的列數(shù)據(jù)放到局部變量中。列表中的各個(gè)變量從左到右與游標(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ù)時(shí),都應(yīng)檢查該變量,以確定上次FETCH操作是否成功,決定如何進(jìn)行下一步處理。FETCH_STATUS變量有3個(gè)不同的返回值,說(shuō)明如下:(1)返回值為0,F(xiàn)ETCH語(yǔ)句成功;(2)返回值為-1,F(xiàn)ETCH語(yǔ)句失敗或此行不在結(jié)果集中;(3)返回值為-2,被提取的行不存在(1)在前兩個(gè)參數(shù)中,包含n和nvar其表示游標(biāo)相對(duì)于作為基準(zhǔn)的數(shù)據(jù)行所偏離的位置。(2)當(dāng)使用SQL-92語(yǔ)法來(lái)聲明一個(gè)游標(biāo)時(shí),沒(méi)有選擇SCROLL選項(xiàng),則只能使用FETCH N
23、EXT命令來(lái)從游標(biāo)中讀取數(shù)據(jù),即只能從結(jié)果集第一行按順序地每次讀取一行。由于不能使用FIRST、LAST、PRIOR,所以無(wú)法回滾讀取以前的數(shù)據(jù)。如果選擇了SCROLL選項(xiàng),則可以使用所有的FETCH操作?!纠?3.5】 用FETCH_STATUS 控制一個(gè)WHILE循環(huán)中的游標(biāo)活動(dòng),SQL語(yǔ)句及運(yùn)行結(jié)果如圖13.5所示。(實(shí)例位置:光盤TMsl135)圖13.5 從游標(biāo)中讀取數(shù)據(jù)SQL語(yǔ)句如下:USE db_2012 -引入數(shù)據(jù)庫(kù)DECLARE ReadCursor CURSOR FOR-聲明一個(gè)游標(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語(yǔ)句可以關(guān)閉游標(biāo),但不釋放游標(biāo)占用的系統(tǒng)資源。語(yǔ)法如下:CLOSE GLOBAL cursor_name | cursor_variable_name 參數(shù)說(shuō)明如下。þ GLOBAL:指定cursor_name為全局游標(biāo)。þ cursor_name:開放游標(biāo)的名稱。如果全局游標(biāo)和局部游標(biāo)都使用curs
25、or_name作為它們的名稱,那么當(dāng)指定GLOBAL時(shí),cursor_name引用全局游標(biāo);否則,cursor_name引用局部游標(biāo)。þ cursor_variable_name:與開放游標(biāo)關(guān)聯(lián)的游標(biāo)變量名稱?!纠?3.6】 聲明一個(gè)名為CloseCursor的游標(biāo),并使用Close語(yǔ)句關(guān)閉游標(biāo)。(實(shí)例位置:光盤 TMsl136)SQL語(yǔ)句如下:USE db_2012DECLARE CloseCursor Cursor FOR SELECT * FROM StudentFOR READ ONLYOPEN CloseCursorCLOSE CloseCursor運(yùn)行結(jié)果如圖13.6所示
26、。圖13.6 關(guān)閉游標(biāo)13.2.5 釋放游標(biāo)當(dāng)游標(biāo)關(guān)閉之后,并沒(méi)有在內(nèi)存中釋放所占用的系統(tǒng)資源,所以可以使用DEALLOCATE命令刪除游標(biāo)引用。當(dāng)釋放最后的游標(biāo)引用時(shí),組成該游標(biāo)的數(shù)據(jù)結(jié)構(gòu)由SQL Server釋放。語(yǔ)法如下:DEALLOCATE GLOBAL cursor_name | cursor_variable_name 參數(shù)說(shuō)明如下。þ cursor_name:已聲明游標(biāo)的名稱。當(dāng)全局和局部游標(biāo)都以cursor_name作為它們的名稱存在時(shí),如果指定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來(lái)刪除游標(biāo)時(shí),游標(biāo)變量并不會(huì)被釋放,除非超過(guò)使用該游標(biāo)的存儲(chǔ)過(guò)程和觸發(fā)器的范圍?!纠?3.7】 使用DEALLOCATE命令釋放名為FreeCursor的游標(biāo)。(實(shí)例位置:光盤TMsl137)SQL語(yǔ)句如下:USE db_2012DECLARE FreeCursor Cursor FORSELECT * FROM StudentOPEN FreeCursorClose FreeCursorDEA
28、LLOCATE FreeCursor運(yùn)行結(jié)果如圖13.7所示。圖13.7 釋放游標(biāo)13.3 使用系統(tǒng)過(guò)程查看游標(biāo)視頻講解:光盤TMlx13使用系統(tǒng)過(guò)程查看游標(biāo).mp4創(chuàng)建游標(biāo)后,通常使用sp_cursor_list和sp_describe_cursor查看游標(biāo)的屬性。sp_cursor_list用來(lái)報(bào)告當(dāng)前為連接打開的服務(wù)器游標(biāo)的屬性,sp_describe_cursor用于報(bào)告服務(wù)器游標(biāo)的屬性。本節(jié)就詳細(xì)介紹這兩個(gè)系統(tǒng)過(guò)程。13.3.1 sp_cursor_listsp_cursor_list報(bào)告當(dāng)前為連接打開的服務(wù)器游標(biāo)的屬性。語(yǔ)法如下:sp_cursor_list cursor_retu
29、rn = cursor_variable_name OUTPUT , cursor_scope = cursor_scope參數(shù)說(shuō)明如下。þ cursor_return = cursor_variable_name OUTPUT:已聲明的游標(biāo)變量的名稱。cursor_ variable_name的數(shù)據(jù)類型為 cursor,無(wú)默認(rèn)值。游標(biāo)是只讀的可滾動(dòng)動(dòng)態(tài)游標(biāo)。þ cursor_scope = cursor_scope:指定要報(bào)告的游標(biāo)級(jí)別。cursor_scope的數(shù)據(jù)類型為int,無(wú)默認(rèn)值,可取值如表13.3所示。表13.3 cursor_scope可取的值值說(shuō) 明1報(bào)告
30、所有本地游標(biāo)2報(bào)告所有全局游標(biāo)3報(bào)告本地游標(biāo)和全局游標(biāo)【例13.8】 聲明一個(gè)游標(biāo)Cur_Employee,并使用sp_cursor_list報(bào)告該游標(biāo)的屬性。(實(shí)例位置:光盤TMsl138)SQL語(yǔ)句如下: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運(yùn)行結(jié)果如圖13.8所示。圖13.8 sp_cursor_list屬性13.3.2 sp_describe_cursorsp_describe_cursor用于報(bào)告服務(wù)器游標(biāo)的屬性。語(yǔ)法如下: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語(yǔ)句的參數(shù)及說(shuō)明如表13.4所示。表13.4 sp_describe_cursor語(yǔ)句的參數(shù)及說(shuō)明參 數(shù)描 述 cursor_return = output_ cursor_variable OUTPUT用于接收游標(biāo)輸出的聲明游標(biāo)變量的名稱。output_cursor_variable的數(shù)據(jù)類型為cursor,無(wú)默認(rèn)值。調(diào)用sp_describe_cursor時(shí),該參數(shù)不得與任何游標(biāo)關(guān)聯(lián)。返回的游標(biāo)是可滾動(dòng)的動(dòng)態(tài)只讀游標(biāo) cursor_source = N'local'| N'global' | N'variable' 指定是使用局部游標(biāo)的名稱、全局游標(biāo)的名稱還是游標(biāo)變量的名稱來(lái)指定要報(bào)告的游標(biāo)。該參數(shù)的類型為nvarchar(30) cursor_identity = N'local_ cursor_name' 由具有LOCAL關(guān)鍵字或默認(rèn)設(shè)置為L(zhǎng)OCAL的DECLARE CURSOR語(yǔ)句創(chuàng)建的游標(biāo)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年山東煙草考試真題
- 民事訴訟中的證明責(zé)任研究
- 2024年商洛市特崗教師招聘考試真題
- 2024年呼倫貝爾市陳巴爾虎旗招聘公辦幼兒園人員考試真題
- 2024年昌吉州阜康市職業(yè)中等專業(yè)學(xué)校人才引進(jìn)筆試真題
- 播州區(qū)2024-2025學(xué)年第二學(xué)期八年級(jí)語(yǔ)文一卷(答題卡)
- 金屬表面工程-洞察及研究
- 2025年鎮(zhèn)江市第一外國(guó)語(yǔ)八年級(jí)英語(yǔ)第二學(xué)期期中統(tǒng)考試題含答案
- 幼兒教育創(chuàng)新與教學(xué)方法研究
- 南師大固體廢棄物處理教案08固體廢棄物熱解及熱選技術(shù)
- 綠植移植合同協(xié)議
- 膠質(zhì)瘤術(shù)后護(hù)理查房
- 縫紉初步知識(shí)培訓(xùn)課件
- 2025年光伏行業(yè)上半年發(fā)展回顧與下半年形勢(shì)展望
- 年中國(guó)金骨蓮膠囊市場(chǎng)分析及發(fā)展策略研究預(yù)測(cè)報(bào)告
- 8.4 流體壓強(qiáng)與流速的關(guān)系 課件-2024-2025學(xué)年滬科版物理八年級(jí)下冊(cè)
- 輸血管理相關(guān)制度
- 【北師大版】2024-2025學(xué)年一年級(jí)數(shù)學(xué)下冊(cè)教學(xué)計(jì)劃(及進(jìn)度表)
- 商業(yè)安全培訓(xùn)
- 老年性癡呆病人的護(hù)理與管理
- 糖尿病足護(hù)理疑難病例討論
評(píng)論
0/150
提交評(píng)論