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