




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、數(shù)據(jù)庫原理與應(yīng)用數(shù)據(jù)庫原理與應(yīng)用第十一講第十一講 事務(wù)和游標的創(chuàng)建和使事務(wù)和游標的創(chuàng)建和使用用 創(chuàng)建事務(wù)提交事務(wù)回滾事務(wù)回滾事務(wù)的一部分用鎖理解死鎖聲明游標打開游標從游標取數(shù)據(jù)關(guān)閉游標本講主要內(nèi)容例:一個員工代碼為一個員工代碼為000002的內(nèi)部候選人已經(jīng)被選定的內(nèi)部候選人已經(jīng)被選定為為Sales Manager( 崗位代碼為崗位代碼為0001)崗位。這)崗位。這必須在必須在Employee表中被更新,當(dāng)前已在該崗位的人表中被更新,當(dāng)前已在該崗位的人數(shù)也需要在數(shù)也需要在Position表中更新。表中更新。上面要做的上面要做的UPDATE語句如下:語句如下:UPDATE EmployeeSET
2、cCurrentPosition = 0001WHERE cEmployeeCode= 000002UPDATE PositionSET iCurrentStrength=iCurrentStrength + 1WHERE cPositionCode=0001 系統(tǒng)崩潰是由于兩個更新之間導(dǎo)致數(shù)據(jù)不一系統(tǒng)崩潰是由于兩個更新之間導(dǎo)致數(shù)據(jù)不一致性而引起的。需要防止這種情況,要確保兩個致性而引起的。需要防止這種情況,要確保兩個更新或者都發(fā)生或者都不發(fā)生。更新或者都發(fā)生或者都不發(fā)生。問題:問題: 怎樣防止數(shù)據(jù)的不一致性? 執(zhí)行事務(wù) 驗證數(shù)據(jù)在兩個表中都已更新怎樣防止數(shù)據(jù)的不一致性?事務(wù)事務(wù)一個事務(wù)可以被
3、定義為作為工作的單個的邏輯單元被一起執(zhí)行的一串的操作。單個的工作單元必須具有稱為ACID(原子性,一致性,獨立性,和持久性)的四個性質(zhì)原子性原子性一致性一致性獨立性獨立性持久性持久性怎樣防止數(shù)據(jù)的不一致性怎樣防止數(shù)據(jù)的不一致性(續(xù)續(xù)) 為實現(xiàn)ACID性質(zhì)的需求,SQL Server提供了下面的特性:3事務(wù)管理3上鎖3日志 事務(wù)日志-是SQL Server管理所有它的的事務(wù)而維護的日志 顯式事務(wù)-是事務(wù)的開始和結(jié)束都被顯式地定義的事務(wù)。怎樣防止數(shù)據(jù)的不一致性(續(xù))BEGIN TRANSACTION:該該語句標志顯示事務(wù)的開始語句標志顯示事務(wù)的開始語法BEGIN TRANSACTION trans
4、action_name | tran_name_variableCOMMIT TRANSACTION或或 COMMIT WORK:語句標志顯語句標志顯式事務(wù)的結(jié)束點式事務(wù)的結(jié)束點語法 COMMIT TRANSACTIONtransaction_name |tran_name_variable怎樣防止數(shù)據(jù)的不一致性(續(xù))Autocommit事務(wù)事務(wù)autocommit模式是SQL Server的缺省事務(wù)管理模式,當(dāng)使用SET AUTOCOMMIT OFF開啟事務(wù)支持時,所有insert,delete或update操作列表存儲在內(nèi)存中,因此,當(dāng)進行ROLLBACK事務(wù)時,這些操作能夠被撤銷??缭綆?/p>
5、百個數(shù)據(jù)改變的事務(wù)將會花費很多的內(nèi)存知道下一個COMMIT或ROLLBACK清除了操作列表。結(jié)果:結(jié)果:事務(wù)的使用可以避免數(shù)據(jù)的不一致性UPDATE語句可通過使用BEGIN TRANSACTION和COMMIT TRANSACTION語句來維持其原子性執(zhí)行事務(wù)動作:動作:在 Query Analyzer窗口中,鍵入: BEGIN TRANSACTION trnUpdatePositionUPDATE Employee SET cCurrentPosition = 0001 WHERE cEmployeeCode= 000002 UPDATE Position SET iCurrentStren
6、gth = iCurrentStrength + 1 WHERE cPositionCode = 0001 COMMIT TRANSACTION trnUpdatePosition驗證兩個表中的數(shù)據(jù)都已被更新動作:動作:下面的SELECT語句來驗證那些行已被更新:SELECT * FROM PositionWHERE cPositionCode = 0001 SELECT * FROM Employee WHERE cEmployeeCode = 000002 識別下面單個工作單元的性質(zhì):識別下面單個工作單元的性質(zhì):由并發(fā)事務(wù)引起的任何數(shù)據(jù)修改必須與其他并發(fā)事務(wù)所作的修改隔離開來所有的數(shù)據(jù)修改
7、都被執(zhí)行或者都沒有被執(zhí)行已完成事務(wù)的任何數(shù)據(jù)改變在系統(tǒng)中永久起作用事務(wù)成功地完成后所有的數(shù)據(jù)必須處于一致的狀態(tài)2.回復(fù)改變職位職位0015已經(jīng)招募了已經(jīng)招募了10個候選人。為了反映這一變個候選人。為了反映這一變化,對于化,對于RequisitionCode 0015 ,Requisition表的表的NuOfRequir屬性將會減少屬性將會減少10。還有,對于。還有,對于cPositionCode 0015,Position表的表的iCurrentStrength屬屬性要加性要加10,使用下面命令:,使用下面命令:UPDATE Requisitionset NuOfRequir = NuOfRe
8、quir - 10WHERE RequisitionCode=0015 2.回復(fù)改變(續(xù))UPDATE Positionset iCurrentStrength=iCurrentStrength + 10WHERE cPositionCode=0015這兩個語句都應(yīng)該是原子的,如果這兩個語句都應(yīng)該是原子的,如果iCurrentStrength屬屬性變得不只是性變得不只是iCurrentStrength屬性,那么,由屬性,那么,由UPDATE語句所作的改變必須回復(fù)。語句所作的改變必須回復(fù)。 識別怎樣恢復(fù)所作的改變 執(zhí)行事務(wù) 驗證事務(wù)是否被執(zhí)行如何回復(fù)所作的改變?ROLLBACK TRANSACT
9、ION或或 ROLLBACK WORK:這些這些語句把顯式的或隱式的事務(wù)回滾到語句把顯式的或隱式的事務(wù)回滾到事務(wù)的開始,或者回滾到事務(wù)內(nèi)的事務(wù)的開始,或者回滾到事務(wù)內(nèi)的保存點保存點語法ROLLBACK TRANSACTION transaction_name |tran_name_variable |savepoint_name |savepoint_variable結(jié)果結(jié)果事務(wù)可用ROLLBACK TRANSACTION語句回復(fù)BEGIN TRANSACTIONUPDATE RequisitionSET NuOfRequir = NuOfRequir - 10WHERE cRequisiti
10、onCode=0015UPDATE PositionSET iCurrentStrength=iCurrentStrength + 10WHERE cPositionCode=0015IF (SELECT iMaxStrength-iCurrentStrength FROM Position WHERE cPositionCode = 0015) 0 BEGINPRINT Current strength cannot be more than Max strength. Transaction has not been committed. ROLLBACK TRANSACTION ENDE
11、LSE BEGINPRINT The transaction has been committed.COMMIT TRANSACTION END驗證事務(wù)是否被執(zhí)行動作:動作:查看結(jié)果窗口中所顯示的輸出。3.回復(fù)事務(wù)的一部分Employee和和Position表需要用下面的事務(wù)來更新:表需要用下面的事務(wù)來更新:事務(wù)事務(wù)1:UPDATE EmployeeSET cCurrentPosition = 0015WHERE cEmployeeCode = 000002UPDATE PositionSET iCurrentStrength = iCurrentStrength + 1WHERE cPosi
12、tionCode = 0015Requisition 和和Position表需要使用下面的事務(wù)來更新:表需要使用下面的事務(wù)來更新: 事務(wù)事務(wù) 2: UPDATE Requisition SET NuOfRequir = NuOfRequir - 10 WHERE cRequisitionCode=0015UPDATE Position SET iCurrentStrength=iCurrentStrength + 10 WHERE cPositionCode=00153回復(fù)事務(wù)的一部分(續(xù))所有更新應(yīng)一起來做。對于所有更新應(yīng)一起來做。對于cPositionCode 0015,如果,如果iCur
13、rentStrength值大于值大于iMaxStrength值,由第二個事務(wù)所產(chǎn)值,由第二個事務(wù)所產(chǎn)生的改變必須被回復(fù),而由第一個事務(wù)產(chǎn)生的改變是允許生的改變必須被回復(fù),而由第一個事務(wù)產(chǎn)生的改變是允許的。的。 識別怎樣把事務(wù)分解成部分 執(zhí)行事務(wù) 驗證事務(wù)的執(zhí)行怎樣把事務(wù)分解成部分?保存事務(wù)保存事務(wù)它在事務(wù)內(nèi)設(shè)置保存點 。保存點把事務(wù)分成幾個邏輯單元,這樣事務(wù)可以返回到保存點,如果事務(wù)的一部分是有條件地被取消。語法SAVE TRANSACTION savepoint_name | savepoint_variable結(jié)果結(jié)果事務(wù)可以用SAVE TRANSACTION語句分解成幾個邏輯單元保存點提
14、供了一種機制,用于回滾部分事務(wù)??梢允褂帽4纥c提供了一種機制,用于回滾部分事務(wù)。可以使用 SAVE TRANSACTION savepoint_name 語句創(chuàng)建一個保存點,然后再執(zhí)語句創(chuàng)建一個保存點,然后再執(zhí)行行 ROLLBACK TRANSACTION savepoint_name 語句回滾到該語句回滾到該保存點,從而無須回滾到事務(wù)的開始。保存點,從而無須回滾到事務(wù)的開始。在不可能發(fā)生錯誤的情況下,保存點很有用。在很少出現(xiàn)錯誤在不可能發(fā)生錯誤的情況下,保存點很有用。在很少出現(xiàn)錯誤的情況下使用保存點回滾部分事務(wù),比讓每個事務(wù)在更新之前測試的情況下使用保存點回滾部分事務(wù),比讓每個事務(wù)在更新之前
15、測試更新的有效性更為有效。更新和回滾操作代價很大,因此只有在遇更新的有效性更為有效。更新和回滾操作代價很大,因此只有在遇到錯誤的可能性很小,而且預(yù)先檢查更新的有效性的代價相對很高到錯誤的可能性很小,而且預(yù)先檢查更新的有效性的代價相對很高的情況下,使用保存點才會非常有效。的情況下,使用保存點才會非常有效。BEGIN TRANSACTION UPDATE Employee SET cCurrentPosition = 0015 WHERE cEmployeeCode = 000002UPDATE Position SET iCurrentStrength = iCurrentStrength +
16、1 WHERE cPositionCode = 0015 SAVE TRANSACTION trnTransaction1 UPDATE Requisition SET NuOfRequir=NuOfRequir - 10 WHERE cRequisitionCode=0015 UPDATE Position SET iCurrentStrength=iCurrentStrength+10 WHERE cPositionCode=0015IF (SELECT iMaxStrength-iCurrentStrength FROM Position WHERE cPositionCode = 00
17、15) 80 UPDATE ExternalCandidate SET dInterviewDate = getdate()+ 2 WHERE siTestScore 80 COMMIT TRANSACTIONUser2為什么不能執(zhí)行此事務(wù)?為什么User2不能執(zhí)行此事務(wù)?上鎖上鎖確保事務(wù)的完整性和數(shù)據(jù)庫的一致性是自動實施的不上鎖,查看事務(wù)處理是不可能的。為什么為什么User2不能執(zhí)行此事務(wù)不能執(zhí)行此事務(wù)(續(xù)續(xù))*事務(wù)的并發(fā)性3 SQL Server提供了樂觀的和悲觀的并發(fā)性控件3 樂觀并發(fā)性控件建立在多用戶間資源沖突大概是不可能的假設(shè)的基礎(chǔ)上允許事務(wù)執(zhí)行不用鎖定任何資源只有在提交事務(wù)時才進行
18、資源檢查為什么User2不能執(zhí)行此事務(wù)(續(xù))3 悲觀并發(fā)性悲觀并發(fā)性控件控件 在事務(wù)處理期間的鎖定資源并發(fā)性問題并發(fā)性問題丟失更新 丟失更新問題發(fā)生在當(dāng)兩個或多個事務(wù)基于原先所選值試圖修改同一丟失更新問題發(fā)生在當(dāng)兩個或多個事務(wù)基于原先所選值試圖修改同一行的時候行的時候自由依賴性自由依賴性自由依賴性問題問題(uncommitted dependency )也稱為)也稱為無效讀入(無效讀入(dirty read)問題問題為什么User2不能執(zhí)行此事務(wù)(續(xù))不一致性分析不一致性分析不一致性分析問題又稱為問題又稱為 不可重復(fù)不可重復(fù)問題問題幻象讀取幻象讀取幻象讀取又稱為作幻象問題又稱為作幻象問題為什么
19、User2不能執(zhí)行此事務(wù)(續(xù))SQL Server鎖模型鎖模型共享鎖允許并發(fā)事務(wù)來讀取資源允許并發(fā)事務(wù)來讀取資源更新鎖避免了常見形式的死瑣發(fā)生避免了常見形式的死瑣發(fā)生互斥型鎖唯一地限制并發(fā)事務(wù)訪問一個資源唯一地限制并發(fā)事務(wù)訪問一個資源為什么User2不能執(zhí)行此事務(wù)(續(xù))意向鎖指示指示SQL Server要在層次結(jié)構(gòu)較低的某個資源上獲得一個共享或排它鎖要在層次結(jié)構(gòu)較低的某個資源上獲得一個共享或排它鎖模式鎖當(dāng)任何數(shù)據(jù)定義(當(dāng)任何數(shù)據(jù)定義(DDL)操作在表上執(zhí)行時,)操作在表上執(zhí)行時,SQL Server考察模式修改考察模式修改 (Sch-M) 鎖鎖為什么User2不能執(zhí)行此事務(wù)(續(xù))結(jié)果:結(jié)果:U
20、ser2不能執(zhí)行他的事務(wù),因為當(dāng)它正在被User1使用時SQL Server已經(jīng)鎖定了ExternalCandidate表死鎖死鎖是這樣一種情形:兩個用戶(或事務(wù))在個別的對象的上死鎖是這樣一種情形:兩個用戶(或事務(wù))在個別的對象的上鎖,并且每個用戶正在等待另一個對象的鎖鎖,并且每個用戶正在等待另一個對象的鎖DISTRIBUTORPRODUCTSTRANSACTION ATRANSACTION B死鎖(續(xù))設(shè)置死鎖優(yōu)選級設(shè)置死鎖優(yōu)選級為探測死鎖的情況,SQL Server掃描在等待鎖請求的會話SQL Server提供SET DEADLOCK_PRIORITY命令來定制死鎖語法SET DEADL
21、OCK_PRIORITY LOW|NORMAL|deadlock_var控制在發(fā)生死鎖情況時會話的反應(yīng)方式。如果兩個進程都鎖定數(shù)據(jù),并且直到其它進程釋放自己的鎖時,每個進程才能釋放自己的鎖,即發(fā)生死鎖情況。LOW指定當(dāng)前會話為首選死鎖犧牲品。Microsoft SQL Server 自動回滾死鎖犧牲品的事務(wù),并給客戶端應(yīng)用程序返回 1205 號死鎖錯誤信息。NORMAL指定會話返回到默認的死鎖處理方法。定制定制LOCK_TIMEOUT SET LOCK_TIMEOUT命令可被用來設(shè)置等待被阻塞資源語句的最長時間游標的定義及其優(yōu)點 前面介紹的數(shù)據(jù)檢索方法可以得到數(shù)據(jù)庫中有關(guān)表的數(shù)據(jù),但這些數(shù)據(jù)是
22、作為一個結(jié)果集得到的,用戶可以把這個結(jié)果集保存到一個文件里,或生成一個新表以便于以后使用。這種查詢是非常重要的。但這種查詢形式有一個很大的缺點,它不能對結(jié)果集中每一行的數(shù)據(jù)進行處理。使用游標可以實現(xiàn)對查詢結(jié)果集中的數(shù)據(jù)逐行處理。游標的概念 游標(Cursor)是一種處理數(shù)據(jù)的方法,為了查看或者處理結(jié)果集中的數(shù)據(jù),游標提供了在結(jié)果集中向前或者向后瀏覽數(shù)據(jù)的能力??梢园延螛丝闯梢环N指針,它既可以指向當(dāng)前位置,也可以指向結(jié)果集中的任意位置,它允許用戶對指定位置的數(shù)據(jù)進行處理,可以把結(jié)果集中的數(shù)據(jù)放在數(shù)組、應(yīng)用程序中或其它地方。游標游標游標是一個在給定是一個在給定結(jié)果集結(jié)果集中幫助訪問和操縱數(shù)據(jù)中幫助
23、訪問和操縱數(shù)據(jù)的數(shù)據(jù)庫對象的數(shù)據(jù)庫對象游標能以下列方式處理結(jié)果集中的行:游標能以下列方式處理結(jié)果集中的行:允許從結(jié)果集中檢索指定的行允許結(jié)果集中當(dāng)前行被修改幫助從結(jié)果集中當(dāng)前行導(dǎo)航到不同的行允許被其它用戶修改的數(shù)據(jù)在結(jié)果集中是可見的使用游標的步驟使用游標的步驟有如下幾個步驟:有如下幾個步驟: 創(chuàng)建游標。使用創(chuàng)建游標。使用T-SQL語句生成一個結(jié)果集,并且定義游標的特征,如游標中語句生成一個結(jié)果集,并且定義游標的特征,如游標中的記錄是否可以修改。的記錄是否可以修改。 打開游標打開游標 從游標的結(jié)果集中讀取數(shù)據(jù)。從游標中檢索一行或多行數(shù)據(jù)稱為取數(shù)據(jù)。從游標的結(jié)果集中讀取數(shù)據(jù)。從游標中檢索一行或多行
24、數(shù)據(jù)稱為取數(shù)據(jù)。 對游標中的數(shù)據(jù)逐行操作。對游標中的數(shù)據(jù)逐行操作。 關(guān)閉和釋放游標。關(guān)閉和釋放游標。5.把指定屬性作為變量顯示你需要召集所有部門頭目開會。為此你需要部門你需要召集所有部門頭目開會。為此你需要部門和相應(yīng)部門頭目的列表如下,其格式如下:和相應(yīng)部門頭目的列表如下,其格式如下: Department Name = Production Department Head = Samuel Moore Department Name = Sales Department Head = Donald Fleming . . 創(chuàng)建報告所需的步驟創(chuàng)建報告所需的步驟執(zhí)行創(chuàng)建報告所需的語句執(zhí)行創(chuàng)建報告
25、所需的語句按所需的結(jié)果驗證其輸出按所需的結(jié)果驗證其輸出游標的定義及使用過程游標的定義及使用過程聲明游標聲明游標聲明游標是指用聲明游標是指用DECLARE語句聲明或創(chuàng)建一個游標語句聲明或創(chuàng)建一個游標。聲明游標的語法如下:聲明游標的語法如下:DECLARE cursor_name SCROLL CURSORFOR select_statementFOR READ ONLY|UPDATEOF column_name_list其中:其中: cursor_name:cursor_name:是游標的名字,為一個合法的是游標的名字,為一個合法的SQL ServerSQL Server標識符,游標的名字必須遵
26、循標識符,游標的名字必須遵循SQL SQL ServerServer命名規(guī)范。命名規(guī)范。SCROLLSCROLL:表示取游標時可以使用關(guān)鍵字表示取游標時可以使用關(guān)鍵字NEXTNEXT、PRIORPRIOR、FIRSTFIRST、LASTLAST、ABSOLUTEABSOLUTE、RELATIVERELATIVE。每個關(guān)鍵字的含義將在介紹每個關(guān)鍵字的含義將在介紹FETCHFETCH子句時講解。子句時講解。select_statementselect_statement:是定義游標結(jié)果集的標準是定義游標結(jié)果集的標準 SELECTSELECT語句,它可以是一個完整語法和語義的語句,它可以是一個完整語
27、法和語義的Transact-SQLTransact-SQL的的SELECTSELECT語句。語句。 但是這個但是這個SELECT語句必須有語句必須有FROM子句,不允許使用關(guān)鍵字子句,不允許使用關(guān)鍵字 COMPUTE、COMPUTE BY、FOR BROWSE 和和 INTO。FOR READ ONLY:指出該游標結(jié)果集只能讀,不能修改。:指出該游標結(jié)果集只能讀,不能修改。FOR UPDATE:指出該游標結(jié)果集可以被修改。:指出該游標結(jié)果集可以被修改。OF column_name_list:列出可以被修改的列的名單。:列出可以被修改的列的名單。應(yīng)該注意:應(yīng)該注意: 游標有且只有兩種方式:游標有
28、且只有兩種方式:FOR READ ONLY或或FOR UPDATE。 當(dāng)游標方式指定為當(dāng)游標方式指定為FOR READ ONLY時,游標涉及的表不能被修改。時,游標涉及的表不能被修改。 當(dāng)游標方式指定為當(dāng)游標方式指定為FOR UPDATE時,可以刪除或更新游標涉及的表中的行。時,可以刪除或更新游標涉及的表中的行。通常,這通常,這也是缺省方式也是缺省方式,即不指定游標方式時為,即不指定游標方式時為FOR UPDATE方式。方式。 聲明游標的聲明游標的DECLARE CURSOR 語句必須是在該游標的任何語句必須是在該游標的任何OPEN語句之前。語句之前。2. 打開游標打開游標打開游標是指打開已被
29、聲明但尚未被打開的游標,打開游標使用打開游標是指打開已被聲明但尚未被打開的游標,打開游標使用OPEN語句。語句。打開游標的語法如下:打開游標的語法如下: OPEN cursor_name其中:其中:cursor_name是一個已聲明的尚未打開的游標名。是一個已聲明的尚未打開的游標名。注意:注意: 當(dāng)游標打開成功時,游標位置指向結(jié)果集的第一行之前。當(dāng)游標打開成功時,游標位置指向結(jié)果集的第一行之前。 只能打開已經(jīng)聲明但尚未打開的游標。只能打開已經(jīng)聲明但尚未打開的游標。3. 從打開的游標中提取行從打開的游標中提取行游標被打開后,游標位置位于結(jié)果集的第一行前,此時可以從結(jié)果集中提?。ㄓ螛吮淮蜷_后,游標
30、位置位于結(jié)果集的第一行前,此時可以從結(jié)果集中提取(FETCH)行。)行。SQL Server將沿著游標結(jié)果集一行或多行向下移動游標位置,不斷提取結(jié)果集中的數(shù)據(jù),并修改和保存游將沿著游標結(jié)果集一行或多行向下移動游標位置,不斷提取結(jié)果集中的數(shù)據(jù),并修改和保存游標當(dāng)前的位置,直到結(jié)果集中的行全部被提取。標當(dāng)前的位置,直到結(jié)果集中的行全部被提取。從打開的游標中提取行的語法如下:從打開的游標中提取行的語法如下:FETCH NEXT|PRIOR|FIRST|LAST|ABSOLUTE|RELATIVE FROM cursor_name INTO fetch_target_list其中:其中: cursor
31、_name:為一已聲明并已打開的游標名字。:為一已聲明并已打開的游標名字。NEXT|PRIOR|FIRST|LAST|ABSOLUTE|RELATIVE:游標移動方向,缺省情況下是:游標移動方向,缺省情況下是NEXT,即向下,即向下移動。移動。NEXT:取下一行數(shù)據(jù)。:取下一行數(shù)據(jù)。PRIOR:取前一行數(shù)據(jù)。:取前一行數(shù)據(jù)。FIRST:取第一行數(shù)據(jù)。:取第一行數(shù)據(jù)。 LAST:取最后一行數(shù)據(jù)。ABSOLUTE:按絕對位置取數(shù)據(jù)。RELATIVE:按相對位置取數(shù)據(jù)。游標位置確定了結(jié)果集中哪一行可以被提取,如果游標方式為FOR UPDATE的話,也就確定該位置一行數(shù)據(jù)可以被更新或刪除。 INTO
32、fetch_target_list:指定存放被提取的列數(shù)據(jù)的目的變量清單。這個清單中變量的個數(shù)、數(shù)據(jù)類型、順序必須與定義該游標的select_statement的SELECT_list中列出的列清單相匹配。為了更靈活地操縱數(shù)據(jù),可以把從已聲明并已打開的游標結(jié)果集中提取的列數(shù)據(jù),分別存放在目的變量中。INTO fetch_target_list是T-SQL對ANSI-92 SQL標準的擴充。 有兩個全局變量提供關(guān)于游標活動的信息: FETCH_STATUS 保存著最后FETCH語句執(zhí)行后的狀態(tài)信息,其值和含義如下:0 :表示成功完成FETCH 語句。-1:表示FETCH語句執(zhí)行有錯誤,或者當(dāng)前游
33、標位置已在結(jié)果集中的最后一行,結(jié)果集中不再有數(shù)據(jù)。-2:提取的行不存在。 rowcount保存著自游標打開后的第一個保存著自游標打開后的第一個FETCH語句,直到最近一次的語句,直到最近一次的FETCH語句為止,已從游標結(jié)果集中提取的行數(shù)。語句為止,已從游標結(jié)果集中提取的行數(shù)。也就是說它保存著任何時間點客戶機程序看到的已提取的總行數(shù)。一旦結(jié)果集中所有行都被提取,那么rowcount的值就是該結(jié)果集的總行數(shù)。每個打開的游標都與一特定的rowcount有關(guān),關(guān)閉游標時,該rowcount變量也被刪除。在FETCH語句執(zhí)行后查看這個變量,可得知從游標結(jié)果集中已提取的行數(shù)。 4. 關(guān)閉游標關(guān)閉游標關(guān)閉
34、(Close)游標是停止處理定義游標的那個查詢。關(guān)閉游標并不改變它的定義,可以再次用open語句打開它,SQL Server會用該游標的定義重新創(chuàng)建這個游標的一個結(jié)果集。關(guān)閉游標的語法如下:CLOSE cursor_name其中:cursor_name:是已被打開并將要被關(guān)閉的游標名字。在如下情況下,SQL Server會自動地關(guān)閉已打開的游標:當(dāng)你退出這個SQL Server會話時從聲明游標的存儲過程中返回時創(chuàng)建報告所需的步驟(續(xù))你可以抹去由DECLARE游標語句定義的游標的定義語法 DEALLOCATE cursor_name報告所需的步驟(續(xù))-7號你需要用下面的語句來顯示報告。.-C
35、reate two variables that would store the -values returned by the fetch statement.DECLARE DepartmentName char(25)DECLARE DepartmentHead char(25)- Defines the cursor that can be used to - access the records of the table,row by row.DECLARE curDepartment cursor for SELECT vDepartmentName,vDepartmentHead
36、 FROM Department- Open the cursorOPEN curDepartment- Fetch the rows into variablesFETCH curDepartment into DepartmentName, DepartmentHead- Start a loop to display all the rows of - the cursor.While (fetch_status = 0)BEGINPrint Department Name = + DepartmentNamePrint Department Head = + DepartmentHea
37、d- Fetch the next row from the cursor. FETCH curDepartment into DepartmentName, DepartmentHeadEND- Close the cursorCLOSE curDepartment- Deallocate the cursor.DEALLOCATE curDepartment定義一個游標,將學(xué)生表student中所有學(xué)生的姓名、性別顯示出來。DECLARE student_name VARCHAR(8),student_sex VARCHAR(16)DECLARE student_coursor SCROL
38、L CURSOR FOR SELECT name,sex FROM student FOR READ ONLYOPEN student_coursorFETCH student_coursor INTO student_name,student_sexWHILE FETCH_STATUS=0 BEGIN PRINT 學(xué)生姓名:+student_name+ +性別: + student_sex FETCH FROM student_coursor INTO student_name , student_sex ENDCLOSE student_coursorDEALLOCATE student_coursor 用戶可以在UPDATE或DELETE語句中使用游標來更新、刪除表或視圖中的行,但不能用來插入新行。更新數(shù)據(jù)更新數(shù)據(jù)通過在UPDATE語句中使用游標可以更新表或視圖中的行。被更新的行依賴于游標位置的當(dāng)前值。更新數(shù)據(jù)語法形式如下: UPDATE table_name|view_name SET table_name.|view_name. column_name = new_value .n WHERE CURRENT OF cursor_name使用游標修改數(shù)據(jù)其中:其中: 緊跟UPDATE之后的table_name|
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年員工工資保密協(xié)議模板
- 第四單元-兩、三位數(shù)除以一位數(shù)(單元測試)-蘇教版數(shù)學(xué)三年級上冊(含解析)-
- 期末學(xué)業(yè)水平測試題(卷)-語文三年級上冊(部編版)
- 2025年黑龍江建筑職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫1套
- 2025年湖南省湘潭市單招職業(yè)傾向性測試題庫參考答案
- 中學(xué)非球類運動教學(xué)設(shè)計
- 專題18 電功率-2025年中考《物理》一輪復(fù)習(xí)知識清單與解題方法
- 2025年度土地承包種植與農(nóng)業(yè)科技成果轉(zhuǎn)化合同
- 2025年度云計算服務(wù)器采購及運維服務(wù)合同
- 2025年度員工向公司借款合同爭議處理規(guī)則合同
- 企業(yè)財務(wù)會計(第二版)高職PPT完整全套教學(xué)課件
- 3dsMax20223維動畫制作標準教程PPT完整版全套教學(xué)課件
- 《公路工程計量與計價》說課草稿
- NXT上的PoP貼裝課件
- 2023-2024蘇教版小學(xué)數(shù)學(xué)5五年級下冊(全冊)教案設(shè)計
- 批評他人發(fā)言稿(通用12篇)
- 上海實驗學(xué)校幼升小測試題資料
- 一年級美術(shù)課后服務(wù)教案-1
- 重大疾病保險的疾病定義使用規(guī)范(2020年修訂版)-
- RB/T 040-2020病原微生物實驗室生物安全風(fēng)險管理指南
- GB/T 8162-2018結(jié)構(gòu)用無縫鋼管
評論
0/150
提交評論