1. 程式人生 > >SQL第五章(事物和遊標)

SQL第五章(事物和遊標)

1、事物        訪問或修改資料庫內容的程式的執行稱為事物

①事物的特性  如上圖

②事物的模式   

          顯式事物(主要):使用者使用T-SQL明確定義開始和結束的事物

                              begin/commit/rollback       transation

         自動提交事物:sql預設事物方式,能夠制動執行並且能夠自動回滾的事物

                                     對資料庫進行刪除或修改等操作時,如果出現錯誤,操作將被自動取消    

         隱式事物:當事物提交或回滾後,自動開始的事物

/*--------------------------------------------事  務----------------------------------------------------*/     /*--轉帳測試:張三轉賬1000元給李四--*/         --我們可能會這樣這樣編寫語句         --張三的帳戶少1000元,李四的帳戶多1000元         UPDATE bank SET currentMoney = currentMoney - 1000 WHERE customerName = '張三'         UPDATE bank SET currentMoney = currentMoney + 1000 WHERE customerName = '李四'         GO

        --再次檢視轉帳後的結果。         SELECT * FROM bank         GO

    /*--使用事務進行解決--*/         --開始一個事務         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失敗,回滾事務

2、遊標       遊標是一種資料物件,使用它可以按行而不是按集合操縱資料

       遊標的幾個語名:  declare宣告遊標

                                      open開啟遊標

                                      clase關閉遊標

                                     deallocate釋放遊標

                                     fetch可用於在遊標中讀取記錄行

 

/*--------------------------------------------遊  標----------------------------------------------------*/

    /*--語法結構--*/         --DECLARE  cursor_name                        --遊標名         --CURSOR [LOCAL | GLOBAL]                    --全域性或區域性的         --[FORWARD ONLY | SCROLL]                    --遊標滾動方式         --[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]    --遊標讀取方式         --FOR SELECT_statements                        --查詢語句         --[FOR UPDATE [OF Column_name[,….N]]]        --可更改欄位

    /*--使用遊標--*/         --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

/*---------------------------------遊標------------------------------------------*/--宣告遊標 declare cur cursor scroll for select customerName,currentMoney from bank

--開啟遊標 open cur

--讀取遊標     --定義變數,用於存放遊標讀取出來的值 declare @name varchar(6),@money money

    --讀取遊標第一條記錄行,並存放在變數中 fetch first from cur into @name,@money

    --迴圈讀取遊標中的記錄 while @@FETCH_STATUS=0 begin     --用print輸出讀取的資料     print @name+'的餘額為'+convert(varchar(10),@money)     --讀取下一條記錄     fetch next from cur into @name,@money end

--關閉遊標 close cur

--釋放遊標 deallocate cur