您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > Oracle数据库管理与应用实例教程-6-事务
ORACLE数据库管理与应用实例教程本章学习导航本章学习导航本章学习要点(1)声明游标、打开游标、提取游标数据和关闭游标。(2)循环处理游标。(3)游标的更新。(4)提交事务、回滚事务和设置保存点。(5)锁的功能及其类型。8.1游标游标的概念游标(Cursor)是Oracle系统在内存中开辟的一块工作区,在该工作区中存放查询语句返回的结果集。结果集可以包含零条数据记录、一条数据记录,也可以是多条数据记录。在定义游标所在的工作区中,存在一个指针,在初始状态下,游标指针指向查询结果集的第一条数据记录的位置。当执行FETCH语句提取数据记录后,游标指针将向下移动一个数据记录的位置。Oracle中的游标分为显示游标和隐式游标。当查询返回的结果集超过一条数据记录时,就需要一个显式游标,此时用户不能使用SELECTINTO语句。显式游标在PL/SQL块的声明部分声明,在执行部分或异常处理部分打开、提取和关闭PL/SQL管理隐式游标,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。8.1游标游标的概念游标通过以下方式扩展结果处理:从结果集的当前位置检索一行数据记录;支持对结果集的当前数据记录进行数据更新。PL/SQL游标一般按以下步骤来使用:(1)声明游标;(2)打开游标;(3)提取游标数据;(4)对当前数据记录执行更新操作(可选);(5)关闭游标。课堂案例1—游标操作学习使用Oracle的PL/SQL语句声明游标、打开游标、提取游标数据和关闭游标的操作方法。案例学习目标使用DECLARECURSOR声明游标、使用OPENCURSOR打开游标、使用FETCH提取游标数据、使用CLOSECURSOR关闭游标。案例知识要点课堂案例1—游标操作案例完成步骤-基本步骤1.声明游标声明游标,就是使一个游标与一条查询语句建立联系。DECLARECURSOR游标名[(参数1数据类型[,…n])]IS查询语句[FORUPDATE[OF[用户方案.]表名.列名[,…n]]];2.打开游标就是执行游标定义时所对应的查询语句,并把查询返回的结果集存储在游标对应的工作区中。OPEN游标名[(参数1[,…n])];3.提取游标数据就是从定义游标的工作区中检索一条数据记录作为当前数据记录。FETCH游标名INTO变量1[,…n]4.关闭游标CLOSE游标名;课堂案例1—游标操作案例完成步骤-实例【例1-1】使用游标查询商品表GOODS中第一款商品的信息。8.1.3游标的属性游标的属性(1)%ISOPEN描述游标是否已经打开,返回布尔型值。如果游标没有打开就直接使用FETCH语句提取游标数据,Oracle系统就会报告错误。(2)%FOUND描述最近一次FETCH操作的执行情况,返回布尔型值。如果最近一次使用FETCH语句提取游标数据得到结果则返回TRUE,否则返回FALSE。(3)%NOTFOUND用于描述最近一次FETCH操作的执行情况,返回布尔型值。但与%FOUND属性不同的是,如果最近一次使用FETCH语句提取游标数据没有得到结果则返回TRUE,否则返回FALSE。(4)%ROWCOUNT用于描述截至目前从游标工作区提取的实现记录数。8.1.3游标的属性游标的属性【例1-3】使用游标查询商品表GOODS中所有商品的信息。8.1.4游标中的循环游标中的循环循环提取游标工作区内结果集的数据记录时,既可以通过LOOP循环来简单实现,也可以通过FOR循环来实现复杂功能。而且,使用FOR循环提取游标数据时,与其他方法有些差异,主要表现在:使用FOR循环提取游标数据时,Oracle系统自动打开游标,而不必显式地使用OPEN语句打开游标;Oracle系统隐含地定义了一个数据类型为%ROWTYPE的变量,并以此作为循环的计数器;Oracle系统自动重复从游标工作区内提取数据并放入计数器变量中;当游标工作区内所有数据记录都被提取完成或者循环中止时,Oracle系统会自动关闭游标8.1.4游标中的循环游标中的循环【例1-4】使用游标查询商品表GOODS中“02”类型的所有商品的信息。可以通过使用FOR循环提取游标的数据,并向游标内部传入商品类别编号作为游标参数8.1.4游标的更新游标的更新UPDATE或DELETE语句中的WHERECURRENTOF子句专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FORUPDATE子句,当对话使用FORUPDATE子句打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT...FORUPDATE操作。在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么在正常情况下Oracle将等待,直到数据行解锁。在UPDATE和DELETE中使用WHERECURRENTOF子句的语法格式如下:WHERECURRENTOF游标名|条件表达式8.1.4游标的更新游标的更新【例1-5】使用带FORUPDATE子句的游标更新商品表GOODS中商品详细描述信息,并显示更新前后的信息8.2事务事务概述事务(Transaction)是Oracle系统中进行数据库操作的基本单位。事务是一个操作序列,它包含了一组SQL语句,所有的SQL语句作为一个逻辑整体一起向Oracle系统提交或者撤销操作请求,即事务中的SQL语句要么都被执行,要么都不被执行。事务是Oracle系统中一个不可分割的逻辑工作单元。应用事务可以保证Oracle数据库的一致性和可恢复性8.2事务事务概述一个事务的逻辑工作单元必须具有以下属性。(1)原子性(Atomicity)一个事务必须作为Oracle系统工作的原子单位(在化学中,原子称为“不可再分的微粒”),事务要么全部执行,要么全部不执行。(2)一致性(Consistency)当事务完成之后,所有数据必须处于一致性状态,事务所修改的数据必须遵循Oracle数据库的各种完整性约束。(3)隔离性(Isolation)一个事务所做的更新操作必须与其他事务所做的更新操作保持完全隔离,在并发处理过程中,一个事务所开始处理的数据必须为另一个事务处理前或者处理后的数据,而不能为另一个事务正在处理的数据。这种隔离性是通过Oracle的锁机制来实现的。(4)永久性(Durability)事务完成后,事务对数据库所做的更新被永久保持。事务的上述4种属性也称为事务的ACID(取每种属性的英文名称的首字母组成)属性课堂案例2—事务处理学习使用Oracle的PL/SQL语句进行事务提交、事务回滚、事务撤销和设置保存点等操作。案例学习目标使用COMMIT事务提交、使用ROLLBACK进行事务回滚、事务撤销和使用SAVEPOINT设置事务保存点。案例知识要点课堂案例2—事务处理案例完成步骤-事务提交1.事务提交事务提交(Commit)用于提交自上次提交以后对数据库中数据所做的改动。在Oracle数据库中,为了维护数据的一致性,系统为每个用户分别设置了一个工作区,对数据表中数据所做的添加、修改和删除操作都在工作区内完成。在Oracle系统中,提交事务的命令是COMMIT课堂案例2—事务处理案例完成步骤-事务提交【例1-6】提交更新商品表GOODS的事务。分析:在执行更新商品表GOODS的UPDATE语句后,只有当前用户可以看到数据库更新后的结果,此时还需要显式使用COMMIT命令(除非设置自动提交开关的状态为ON)提交事务,以使数据更新生效。--执行数据更新操作UPDATESCOTT.GOODSSETg_DESCRIPTION='男人的衣柜,展现男人的魅力'WHEREg_ID='040001';--提交事务COMMIT;课堂案例2—事务处理案例完成步骤-事务回滚事务回滚(Rollback)是指当事务中的某一条SQL语句执行失败时,将对数据库的操作恢复到事务执行前或者某个指定位置。ROLLBACK[TO保存点];【例1-7】更新商品表GOODS的信息,并回滚该事务。--执行数据更新操作UPDATESCOTT.GOODSSETg_DESCRIPTION=NULLWHEREg_ID='040001';--回滚事务ROLLBACK;课堂案例2—事务处理案例完成步骤-设置保存点如果让事务回滚到指定位置,需要在事务中预先设置事务保存点(SavePoint)。所谓保存点,是指在其所在位置之前的事务语句不能回滚的位置,回滚事务后,保存点之后的事务语句被回滚,但保存点之前的事务语句依然被有效执行,即不能回滚。SAVEPOINT保存点名;课堂案例2—事务处理案例完成步骤-设置保存点8.3锁锁的概述Oracle通过使用锁(Lock)机制维护数据的完整性、并发性和一致性。Oracle在两个不同级别上提供读取一致性:语句级读取一致性和事务级读取一致性。(1)语句级读取一致性Oracle总是实施语句级读取一致性,保证单个查询所返回的数据与该查询开始时刻保持一致。(2)事务级读取一致性事务级读取一致性是指在同一个事务中的所有数据对时间点是一致的。8.3锁锁的类型根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(DataLocks,数据锁),用于保护数据的完整性;DDL锁(DictionaryLocks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(InternalLocksandLatches),保护数据库的内部结构。DML锁的目的在于保证并发情况下的数据完整性,在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志了,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。8.3锁锁的类型使用游标实现以报表形式显示BookData数据库中“未还”图书的信息(借书人、借书时间、图书名称、图书作者)任务1在读者还书时,将对BorrowReturn的图书状态的修改操作和对BookStore表的图书状态的操作组合成一个事务进行处理,以保证同一本书的状态是一致的任务2
本文标题:Oracle数据库管理与应用实例教程-6-事务
链接地址:https://www.777doc.com/doc-3612437 .html