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