第10章 事務(wù)和游標(biāo)_第1頁(yè)
第10章 事務(wù)和游標(biāo)_第2頁(yè)
第10章 事務(wù)和游標(biāo)_第3頁(yè)
第10章 事務(wù)和游標(biāo)_第4頁(yè)
第10章 事務(wù)和游標(biāo)_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、An Introduction to Database Systems1/55An Introduction to Database Systems1/80第第10章章 事務(wù)和游標(biāo)事務(wù)和游標(biāo) 10.1 事務(wù)事務(wù) 10.2 游標(biāo)游標(biāo) 10.3 C#數(shù)據(jù)庫(kù)事務(wù)數(shù)據(jù)庫(kù)事務(wù) An Introduction to Database Systems2/5510.1 事務(wù)事務(wù) 10.1.1 事務(wù)概述 在SQL Server中,事務(wù)是完成一個(gè)應(yīng)用處理的最小單元,由一個(gè)或多個(gè)對(duì)數(shù)據(jù)庫(kù)操作的語(yǔ)句組成。事務(wù)作為一個(gè)完整的執(zhí)行單元,如果執(zhí)行成功,事務(wù)中進(jìn)行的數(shù)據(jù)更新會(huì)全部提交;如果事務(wù)中有一個(gè)語(yǔ)句執(zhí)行失敗,則取消全部

2、操作,并將數(shù)據(jù)庫(kù)恢復(fù)到事務(wù)執(zhí)行之前的狀態(tài)。這樣確保數(shù)據(jù)的的一致性。 例如:A打算給B轉(zhuǎn)帳1000。就要把A的帳戶(hù)減少1000,B帳戶(hù)增加1000,如果第一步執(zhí)行了,而第二步?jīng)]有執(zhí)行,那么就會(huì)有問(wèn)題了,我們現(xiàn)在要做的就是保證這兩步要么都執(zhí)行,要么都不執(zhí)行,即任意一個(gè)失敗都要回滾。 An Introduction to Database Systems3/55 在SQL Server中,事務(wù)作為單個(gè)邏輯工作單元來(lái)執(zhí)行一系列操作,具有4個(gè)特點(diǎn)(ACID屬性):原子性、一致性、隔離性和持久性。(1)原子性:事務(wù)必須是原子工作單元,事務(wù)中的操作要么全都執(zhí)行,要么全都不執(zhí)行。事務(wù)是實(shí)現(xiàn)原子性的手段,原子性

3、是指某些事情要么全部發(fā)生,要么都不發(fā)生,我們都知道,程序的執(zhí)行是有順序的,在程序的執(zhí)行過(guò)程中,難免會(huì)出現(xiàn)錯(cuò)誤,如果對(duì)于某些必須作為原子性事務(wù)發(fā)生的事,在執(zhí)行過(guò)程中,有一部執(zhí)行了,還有另外一部分由于某種錯(cuò)誤而沒(méi)有執(zhí)行,就會(huì)出現(xiàn)大麻煩。(2)一致性:事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致?tīng)顟B(tài)。在相關(guān)數(shù)據(jù)庫(kù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)都必須是正確的。例如:在一個(gè)用戶(hù)未提交他的事務(wù)前(比如更新一個(gè)字段),其他用戶(hù) Select 出來(lái)的結(jié)果都一樣。10.1 事務(wù)事務(wù) An Introduction to Database Systems4/55

4、(3)隔離性:由并發(fā)事務(wù)所做的修改必須與任何其他并發(fā)事務(wù)所做的修改隔離。事務(wù)操作數(shù)據(jù)時(shí)數(shù)據(jù)的狀態(tài),要么是另一個(gè)并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一個(gè)事務(wù)修改它之后的狀態(tài),事務(wù)不會(huì)處理中間狀態(tài)的數(shù)據(jù)。(4)持久性:事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的。持久性意味著當(dāng)系統(tǒng)或介質(zhì)發(fā)生故障時(shí),確保已提交事務(wù)的更新不能丟失。即一旦一個(gè)事務(wù)提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變應(yīng)該是永久性的,耐得住任何數(shù)據(jù)庫(kù)系統(tǒng)故障。持久性通過(guò)數(shù)據(jù)庫(kù)備份和恢復(fù)來(lái)保證。事務(wù)模式有自動(dòng)提交模式、顯示事務(wù)、隱式事務(wù)幾種。10.1 事務(wù)事務(wù) An Introduction to Database Systems5/5510.1.2 自

