*重点一:事务
(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