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

 

                       

                        

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值