5、動(dòng)提交事務(wù) 自動(dòng)提交模式是 SQL Server 數(shù)據(jù)庫(kù)引擎的默認(rèn)事務(wù)管理模式。每個(gè) Transact-SQL 語(yǔ)句在完成時(shí),都被提交或回滾。如果一個(gè)語(yǔ)句成功地完成,則提交該語(yǔ)句;如果遇到錯(cuò)誤,則回滾該語(yǔ)句。只要沒(méi)有顯式事務(wù)或隱性事務(wù)覆蓋自動(dòng)提交模式,與數(shù)據(jù)庫(kù)引擎實(shí)例的連接就以此默認(rèn)模式操作。在與SQL Server連接之后,直接進(jìn)入自動(dòng)事務(wù)模式,直到使用Begin Transaction 語(yǔ)句啟動(dòng)一個(gè)顯式事務(wù),或執(zhí)行Set IMPLICIT_TRANSACTIONS On語(yǔ)句將隱式事務(wù)模式開(kāi)啟為止。當(dāng)提交或回滾顯式事務(wù),或執(zhí)行Set IMPLICIT_TRANSACTIONS Off關(guān)閉隱性

6、事務(wù)模式時(shí),連接又返回到自動(dòng)提交模式。10.1 事務(wù)事務(wù) An Introduction to Database Systems6/5510.1.3 顯式事務(wù) 顯式事務(wù)是指由用戶(hù)通過(guò)Transact-SQL事務(wù)語(yǔ)句定義的事務(wù)。常用的Transact-SQL事務(wù)語(yǔ)句有:Begin Transaction、Commit Transaction、Rollback Transaction和Save Transaction語(yǔ)句。 10.1 事務(wù)事務(wù) An Introduction to Database Systems7/551Begin Transaction Begin Transaction語(yǔ)句定

7、義一個(gè)本地顯式事務(wù)的起點(diǎn),并將全局變量TranCount的值加1,具體的語(yǔ)法格式如下:Begin Tran | Transaction transaction_name | tran_name_variable10.1 事務(wù)事務(wù) An Introduction to Database Systems8/55說(shuō)明:(1)transaction_name:事務(wù)的名稱(chēng)。transaction_name必須符合標(biāo)識(shí)符規(guī)則,但標(biāo)識(shí)符所包含的字符數(shù)不能大于32。在一系列嵌套的事務(wù)中,用一個(gè)事務(wù)名或多個(gè)事務(wù)名對(duì)該事務(wù)并沒(méi)有什么影響,系統(tǒng)僅登記第一個(gè)(最外層)事務(wù)名。(2)tran_name_variable

8、:由用戶(hù)定義的、含有有效事務(wù)名稱(chēng)的變量的名稱(chēng)。必須用 char、varchar、nchar 或 nvarchar 數(shù)據(jù)類(lèi)型聲明變量。如果傳遞給該變量的字符多于32 個(gè),則僅使用前面的 32 個(gè)字符,其余的字符將被截?cái)唷?0.1 事務(wù)事務(wù) An Introduction to Database Systems9/552Commit Transaction Commit Transaction語(yǔ)句標(biāo)志一個(gè)事務(wù)成功執(zhí)行的結(jié)束。如果全局變量TranCount的值為1,則Commit Transaction將提交從事務(wù)開(kāi)始以來(lái)所執(zhí)行的所有數(shù)據(jù)修改,釋放事務(wù)處理所占用的資源,并使TranCount的值為0

9、。如果TranCount的值大于1,則Commit Transaction命令將使TranCount的值減1,并且事務(wù)將保持活動(dòng)狀態(tài)。具體的語(yǔ)法為: Commit Tran | Transaction transaction_name | tran_name_variable 10.1 事務(wù)事務(wù) An Introduction to Database Systems10/55說(shuō)明:(1)transaction_name:transaction_name 指定由前面的Begin Transaction分配的事務(wù)名稱(chēng)。transaction_name 必須符合標(biāo)識(shí)符規(guī)則,但不能超過(guò) 32 個(gè)字符。

10、transaction_name 通過(guò)向程序員指明 Commit Transaction與哪些 Begin Transaction 相關(guān)聯(lián),可作為幫助閱讀的一種方法。(2)tran_name_variable:由用戶(hù)定義的、含有有效事務(wù)名稱(chēng)的變量的名稱(chēng)。必須用 char、varchar、nchar 或 nvarchar 數(shù)據(jù)類(lèi)型聲明變量。如果傳遞給該變量的字符多于32 個(gè),則僅使用前面的 32 個(gè)字符;其余的字符將被截?cái)唷?當(dāng)在嵌套事務(wù)中使用時(shí),內(nèi)部事務(wù)的提交并不釋放資源或使其修改成為永久修改。只有在提交了外部事務(wù)時(shí),數(shù)據(jù)修改才具有永久性,而且資源才會(huì)被釋放。當(dāng) TranCount 大于1時(shí),

