第9章操纵数据库数据
宋钰
课程目标
• 通过本章的学习,应该完成以下学习目标:
学会在SQL 中使用SELECT、INSERT、UPDATE和
DELETE语句操纵数据
学会使用数据转储导出数据
学会使用数据转储导入数据
学会使用SQL Loader加载数据
学会创建目录对象
数据库事务
• 原子性(atomicity )原则规定一个事务的各个部分都必须完成,否则
整个事务都不会完成
• 一致性(consistency )的原则规定查询的结果必须与数据库在查询开
始时的状态一致
• 隔离性(isolation )的原则规定对于其他部分来说,未完成的(也就
是未提交的)事务必须不可视
• 持久性(durability )的原则规定:一旦使用COMMIT命令结束某个事务,
那么就必须保证数据库不丢失这个事务。
执行SQL语句
• SELECT
• INSERT
• UPDATE
• DELETE
• COMMIT
• ROLLBACK
• MERGE
执行SELECT语句
• 使用SELECT命令可以检索数据。一条SELECT语句分阶段执行。执行
SELECT语句的服务器进程会首先查看包含所需数据的数据块是否已经
位于内存和数据库高速缓存区中。如果条件成立,那么执行就会立即
继续进行。如果条件不成立,那么服务器必须在磁盘上定位相应的数
据块,并且将这些数据块复制至数据库高速缓存区
• 服务器进程将数据块从数据文件读取至数据库高速缓存区,而DBWn
进程则将数据块从数据库高速缓存区写入数据文件
• 只要查询所需的数据块位于数据库高速缓存区内,那么进一步的处理
(如排序或聚集)就在指定会话的PGA中完成。执行完成后,结果集
返回至用户进程
• 就读一致性而言,如果查询遇到在查询开始之后被改变的数据块,那
么服务器进程会进入保护这个变化的撤销段,从而定位原有数据和回
滚该变化(这个回滚操作只是针对当前的查询)
执行UPDATE语句
• “撤销”不是“重做”的逆过程!对于表段、索引段或撤销段的数据
块的变化来说,重做可以保护所有的数据块变化。就重做而言,撤销
段只是一个段,对这个段所做的任何变化都必须是持久的
• 首先,必须在DML操作影响的所有记录以及关联索引键上放置锁定
• 接下来会生成重做,此时服务器进程在日志缓冲区中写入即将应用于
指定数据块的变化。这个重做生成操作应用于数据块的变化和撤销块
的变化
• 生成重做后,就可以在数据库高速缓存区内完成下列更新操作:使用变
化后的列更新表数据块,未变化的列则被写入撤销段数据块
执行INSERT与DELETE语句
• INSERT和DELETE语句与UPDATE语句具有相同的管理方式。其中,重做
生成操作完全相同,对数据块和撤销块进行的所有变化都会首先被写
入日志缓冲区。二者的差异在于所生成的撤销数据量不同
• 插入一条记录时,生成撤销的操作只涉及为撤销块写下新的rowid
• 对于DELETE语句来说,因为整条记录都被写入撤销块,所以在必要时
通过在表中插回整条记录就可以回滚这个删除操作
执行ROLLBACK命令
• 如果出现任何错误,那么后台进程都会完全自动地回滚正在进行的事
务
• 发出ROLLBACK命令时,用户可以执行手动的回滚操作
• 回滚UPDATE语句时,未被更新的列会从撤销块复制回表数据块
• 回滚INSERT语句时,Oracle会从撤销块中检索插入记录的rowid,并且
将其用作在表上进行删除的键
• 回滚DELETE语句时,Oracle会根据撤销块中的数据构造一条完整的插
入语句
执行COMMIT命令
• 执行COMMIT命令时发生的所有物理操作是LGWR进程将日志缓冲区的
内容写入磁盘
• 执行COMMIT命令时,LGWR进程会进行几乎实时的写操作,会话在写
操作期间则会被挂起。这个延迟的时间为将日志缓