Lesson5简单事务、存储过程、函数.ppt_第1页
Lesson5简单事务、存储过程、函数.ppt_第2页
Lesson5简单事务、存储过程、函数.ppt_第3页
Lesson5简单事务、存储过程、函数.ppt_第4页
Lesson5简单事务、存储过程、函数.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

事务、存储过程和函数 子程序 本章目标 简单事务 了解存储过程的优点 掌握常用的系统存储过程 掌握如何创建存储过程 掌握如何调用存储过程 为什么需要事务 银行转帐 例如,银行转帐问题: 假定资金从帐户A转到帐户B,至少需要两步: 帐户A的资金减少 然后帐户B的资金相应增加 帐户A帐户B 假定张三的帐户直接转帐1000元到李四的帐户 为什么需要事务 CREATE TABLE bank ( customerName CHAR(10), -顾客姓名 currentMoney MONEY -当前余额 ) GO ALTER TABLE bank ADD CONSTRAINT CK_currentMoney CHECK(currentMoney=1) GO INSERT INTO bank(customerName,currentMoney) VALUES(张三,1000) INSERT INTO bank(customerName,currentMoney) VALUES(李四,1) 创建帐户表,存放用户的帐户信息 添加约束:根据银行规定,帐户 余额不能少于1元,否则视为销户 张三开户,开户金额为1000元 ;李四开户,开户金额1元 为什么需要事务 目前两个帐户的余额总和为:1000+1=1001元 为什么需要事务 模拟实现转帐 : 从张三的帐户转帐1000元到李四的帐户 /*-转帐测试:张三转账1000元给李四-*/ -我们可能会这样这样编写语句 -张三的帐户少1000元,李四的帐户多1000元 UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三 UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四 GO -再次查看转帐后的结果。 SELECT * FROM bank GO 请问: 执行转帐语句后,张三、李四的 帐户余额为多少? l张三的帐户没有减少 l但李四的帐户却多了1000元 l100010012001元 总额多出了1000元! 为什么需要事务 -张三的帐户减少1000元,李四的帐户增加1000元 UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三 UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四 GO 错误原因分析: UPDATE语句违反约束: 余额=1元 执行失败,所以张三还是1000元 继续往下执行:执行成功,所以李四变为1001元 如何解决呢?使用事务 什么是事务 事务(TRANSACTION)是作为单个逻辑工作单元执 行的一系列操作 这些操作作为一个整体一起向系统提交,要么都 执行、要么都不执行 事务是一个不可分割的工作逻辑单元 转帐过程就是一个事务。 它需要两条UPDATE语句来完成,这两条语句是一个整体 ,如果其中任一条出现错误,则整个转帐业务也应取消, 两个帐户中的余额应恢复到原来的数据,从而确保转帐前 和转帐后的余额不变,即都是1001元。 事务的特性 事务必须具备以下四个属性,简称ACID 属性: 原子性(Atomicity):事务是一个完整的操作。事务的各 步操作是不可分的(原子的);要么都执行,要么都不执行 一致性(Consistency):当事务完成时,数据必须处于一 致状态 隔离性(Isolation):对数据进行修改的所有并发事务是 彼此隔离的,这表明事务必须是独立的,它不应以任何方式依 赖于或影响其他事务 永久性(Durability):事务完成后,它对数据库的修改被 永久保持,事务日志能够保持事务的永久性 如何创建事务 T-SQL使用下列语句来管理事务: 开始事务:BEGIN TRANSACTION 提交事务:COMMIT TRANSACTION 回滚(撤销)事务:ROLLBACK TRANSACTION 一旦事务提交或回滚,则事务结束。 判断某条语句执行是否出错: 使用全局变量ERROR; ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务 中所有T-SQL语句是否有错,我们需要对错误进行累计; 如: SET errorSum=errorSum+error 如何创建事务 了解事务的分类: 显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用 的事务类型 自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T- SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自 动回滚 隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性 事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成 时,再下一个 T-SQL 语句又将启动一个新事务 关键语句讲解 BEGIN TRANSACTION /*-定义变量,用于累计事务执行过程中的错误-*/ DECLARE errorSum INT SET errorSum=0 -初始化为0,即无错误 /*-转帐:张三的帐户少1000元,李四的帐户多1000元*/ UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三 SET errorSum=errorSum+error UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四 SET errorSum=errorSum+error -累计是否有错误 如何创建事务 使用事务解决银行转帐问题 开始事务(指定事务从此处开始, 后续的T-SQL语句都是一个整体) 累计是否有错误 IF errorSumsage -执行 exec inputparamproc 21 执行方法一 exec inputparamproc 执行方法二 输出参数的存储过程 -带有输出参数的存储过程 create proc OutputParamProc count int output as select * from student select count=count(*) from student -输出参数赋予值 -执行 declare count int exec outputparamproc count output print 共有用户:+convert(varchar(20),count) 混合使用 -混合使用,且有默认值情况 create proc MixParamProc sage int = 21, count int = 1 output -如果输出参数在过程中未获得值,则使用此值 as select * from student where sage sage; select count=count(*) from student; -输入参数不传入 declare c int exec MixParamProc count=c output print 共有用户:+convert(varchar(20),c) -传入输入参数 declare c int exec MixParamProc 20,c output print 共有用户:+convert(varchar(20),c) 分页存储过程 -分页存储过程 create proc PageProc pageNo int = 1, -页码 pageSize int = 10, -每页记录条数 pageCount int output -总页数 as declare count int,residue int select count=count(*) from student set residue = count%pageSize if(residue = 0) begin set pageCount = count/pageSize end else begin set pageCount = count/pageSize+1 end select * from (select ntile(pageCount) over(order by sno desc) as pageno,* from student) as page where pageno=pageNo 函数 标量函数 返回一个确定类型的标量值 内联表值型函数 返回一个表 多声明表值型函数 标量与内联表值型函数 标量函数 create function fun1(id int) returns varchar(20) as begin declare content varchar(20) if(id = 1) set content = success else set content = fail return content end -执行 select dbo.fun1(1) 内联表值型函数 create function mytablefunction(search1 int,search2 varchar) returns table as return (select * from student where sno=search1) -此处不可使用 begin end/只能直接用return 返回结果集 TABLE:指定返回值为一个表 Select-stmt:单个select语句,确定返回表的数据 使用table代替临时表 declare c table(no int) -声明table类型的数据 insert into c select sno from student -插入 select * from c -查询 多声明表值型 create function fun3(id int) returns t table(sno int,sname varchar(20) as begin insert into t select sno,sname from student where snoid return end return_variable:TABLE类型的变量,用于存储返回的 数据行。其余参数与标量型用户自定义函数相同 总结 存储过程是一组预编译的SQL语句,它可以包含数据操纵语句、变量 、逻辑控制语句等 存储过程允许带参数,参数分为: 输入参数 输出参数 其中,输入参数可以有默认值。 输入参数:可以在调用时向存储过程传递参数,此类参数可用来向存 储过程中传入值 输出参数从存储过程中返回(输出)值,后面跟随OUTPUT关键字 存储过程总结 第一:存储过程因为SQL语句已经预编绎过了,因此运 行的速度比较快。 第二:存储过程可以接受参数、输出参数、返回单个或 多个结果集以及返回值。可以向程序返回错误原因。 第三:存储过程运行比较稳定,不会有太多的错误。只 要一次成功,以后都会按这个程序运行。 存储过程总结 第四:存储过程主要是在服务器上运行,减少对客户机 的压力。 第五:存储过程可以包含程序流、逻辑以及对数据库的 查询。同时可以实体封装和隐藏了数据逻辑。 第六:存储过程可以在单个存储过程中执行一系列 SQL 语句。 第七:存储过程可以从自己的存储过程内引用其它存储 过程,这可以

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论