11、每發(fā)出一個(gè) Commit Transaction命令只會(huì)使 TranCount 按1遞減。當(dāng) TRANCOUNT 最終遞減為 0 時(shí),將提交整個(gè)外部事務(wù)。 當(dāng)TranCount為0時(shí)發(fā)出 Commit Transaction 將會(huì)導(dǎo)致出現(xiàn)錯(cuò)誤,因?yàn)闆](méi)有相應(yīng)的 Begin Transaction。10.1 事務(wù)事務(wù) An Introduction to Database Systems11/553Rollback Transaction Rollback Transaction語(yǔ)句回滾顯式事務(wù)或隱式事務(wù)到事務(wù)的起始位置,或事務(wù)內(nèi)部的保存點(diǎn),同時(shí)釋放由事務(wù)控制的資源。 Rollback Tran

12、| Transaction transaction_name | tran_name_variable savepoint_name | savepoint_variable 10.1 事務(wù)事務(wù) An Introduction to Database Systems12/55說(shuō)明:(1)transaction_name:transaction_name 和tran_name_variable的含義和Begin Transaction語(yǔ)句中的含義相同。(2)savepoint_name:Save Transaction語(yǔ)句定義的保存點(diǎn)的名稱(chēng)。savepoint_name 必須符合標(biāo)識(shí)符規(guī)則。當(dāng)回

13、滾只影響事務(wù)的一部分時(shí),可使用 savepoint_name。(3)savepoint_variable:是用戶(hù)定義的、包含有效保存點(diǎn)名稱(chēng)的變量的名稱(chēng)。必須用 char、varchar、nchar 或 nvarchar 數(shù)據(jù)類(lèi)型聲明變量。 不能在發(fā)出Commit Transaction命令之后回滾事務(wù),因?yàn)閿?shù)據(jù)修改已經(jīng)成為了數(shù)據(jù)庫(kù)的一個(gè)永久部分。10.1 事務(wù)事務(wù) An Introduction to Database Systems13/554Save Transaction Save Transaction語(yǔ)句在事務(wù)內(nèi)設(shè)置一個(gè)保存點(diǎn),當(dāng)事務(wù)執(zhí)行到該保存點(diǎn)時(shí),SQL Server存儲(chǔ)所有被修

14、改的數(shù)據(jù)到數(shù)據(jù)庫(kù)中,具體的語(yǔ)法格式為: Save Tran | Transaction savepoint_name | savepoint_variable10.1 事務(wù)事務(wù) An Introduction to Database Systems14/55說(shuō)明:(1)savepoint_name:定義的保存點(diǎn)的名稱(chēng)。savepoint_name 必須符合標(biāo)識(shí)符規(guī)則。(2)savepoint_variable:是用戶(hù)定義的、包含有效保存點(diǎn)名稱(chēng)的變量的名稱(chēng)。必須用 char、varchar、nchar 或 nvarchar 數(shù)據(jù)類(lèi)型聲明變量。10.1 事務(wù)事務(wù) An Introduction t

15、o Database Systems15/55 用戶(hù)可以在事務(wù)內(nèi)設(shè)置保存點(diǎn)或標(biāo)記。保存點(diǎn)可以定義在按條件取消某個(gè)事務(wù)的一部分后,該事務(wù)可以返回的一個(gè)位置。如果將事務(wù)回滾到保存點(diǎn),則根據(jù)需要必須完成其他剩余的 Transact-SQL 語(yǔ)句和 Commit Transaction 語(yǔ)句,或者必須通過(guò)將事務(wù)回滾到起始點(diǎn)完全取消事務(wù)。 在事務(wù)中允許有重復(fù)的保存點(diǎn)名稱(chēng),但指定保存點(diǎn)名稱(chēng)的 Rollback Transaction 語(yǔ)句只將事務(wù)回滾到使用該名稱(chēng)的最近的 Save Transaction。10.1 事務(wù)事務(wù) An Introduction to Database Systems16/55【

16、例10-1】使用本教材提供教學(xué)管理數(shù)據(jù)庫(kù),實(shí)現(xiàn)以下功能:更新“學(xué)生課程信息表”中的課程號(hào)為“103”的課程名稱(chēng)為“高等數(shù)學(xué)”。 begin transactionupdate 學(xué)生課程信息表 set 課程名稱(chēng)=高等數(shù)學(xué)where 課程號(hào)=103if exists( select * from 教師任課信息表 where 課程號(hào)=103)begincommit transactionendelserollback transactionAn Introduction to Database Systems17/55圖10-1 例10-1的執(zhí)行過(guò)程 10.1 事務(wù)事務(wù) An Introductio

