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

                --沒有發現錯誤,提交事務
                COMMIT TRANSACTION
                PRINT '交易成功,已保存新數據'

            END
        ELSE
            BEGIN
                --執行出錯,回滾事務
                ROLLBACK 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

 

                       

                        

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章