事务和游标

2021-09-29  本文已影响0人  任人渐疏_Must
create database lession5
go
use lession5
go
create table bank(
    customerName char(10),--顾客姓名
    currentMoney Money  --当前余额

)
go
--添加检查约束 账户余额不能少于1元
alter table bank add constraint CK_currentMoney check(currentMoney>=1)
go

--添加数据
insert into bank values('张三',1000)
insert into bank values('李四',1)

--转账测试 :张三转账1000元给李四
--张三账户少1000,李四多1000
use lession5
go
update bank set currentMoney=currentMoney-1000 where customerName='张三'
update bank set currentMoney=currentMoney+1000 where customerName='李四'
go

--再次查看转账后的结果
select * from bank
go



use lession5
go
--添加测试数据
insert into bank values('三毛',10000)
insert into bank values('小毛',1)

--开始一个事务
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
--定义一个名为stuInfo_cursor的可随意滚动的游标
declare stuInfo_cursor cursor scroll for select * from StuInfo

--打开该游标
open stuInfo_cursor

--定义个变量,用于存放游标中读取出来的值
declare @id int
declare @name nvarchar(10)
declare @sex char(2)
declare @classid int

--读取游标的第一条记录行,并存放在变量中
fetch first from stuInfo_cursor into @id,@name,@sex,@classid

--循环读取游标中的记录
print '读取的数据如下:'
while(@@fetch_status = 0)
begin
    --用print输出读取的数据
    print '学号:'+convert(nvarchar,@id)
        + '姓名:'+@name 
        + '性别:'+@sex
        +'班级编号:' + convert(nvarchar,@classid)
    --读取下一条记录行
    fetch next from stuInfo_cursor into @id,@name,@sex,@classid
end
--读取完成后关闭游标
close stuInfo_cursor
--删除游标
deallocate stuInfo_cursor

上一篇下一篇

猜你喜欢

热点阅读