17、n to Database Systems18/5510.1.4 隱式事務(wù) 當(dāng)連接以隱性事務(wù)模式進(jìn)行操作時(shí),SQL Server將在提交或回滾當(dāng)前事務(wù)后自動(dòng)啟動(dòng)新事務(wù)。因此,隱式事務(wù)不需要使用Begin Transaction語(yǔ)句標(biāo)志事務(wù)的開(kāi)始,只需要用戶(hù)使用Rollback Transaction語(yǔ)句或Commit Transaction語(yǔ)句回滾或提交事務(wù)。 10.1 事務(wù)事務(wù) An Introduction to Database Systems19/55 當(dāng)使用Set語(yǔ)句將IMPLICIT_TRANSACTIONS設(shè)置為On將隱性事務(wù)模式打開(kāi)之后,SQL Server執(zhí)行下列任何語(yǔ)句都會(huì)

18、自動(dòng)啟動(dòng)一個(gè)事務(wù):Alter Table、Create、Delete、Drop、Fetch、Grant、Insert、Open、Revoke、Select、Truncate Table、Update。在發(fā)出 Commit 或 Rollback 語(yǔ)句之前,該事務(wù)將一直保持有效。在第一個(gè)事務(wù)被提交或回滾之后,下次當(dāng)連接執(zhí)行以上任何語(yǔ)句時(shí),數(shù)據(jù)庫(kù)引擎實(shí)例都將自動(dòng)啟動(dòng)一個(gè)新事務(wù)。該實(shí)例將不斷地生成隱性事務(wù)鏈,直到隱性事務(wù)模式關(guān)閉為止。 10.1 事務(wù)事務(wù) An Introduction to Database Systems20/5510.2 游標(biāo)游標(biāo) 由Select 語(yǔ)句返回的行集包括滿(mǎn)足該語(yǔ)句的

19、Where 子句中條件的所有行,這種由語(yǔ)句返回的完整行集稱(chēng)為結(jié)果集。但是有時(shí)候應(yīng)用程序并不總能將整個(gè)結(jié)果集作為一個(gè)單元來(lái)有效地處理,這些應(yīng)用程序需要一種機(jī)制以便每次處理一行或一部分行。游標(biāo)就是提供這種機(jī)制的對(duì)結(jié)果集的一種擴(kuò)展。 An Introduction to Database Systems21/55使用游標(biāo)具有以下優(yōu)點(diǎn):(1)允許程序?qū)τ刹樵?xún)語(yǔ)句Select返回的行集合中的每一行執(zhí)行相同或不同的操作,而不是對(duì)整個(gè)行集合執(zhí)行同一個(gè)操作。(2)提供對(duì)基于游標(biāo)位置的表中的行進(jìn)行刪除和更新的能力。(3)游標(biāo)實(shí)際上作為面向集合的數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)和面向行的程序設(shè)計(jì)之間的橋梁,使這兩種處

20、理方式通過(guò)游標(biāo)溝通起來(lái)。10.2 游標(biāo)游標(biāo) An Introduction to Database Systems22/5510.2.1 游標(biāo)類(lèi)型游標(biāo)類(lèi)型 Microsoft SQL Server 2008支持兩種請(qǐng)求游標(biāo)的方法: (1)Transact-SQL:使用Transact-SQL語(yǔ)句定義的游標(biāo)。(2)數(shù)據(jù)庫(kù)應(yīng)用程序編程接口(API)游標(biāo)函數(shù):SQL Server 支持以下數(shù)據(jù)庫(kù) API 的游標(biāo)功能: ADO(Microsoft ActiveX 數(shù)據(jù)對(duì)象)OLE DBODBC(開(kāi)放式數(shù)據(jù)庫(kù)連接)10.2 游標(biāo)游標(biāo) An Introduction to Database Systems

21、23/55 根據(jù)游標(biāo)檢測(cè)結(jié)果集變化的能力和消耗資源(如在 tempdb 中所占的內(nèi)存和空間)的情況的不同,SQL Server支持的API服務(wù)器游標(biāo)又分為四種: (1)靜態(tài)游標(biāo):該游標(biāo)使用數(shù)據(jù)的臨時(shí)復(fù)本。對(duì)游標(biāo)的所有請(qǐng)求都從 tempdb 中的這一臨時(shí)表中得到應(yīng)答;因此,在對(duì)該游標(biāo)進(jìn)行提取操作時(shí)不反映對(duì)結(jié)果集所做的更改。10.2 游標(biāo)游標(biāo) An Introduction to Database Systems24/55(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ì)改變。所有用戶(hù)做的全部 Update、In

