SQL第5章

*--------------------------------------------事  务----------------------------------------------------*/
    /*--转帐测试:张三转账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失败,回滚事务
        

/*--------------------------------------------游  标----------------------------------------------------*/

    /*--语法结构--*/
        --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

猜你喜欢

转载自blog.csdn.net/qq_43124903/article/details/82631081