第5章 事務和遊標
*重點一:事務 (1)定義:事務是由若干條T_SQL指令組成的作為單個邏輯工作單位執行的一系類操作,這一系列操作作為
一個整體一起向系統提交,要麼全部執行完成,要麼全部撤銷。(事務是一個不可分割的工作邏輯單元) (2)分類:1.顯示事務:使用者使用T_SQL明確定義開始和結束的事務。 begin transacation--開始事務 commit transacation--提交事務 rollback transacation--回滾事務(將整個事務撤銷) 2.自動提交事務:自動執行自動回滾。 3.隱式事務:提交或回滾後,自動開始。 /*--使用事務進行解決--*/ --開始一個事務 BEGIN TRANSACTION tran_bank --也可簡寫為begin tran tran_bank --定義一個用於記錄錯誤的變數 DECLARE @tran_error INT SET @tran_error = 0 --在張三的賬戶減去 UPDATE bank SET currentMoney = currentMoney - 10000 WHERE customerName = '張三' SET @tran_error = @tran_error + @@error --在李四的賬戶增加 UPDATE bank SET currentMoney = currentMoney + 10000 WHERE customerName = '李四' SET @tran_error = @tran_error + @@error IF @tran_error <> 0 BEGIN --執行出錯,回滾事務 ROLLBACK TRANSACTION PRINT '轉賬失賬,交易已取消' END ELSE BEGIN --沒有發現錯誤,提交事務 COMMIT TRANSACTION PRINT '交易成功,已儲存新資料' END GO --再次檢視轉帳後的結果。 SELECT * FROM bank GO
--事務的基本結構 --1、開啟事務 --2、定義變數,用於儲存錯誤編號 --3、對每一條sql語句進行錯誤捕捉 --4、對錯誤編號進行處理 -- 4.1成功,提交事務 -- 4.2失敗,回滾事務
*重點二:遊標 (1)定義:遊標是一種能從條資料記錄的結果集中每次提取一條記錄的機制。 (2)分類:1.T_SQL遊標:基於declare cursor語法,主要用在T_SQL指令碼、儲存過程和觸發器中。 2.API伺服器遊標:應用程式程式設計介面,在伺服器上使用。 3.客戶端伺服器遊標
/*--語法結構--*/ --DECLARE cursor_name --遊標名 --CURSOR [LOCAL | GLOBAL] --全域性或區域性的 --[FORWARD ONLY | SCROLL] --遊標滾動方式 --[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] --遊標讀取方式 --FOR SELECT_statements --查詢語句 --[FOR UPDATE [OF Column_name[,….N]]] --可更改欄位
(3)宣告遊標: local/grobal:全域性遊標/區域性遊標。
forward only/scroll:後滾動/隨意滾動。 read_only:只讀遊標。 scroll_locks:鎖定遊標。 optimistic:遊標讀取記錄時,不會鎖定。 update:可更改欄位。
(4)開啟遊標 open 遊標名稱 (5)檢索記錄 fetch first:提取第一行。 fetch next:提取下一行。 fetch prior:提取前一行。 fetch last:提取最後一行。 /*--使用遊標--*/ --1.宣告遊標 DECLARE bank_cursor CURSOR SCROLL FOR SELECT * FROM bank --FOR SELECT customerName,currentMoney FROM bank --獲取部分列
--2.開啟該遊標 OPEN bank_cursor
--3.讀取遊標 --定義個變數,用於存放遊標中讀取出來的值 DEClARE @id int DECLARE @name CHAR(10) DECLARE @money MONEY --讀取遊標的第一條記錄行,並存放在變數中 FETCH FIRST FROM bank_cursor INTO @id,@name,@money --IF (@@fetch_status = 0) --BEGIN -- PRINT '賬戶名:' + @name + ' 餘額:' + convert(VARCHAR,@money) --END --FETCH NEXT FROM bank_cursor INTO @id,@name,@money --IF (@@fetch_status = 0) --BEGIN -- PRINT '賬戶名:' + @name + ' 餘額:' + convert(VARCHAR,@money) --END --迴圈讀取遊標中的記錄 PRINT '讀取的資料如下:' WHILE (@@fetch_status = 0) BEGIN --用print輸出讀取的資料 PRINT '賬戶名:' + @name + ' 餘額:' + convert(VARCHAR,@money) --update bank set currentMoney = currentMoney+1000 where customerId = @id --讀取下一條記錄行 FETCH NEXT FROM bank_cursor INTO @id,@name,@money END
--4.讀取完成後關閉遊標 CLOSE bank_cursor
--5.釋放遊標 DEALLOCATE bank_cursor