22、sert 和 Delete 語(yǔ)句均通過(guò)游標(biāo)可見(jiàn)。如果使用 API 函數(shù)或 Transact-SQL Where Current of 子句通過(guò)游標(biāo)進(jìn)行更新,它們將立即可見(jiàn)。在游標(biāo)外部所做的更新直到提交時(shí)才可見(jiàn)。10.2 游標(biāo)游標(biāo) An Introduction to Database Systems25/5510.2 游標(biāo)游標(biāo)(3)只進(jìn)游標(biāo):只進(jìn)游標(biāo)不支持滾動(dòng),它只支持游標(biāo)從頭到尾順序提取。行只在從數(shù)據(jù)庫(kù)中提取出來(lái)后才能檢索。對(duì)所有由當(dāng)前用戶(hù)發(fā)出或由其他用戶(hù)提交、并影響結(jié)果集中的行的 Insert、Update 和 Delete 語(yǔ)句,其效果在這些行從游標(biāo)中提取時(shí)是可見(jiàn)的。由于游標(biāo)無(wú)法向后滾動(dòng)

23、,則在提取行后對(duì)數(shù)據(jù)庫(kù)中的行進(jìn)行的大多數(shù)更改通過(guò)游標(biāo)均不可見(jiàn)。An Introduction to Database Systems26/5510.2 游標(biāo)游標(biāo)(4)由鍵集驅(qū)動(dòng)的游標(biāo):打開(kāi)由鍵集驅(qū)動(dòng)的游標(biāo)時(shí),該游標(biāo)中各行的成員身份和順序是固定的。由鍵集驅(qū)動(dòng)的游標(biāo)由一組唯一標(biāo)識(shí)符(鍵)控制,這組鍵稱(chēng)為鍵集。鍵是根據(jù)以唯一方式標(biāo)識(shí)結(jié)果集中各行的一組列生成的。鍵集是打開(kāi)游標(biāo)時(shí)來(lái)自符合 Select 語(yǔ)句要求的所有行中的一組鍵值。由鍵集驅(qū)動(dòng)的游標(biāo)對(duì)應(yīng)的鍵集是打開(kāi)該游標(biāo)時(shí)在 tempdb 中生成的。當(dāng)用戶(hù)滾動(dòng)游標(biāo)時(shí),對(duì)非鍵集列中的數(shù)據(jù)值所做的更改是可見(jiàn)的。在游標(biāo)外對(duì)數(shù)據(jù)庫(kù)所做的插入在游標(biāo)內(nèi)不可見(jiàn),除非關(guān)

24、閉并重新打開(kāi)游標(biāo)。使用 API 函數(shù)通過(guò)游標(biāo)所做的插入在游標(biāo)的末尾可見(jiàn)。An Introduction to Database Systems27/5510.2.3 使用游標(biāo) 利用Transact-SQL語(yǔ)句使用游標(biāo)的操作包括:聲明游標(biāo)、打開(kāi)游標(biāo)、提取數(shù)據(jù)、利用游標(biāo)更新和刪除數(shù)據(jù)、關(guān)閉游標(biāo)和釋放游標(biāo)。 1聲明游標(biāo)游標(biāo)在使用之前,必須先聲明。Declare Cursor 既接受基于ISO標(biāo)準(zhǔn)的語(yǔ)法,也接受Transact-SQL 擴(kuò)展的語(yǔ)法,下面分別對(duì)這兩種語(yǔ)法結(jié)構(gòu)介紹。ISO標(biāo)準(zhǔn)語(yǔ)法:Declare cursor_name Insensitive Scroll Cursor For selec

25、t_statement For Read Only| Update Of column_name ,.n 10.2 游標(biāo)游標(biāo)An Introduction to Database Systems28/55說(shuō)明:(1)cursor_name:所定義的 Transact-SQL 服務(wù)器游標(biāo)的名稱(chēng)。cursor_name 必須符合標(biāo)識(shí)符規(guī)則。(2)Insensitive:使用Insensitive定義的游標(biāo),把提取出來(lái)的數(shù)據(jù)存入一個(gè)在tempdb數(shù)據(jù)庫(kù)中創(chuàng)建的臨時(shí)表里。任何通過(guò)這個(gè)游標(biāo)進(jìn)行的操作,都在這個(gè)臨時(shí)表中進(jìn)行,所有對(duì)基本表的更改都不會(huì)在用游標(biāo)進(jìn)行的操作中體現(xiàn)出來(lái)。若不用Insensitive

