1. 程式人生 > >第5章 事務和遊標

第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