第5章 事务和游标

*重点一:事务
    (1)定义:事务是由若干条T_SQL指令组成的作为单个逻辑工作单位执行的一系类操作,这一系列操作作为

一个整体一起向系统提交,要么全部执行完成,要么全部撤销。(事务是一个不可分割的工作逻辑单元)
    (2)分类:1.显示事务:用户使用T_SQL明确定义开始和结束的事务。
            begin transacation--开始事务    
        commit transacation--提交事务
        rollback transacation--回滚事务(将整个事务撤销)    
         2.自动提交事务:自动执行自动回滚。
         3.隐式事务:提交或回滚后,自动开始。
    
    /*--使用事务进行解决--*/
        --开始一个事务
        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失败,回滚事务


*重点二:游标
    (1)定义:游标是一种能从条数据记录的结果集中每次提取一条记录的机制。
    (2)分类:1.T_SQL游标:基于declare cursor语法,主要用在T_SQL脚本、存储过程和触发器中。
         2.API服务器游标:应用程序编程接口,在服务器上使用。
         3.客户端服务器游标

    /*--语法结构--*/
        --DECLARE  cursor_name                        --游标名
        --CURSOR [LOCAL | GLOBAL]                    --全局或局部的
        --[FORWARD ONLY | SCROLL]                    --游标滚动方式
        --[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]                    --游标读取方式
        --FOR SELECT_statements                        --查询语句
        --[FOR UPDATE [OF Column_name[,….N]]]                        --可更改字段

    (3)声明游标:
    local/grobal:全局游标/局部游标。

    forward only/scroll:后滚动/随意滚动。
    read_only:只读游标。
    scroll_locks:锁定游标。
    optimistic:游标读取记录时,不会锁定。
    update:可更改字段。

    (4)打开游标
    open 游标名称
    (5)检索记录
    fetch first:提取第一行。
    fetch next:提取下一行。
    fetch prior:提取前一行。
    fetch last:提取最后一行。

    /*--使用游标--*/
        --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

猜你喜欢

转载自blog.csdn.net/qq_43128070/article/details/82621468