26、關(guān)鍵字,則所有用戶(hù)對(duì)基本表的刪除和更新則會(huì)反映在后面的提取操作中。(3)Scroll:指定以下提取方式均可用:(4)First:提取第一行數(shù)據(jù)。(5)Last:提取最后一行數(shù)據(jù)。10.2 游標(biāo)游標(biāo)An Introduction to Database Systems29/55(6)Prior:提取前一行數(shù)據(jù)。(7)Next:提取后一行數(shù)據(jù)。(8)Relative:按相對(duì)位置提取數(shù)據(jù)。(9)Absolute:按絕對(duì)位置提取數(shù)據(jù)。如果聲明游標(biāo)時(shí)沒(méi)有使用Scroll關(guān)鍵字,則所聲明的游標(biāo)只具有默認(rèn)的Next功能。(10)select_statement:定義游標(biāo)結(jié)果集的標(biāo)準(zhǔn) Select 語(yǔ)句。在游

27、標(biāo)聲明的 select_statement 中不允許使用關(guān)鍵字 Compute、Compute by、For Browse 和 Into。(11)Read Only:定義只讀游標(biāo),禁止通過(guò)游標(biāo)修改數(shù)據(jù)。在 Update 或 Delete語(yǔ)句的 Where Current Of 子句中不能引用該游標(biāo)。(12)Update Of column_name ,.n :定義游標(biāo)中可更新的列。如果指定了 Of column_name ,.n,則只允許修改所列出的列。如果指定了 Update,但未指定列的列表,則可以更新所有列。10.2 游標(biāo)游標(biāo)An Introduction to Database Sys

28、tems30/55【例題10-2】使用本教材提供“教學(xué)管理數(shù)據(jù)庫(kù)”,為“學(xué)生基本信息表”聲明一個(gè)Update游標(biāo)。 DECLARE student_cursor SCROLL CURSORFORSELECT * FROM 學(xué)生基本信息表FOR UPDATEAn Introduction to Database Systems31/552打開(kāi)游標(biāo) 游標(biāo)聲明之后,在操作之前必須打開(kāi)它。打開(kāi)游標(biāo)的語(yǔ)法如下: Open Global cursor_name | cursor_variable_name 10.2 游標(biāo)游標(biāo)An Introduction to Database Systems32/55說(shuō)

29、明:(1)Global:指定 cursor_name 是全局游標(biāo)。(2)cursor_name:已聲明的游標(biāo)的名稱(chēng)。如果全局游標(biāo)和局部游標(biāo)都使用 cursor_name 作為其名稱(chēng),那么如果指定了 Global,則 cursor_name 指的是全局游標(biāo);否則 cursor_name 指的是局部游標(biāo)。(3)cursor_variable_name:游標(biāo)變量的名稱(chēng),該變量引用一個(gè)游標(biāo)。當(dāng)執(zhí)行打開(kāi)游標(biāo)的語(yǔ)句時(shí),服務(wù)器將執(zhí)行聲明游標(biāo)時(shí)使用的Select語(yǔ)句。如果使用了Incensitive或Static關(guān)鍵字,則服務(wù)器會(huì)在tempdb中建立一個(gè)臨時(shí)表,存放游標(biāo)將要進(jìn)行操作的結(jié)果集的副本。10.2 游

30、標(biāo)游標(biāo)An Introduction to Database Systems33/55【例題10-3】使用本教材提供“教學(xué)管理數(shù)據(jù)庫(kù)”,打開(kāi)“學(xué)生基本信息表”的游標(biāo)“student_cursor”。 open student_cursorAn Introduction to Database Systems34/553提取數(shù)據(jù) 在利用Open語(yǔ)句打開(kāi)游標(biāo)并從數(shù)據(jù)庫(kù)中執(zhí)行了查詢(xún)之后,就可以利用Fetch語(yǔ)句從查詢(xún)結(jié)果集中提取數(shù)據(jù)了。使用Fetch語(yǔ)句一次可以提取一條記錄,具體的語(yǔ)法格式如下:Fetch Next | Prior | First | Last| Absolute n | nvar|

31、 Relative n | nvar From Global cursor_name | cursor_variable_name Into variable_name ,.n 10.2 游標(biāo)游標(biāo)An Introduction to Database Systems35/55說(shuō)明:(1)Fetch First:提取結(jié)果集中的第一行。(2)Fetch Prior:提取上一個(gè)提取行的前面的一行,如果Fetch Prior為對(duì)游標(biāo)的第一次提取操作,則沒(méi)有行返回并且游標(biāo)置于第一行之前。(3)Fetch Next:提取上一個(gè)提取行的后面的一行,如果Fetch Next為對(duì)游標(biāo)的第一次提取操作,則返回結(jié)果

32、集中的第一行。(4)Fetch Last:提取結(jié)果集中的最后一行。10.2 游標(biāo)游標(biāo)An Introduction to Database Systems36/55 (5)Fetch Absolute n | nvar:如果 n 或 nvar 為正,則返回從游標(biāo)頭開(kāi)始向后的第 n 行,并將返回行變成新的當(dāng)前行。如果 n 或 nvar 為負(fù),則返回從游標(biāo)末尾開(kāi)始向前的第 n 行,并將返回行變成新的當(dāng)前行。如果 n 或 nvar 為 0,則不返回行。n 必須是整數(shù)常量,并且 nvar 的數(shù)據(jù)類(lèi)型必須為 smallint、tinyint 或 int。 10.2 游標(biāo)游標(biāo)An Introduction

33、 to Database Systems37/55(6)Fetch Relative n | nvar:如果 n 或 nvar 為正,則返回從當(dāng)前行開(kāi)始向后的第 n 行,并將返回行變成新的當(dāng)前行。如果 n 或 nvar 為負(fù),則返回從當(dāng)前行開(kāi)始向前的第 n 行,并將返回行變成新的當(dāng)前行。如果 n 或 nvar 為 0,則返回當(dāng)前行。在對(duì)游標(biāo)進(jìn)行第一次提取時(shí),如果在將 n 或 nvar 設(shè)置為負(fù)數(shù)或 0 的情況下指定 Fetch Relative,則不返回行。n 必須是整數(shù)常量,nvar 的數(shù)據(jù)類(lèi)型必須為 smallint、tinyint 或 int。(7)Global:指定 cursor_na

34、me 是全局游標(biāo)。10.2 游標(biāo)游標(biāo)An Introduction to Database Systems38/55(8)cursor_name:已聲明的游標(biāo)的名稱(chēng)。如果全局游標(biāo)和局部游標(biāo)都使用 cursor_name 作為其名稱(chēng),那么如果指定了 Global,則 cursor_name 指的是全局游標(biāo);否則 cursor_name 指的是局部游標(biāo)。(9)cursor_variable_name:游標(biāo)變量的名稱(chēng),該變量引用一個(gè)游標(biāo)。(10)Into variable_name ,.n :將提取的結(jié)果存放到局部變量中。變量的數(shù)量、排列順序和相應(yīng)的數(shù)據(jù)類(lèi)型必須和聲明游標(biāo)時(shí)使用的select語(yǔ)句中引

35、用的數(shù)據(jù)列的數(shù)量、排列順序和數(shù)據(jù)類(lèi)型保持一致。10.2 游標(biāo)游標(biāo)An Introduction to Database Systems39/55 通過(guò)檢測(cè)全局變量Fetch_Status的值,可以獲得Fetch語(yǔ)句的狀態(tài)信息,該狀態(tài)信息用于判斷該Fetch語(yǔ)句返回?cái)?shù)據(jù)的有效性。當(dāng)執(zhí)行一條Fetch語(yǔ)句之后,F(xiàn)etch_Status可能出現(xiàn)三種值:0:Fetch語(yǔ)句成功。-1:Fetch 語(yǔ)句失敗或行不在結(jié)果集中。-2:提取的行不存在。 10.2 游標(biāo)游標(biāo)An Introduction to Database Systems40/55【例題10-4】使用本教材提供“教學(xué)管理數(shù)據(jù)庫(kù)”,打開(kāi)“學(xué)生基

36、本信息表”的游標(biāo)“ student_cursor”,提取結(jié)果集中的第一行。 declare name varchar(20)/*定義一個(gè)變量,存放提取的結(jié)果*/open student_cursorfetch next from student_cursorinto nameprint nameAn Introduction to Database Systems41/55圖10-2 例10-4執(zhí)行過(guò)程 An Introduction to Database Systems42/5510.2 游標(biāo)游標(biāo)4利用游標(biāo)更新和刪除數(shù)據(jù) 如果游標(biāo)聲明為可更新游標(biāo),則定位在可更新游標(biāo)中的某行上時(shí),可以執(zhí)行更

37、新或刪除操作,這些操作是針對(duì)用于在游標(biāo)中生成當(dāng)前行的基表行的,稱(chēng)之為“定位更新”。利用游標(biāo)更新和刪除數(shù)據(jù)的步驟為:(1)Declare語(yǔ)句聲明游標(biāo);(2)Open語(yǔ)句打開(kāi)游標(biāo);(3)Fetch語(yǔ)句定位到某一行;(4)用 Where Current Of 子句執(zhí)行 Update 或 Delete 語(yǔ)句。 An Introduction to Database Systems43/55【例題10-5】使用可更新游標(biāo)student_Cursor對(duì)數(shù)據(jù)庫(kù)中“學(xué)生成績(jī)表”中成績(jī)列定位到某一行后,Update當(dāng)前行的操作。 UPDATE 學(xué)生成績(jī)表 SET 成績(jī)=100 WHERE CURRENT of

38、student_Cursor; Delete當(dāng)前行的操作如下: DELETE FROM學(xué)生成績(jī)表WHERE CURRENT OF student_Cursor An Introduction to Database Systems44/555關(guān)閉游標(biāo) 游標(biāo)打開(kāi)之后,服務(wù)器會(huì)專(zhuān)門(mén)為游標(biāo)開(kāi)辟一定的內(nèi)存空間存放游標(biāo)操作的數(shù)據(jù)結(jié)果集,同時(shí)使用游標(biāo)也會(huì)對(duì)某些數(shù)據(jù)進(jìn)行封鎖。所以,在長(zhǎng)時(shí)間不用游標(biāo)的時(shí)候,一定要關(guān)閉游標(biāo),通知服務(wù)器釋放游標(biāo)所占用的資源。游標(biāo)關(guān)閉之后,可以再次打開(kāi),在一個(gè)處理過(guò)程中,可以多次打開(kāi)和關(guān)閉游標(biāo)。關(guān)閉游標(biāo)的語(yǔ)法格式為: Close Global cursor_name | curso

39、r_variable_name10.2 游標(biāo)游標(biāo)An Introduction to Database Systems45/55(1)Global:指定 cursor_name 是全局游標(biāo)。(2)cursor_name:已聲明的游標(biāo)的名稱(chēng)。如果全局游標(biāo)和局部游標(biāo)都使用 cursor_name 作為其名稱(chēng),那么如果指定了 Global,則 cursor_name 指的是全局游標(biāo);否則 cursor_name 指的是局部游標(biāo)。(3)cursor_variable_name:游標(biāo)變量的名稱(chēng),該變量引用一個(gè)游標(biāo)。例如:close student_cursor 。10.2 游標(biāo)游標(biāo)An Introduc

40、tion to Database Systems46/556釋放游標(biāo) 使用完游標(biāo)之后應(yīng)該將游標(biāo)釋放,以釋放被游標(biāo)占用的資源。釋放游標(biāo)的語(yǔ)法結(jié)構(gòu)如下: Deallocate Global cursor_name | cursor_variable_name10.2 游標(biāo)游標(biāo)An Introduction to Database Systems47/55(1)Global:指定 cursor_name 是全局游標(biāo)。(2)cursor_name:已聲明的游標(biāo)的名稱(chēng)。如果全局游標(biāo)和局部游標(biāo)都使用 cursor_name 作為其名稱(chēng),那么如果指定了 Global,則 cursor_name 指的是全局游

41、標(biāo);否則 cursor_name 指的是局部游標(biāo)。(3)cursor_variable_name:游標(biāo)變量的名稱(chēng),該變量引用一個(gè)游標(biāo)。 游標(biāo)釋放之后,如果要重新使用游標(biāo),必須重新執(zhí)行聲明游標(biāo)的語(yǔ)句。例如:deallocate student_cursor 。10.2 游標(biāo)游標(biāo)An Introduction to Database Systems48/5510.3 C#數(shù)據(jù)庫(kù)事務(wù)數(shù)據(jù)庫(kù)事務(wù) 1SQL語(yǔ)句操作事務(wù) 打開(kāi)SQL Server2008的Microsoft SQL Server Management Studio,選擇mydb數(shù)據(jù)庫(kù),如下所示的SQL代碼定義了一個(gè)事務(wù),并且命名為“MyTransaction”。這里用到了數(shù)據(jù)庫(kù)mydb,提交事務(wù)后,將為所有myBalance增加 10%。 An Introduction to Database Systems49/55/事務(wù)操作 private void button_Tran_Click(object sender, EventArgs e) sql = DECLARE TranName VARCHAR(20) + SELECT TranName = MyTransaction + BEGIN TRANSACTION TranName GOUSE mydb + GO + UPDATE myTable + SET roy

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論