Oracle 11g中文版数据库管理、应用与开发标准教程 9787302194071

《Oracle11g中文版数据库管理、应用与开发标准教程(清华电脑学堂)》全面介绍Oracle 11g中文版数据库管理和应用的知识。《Oracle11g中文版数据库管理、应用与开发标准教程(清华电脑学堂)》共分为15章,介绍关系数据库的基本

176 23 144MB

Chinese Pages 389 [400] Year 2009

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Oracle 11g中文版数据库管理、应用与开发标准教程
 9787302194071

Table of contents :
封面
书名
版权
前言
目录
第1章 Oracle 11g简介
1.1 关系数据库的基本理论
1.1.1 数据库系统与关系数据库
1.1.2 关系数据库的逻辑模型
1.1.3 关系数据库的设计规范
1.2 Oracle数据库与网格技术
1.2.1 网格技术
1.2.2 Oracle网格体系结构
1.3 Oracle应用结构
1.3.1 多数据库的独立宿主结构
1.3.2 客户机/服务器结构
1.3.3 分布式结构
1.4 Oracle 1 1g for Windows的安装与配置
1.5 Oracle 11g的管理工具
1.5.1 使用SQL*Plus
1.5.2 使用Oracle Enterprise Manager
1.5.3 使用DBCA创建数据库
第2章 Oracle的体系结构
2.1 Oracle体系结构概述
2.2 逻辑存储结构
2.2.1 数据块
2.2.2 盘区
2.2.3 段
2.2.4 表空间
2.3 物理存储结构
2.3.1 数据文件
2.3.2 控制文件
2.3.3 其他文件
2.4 实例的内存结构
2.4.1 系统全局区
2.4.2 程序全局区
2.5 实例的进程结构
2.5.1 用户进程
2.5.2 服务器进程
2.5.3 后台进程
2.6 数据字典
2.7 思考与练习
第3章 管理Oracle数据库
3.1 管理初始化参数
3.1.1 常用初始化参数
3.1.2 初始化参数文件
3.1.3 创建初始化参数文件
3.1.4 显示和设置初始化参数文件
3.2 启动数据库与实例
3.2.1 启动数据库的步骤
3.2.2 启动模式
3.2.3 转换启动模式
3.3 关闭数据库与实例
3.3.1 数据库的关闭步骤
3.3.2 正常关闭方式(NORMAL)
3.3.3 立即关闭方式(IMMEDIATE)
3.3.4 事务关闭方式(TRANSACTIONAL)
3.3.5 终止关闭方式(ABORT)
3.4 数据库的特殊状态
3.4.1 静默状态
3.4.2 挂起状态
3.5 思考与练习
第4章 SQL*Plus命令
4.1 SQL*Plus的运行环境
4.1.1 使用SET语句选项
4.1.2 设置运行环境示例
4.2 SQL*Plus命令
4.2.1 HELP命令
4.2.2 DESCRIBE命令
4.2.3 PROMPT命令
4.2.4 SPOOL命令
4.3 格式化查询结果
4.3.1 COLUMN命令
4.3.2 TTITLE和BTITLE命令
4.4 缓存区
4.5 实验指导
4.6 思考与练习
第5章 SQL语句基础
5.1 用户模式
5.1.1 SCOTT模式
5.1.2 HR模式
5.1.3 其他模式
5.2 SELECT语句的用法
5.2.1 检索单表数据
5.2.2 过滤数据
5.2.3 排序数据
5.2.4 多表检索
5.3 函数的使用
5.3.1 字符函数
5.3.2 数学函数
5.3.3 时间和日期函数
5.3.4 转换函数
5.3.5 统计函数
5.3.6 分组技术
5.4 子查询
5.4.1 子查询的概念
5.4.2 单行子查询
5.4.3 多行子查询
5.4.4 关联子查询
5.5 操作数据
5.5.1 插入数据
5.5.2 更新数据
5.5.3 删除数据
5.6 Oracle事务处理
5.6.1 事务的基本概念
5.6.2 事务控制
5.7 实验指导
5.8 思考与练习
第6章 PL/SQL编程基础
6.1 PL/SQL概述
6.2 变量与数据类型
6.2.1 PL/SQL变量的声明
6.2.2 %TYPE变量
6.2.3 复合变量
6.3 条件语句
6.3.1 IF...THEN条件语句
6.3.2 IF...THEN...ELSE条件语句
6.3.3 IF...THEN...ELSIF条件语句
6.3.4 CASE条件语句
6.4 循环语句
6.4.1 LOOP...END LOOP循环
6.4.2 WHILE循环
6.4.3 FOR循环
6.5 游标的使用
6.5.1 隐式游标
6.5.2 显式游标
6.5.3 游标FOR循环
6.6 异常处理
6.6.1 预定义异常
6.6.2 非预定义异常
6.6.3 用户定义的异常
6.7 实验指导
6.8 思考与练习
第7章 存储过程、触发器和程序包
7.1 存储过程
7.1.1 创建存储过程
7.1.2 参数
7.1.3 默认值
7.1.4 过程中的事务处理
7.2 函数
7.3 触发器
7.3.1 触发器概述
7.3.2 语句级触发器
7.3.3 行级触发器
7.3.4 instead of触发器
7.3.5 用户事件触发器
7.4 程序包
7.4.1 程序包规范
7.4.2 程序包主体
7.4.3 重载
7.5 实验指导
7.6 思考与练习
第8章 管理表
8.1 创建表
8.1.1 表结构
8.1.2 创建表
8.1.3 表特性
8.2 修改表
8.2.1 增加和删除字段
8.2.2 更新字段
8.2.3 重命名表
8.2.4 改变表的存储表空间和存储参数
8.2.5 删除表定义
8.2.6 修改表的状态
8.3 定义和管理数据完整性约束
8.3.1 非空约束
8.3.2 主键约束
8.3.3 唯一性约束
8.3.4 外键约束
8.3.5 禁止和激活约束
8.3.6 删除约束
8.4 使用大对象数据类型
8.5 实验指导
8.6 思考与练习
第9章 索引与索引组织表
9.1 索引基础
9.2 建立索引
9.2.1 建立B树索引
9.2.2 建立位图索引
9.2.3 建立反向键索引
9.2.4 基于函数的索引
9.3 修改索引
9.3.1 合并索引和重建索引
9.3.2 删除索引
9.3.3 显示索引信息
9.4 索引组织表
9.4.1 索引组织表与标准表
9.4.2 修改索引组织表
9.5 实验指导
9.6 思考与练习
第10章 其他模式对象
10.1 管理表分区与索引分区
10.1.1 分区的概念
10.1.2 建立分区表
10.1.3 修改分区表
10.1.4 分区索引和全局索引
10.2 外部表
10.2.1 建立外部表
10.2.2 处理外部表错误
10.2.3 修改外部表
10.3 临时表
10.4 簇与簇表
10.4.1 索引簇
10.4.2 散列簇
10.4.3 显示簇信息
10.5 管理视图
10.5.1 创建视图
10.5.2 管理视图
10.6 管理序列
10.6.1 创建序列
10.6.2 修改序列
10.7 管理同义词
10.8 实验指导
10.9 思考与练习
第11章 控制文件与日志文件的管理
11.1 管理控制文件
11.1.1 控制文件简介
11.1.2 复合控制文件
11.1.3 建立控制文件
11.1.4 控制文件的备份与恢复
11.1.5 删除控制文件
11.1.6 查看控制文件信息
11.2 管理重做日志文件
11.2.1 重做日志简介
11.2.2 增加重做日志
11.2.3 删除重做日志
11.2.4 改变重做日志的位置或名称
11.2.5 显示重做日志信息
11.3 管理归档日志
11.3.1 日志操作模式
11.3.2 控制归档
11.3.3 配置归档文件格式
11.3.4 配置归档位置
11.3.5 显示归档日志信息
11.4 查看日志信息
11.4.1 LogMiner概述
11.4.2 创建LogMiner使用的字典文件
11.4.3 指定分析的日志文件
11.4.4 启动LogMiner
11.4.5 查看分析结果
11.4.6 结束LogMiner
11.5 实验指导
11.6 思考与练习
第12章 管理表空间和数据文件
12.1 建立表空间
12.1.1 建立普通表空间
12.1.2 建立大文件表空间
12.1.3 建立临时表空间
12.1.4 建立非标准块表空间
12.2 维护表空间
12.2.1 改变表空间可用性
12.2.2 改变表空间读写状态
12.2.3 改变表空间名称
12.2.4 设置默认表空间
12.2.5 删除表空间
12.2.6 查询表空间信息
12.3 管理数据文件
12.3.1 数据文件的管理策略
12.3.2 添加表空间数据文件
12.3.3 改变数据文件的大小
12.3.4 改变数据文件的可用性
12.3.5 改变数据文件的名称和位置
12.4 管理UNDO表空间
12.4.1 UNDO概述
12.4.2 UNDO参数
12.4.3 建立UNDO表空间
12.4.4 修改UNDO表空间
12.4.5 切换UNDO表空间
12.4.6 设置UNDO记录保留的时间
12.4.7 删除UNDO表空间
12.4.8 查看UNDO表空间信息
12.5 实验指导
12.6 思考与练习
第13章 用户权限与安全
13.1 用户和模式
13.2 管理用户
13.2.1 创建用户
13.2.2 修改用户
13.2.3 删除用户
13.3 资源配置PROFILE
13.3.1 PROFILE概念
13.3.2 使用PROFILE管理密码
13.3.3 使用PROFILE管理资源
13.3.4 修改和删除PROFILE
13.3.5 显示PROFILE信息
13.4 管理权限
13.4.1 权限简介
13.4.2 管理系统权限
13.4.3 管理对象权限
13.5 管理角色
13.5.1 角色的概念
13.5.2 预定义角色
13.5.3 管理自定义角色
13.6 实验指导
13.7 思考与练习
第14章 导出与导入
14.1 EXPDP和IMPDP简介
14.2 EXPDP导出数据
14.2.1 调用EXPDP
14.2.2 EXPDP命令参数
14.3 IMPDP导入数据
14.3.1 IMPDP参数
14.3.2 调用IMPDP
14.3.3 移动表空间
14.4 SQL*Loader导入外部数据
14.4.1 SQL *Loader概述
14.4.2 加载数据
14.5 实验指导
14.6 思考与练习
第15章 备份与恢复
15.1 备份与恢复概述
15.2 RMAN概述
15.2.1 RMAN组件
15.2.2 RMAN通道
15.2.3 RMAN命令
15.3 使用RMAN备份数据库
15.3.1 RMAN备份策略
15.3.2 使用RMAN备份数据库文件和归档日志
15.3.3 多重备份
15.3.4 BACKUP增量备份
15.3.5 镜像复制
15.4 RMAN完全恢复
15.4.1 RMAN恢复机制
15.4.2 恢复处于NOARCHIVELOG模式的数据库
15.4.3 恢复处于ARCHIVELOG模式的数据库
15.5 RMAN不完全恢复
15.5.1 基于时间的不完全恢复
15.5.2 基于撤销的不完全恢复
15.5.3 基于更改的不完全恢复
15.6 维护RMAN
15.6.1 交叉验证备份CROSSCHECK
15.6.2 添加操作系统备份
15.6.3 查看备份信息
15.6.4 定义保留备份的策略
15.7 实验指导
15.8 思考与练习

Citation preview

超值多媒体光盘 多媒体语音视频教程 实例素材和源文件

, 总结了作者多年Oracle数据库教学心得 √ 全面讲解。racle 11g的要点和难点 √ 包含大量数据库管理与应用的典型实例 M 提供丰富的实验指导和习题 √ 配书光盘提供了多媒体语音视频教程

Oracle 11g中文版 数据库管理应用与开发 标准教程

配套网站提供课件下载 o m .cn

本 书 全 面 介 绍 了 Oracle 11g中 文 版 数 据 库 管 理 和 应 用 技 术 。全 书 共 分 15章 , 内 容 涉 及 关 系 数 据 库 基 本 理 论 . Oracle数 据 库 的 应 用 结 构 和 体 系 结 构 、管理 Oracle 数 据 库 ,SQL*Plus命 令 , 基 本 的 SQL语句和 Oracle事 务 管 理 . PUSQL编 程 基 础 、 数 据 库 模 式 对 象 管 理 、数 据 库 文 件 管 理 ,数 据 库 安 全 性 等 。每章 都 提 供 了 丰 富 的 实 验 指 导 ,帮 助 读 者 掌 握 实 际 应 用 知 识 。配 书 光 盘 提 供 了 实 例 素 材 文 件 和 多 媒 体 语音教学视频文件。 本 书 适 合 作 为 各 级 院 校 的 Oracle 数 据 库 管 理 教 材 ,也 可 作 为 。racle数据库应 用和开发人员的参考资料。

Oracle 11g中文版 数据库管理应用与开发

标准教程

w∖

超值多媒体光盘 多 媒体 语 音视 频 教程 实例素材和源文件

√ 总结了作者多年Oracle数据库教学心得 , 全面讲解Oracle 11g的要点和难点 √ 包含大量数据库管理与应用的典型实例 √ 提供丰富的实验指导和习题 , 配书光盘提供了多媒体语音视频教程

内 容 简 介 本 书 全 面 介 绍 Oracle 11g 中 文 版 数 据 库 管 理 和 应 用 的 知 识 。本 书 共 分 为 15 章 ,介 绍 关 系 数 据 库 的 基 本 理 论 ,O racle 数 据 库 的 应 用 结 构 、体 系 结 构 ,管 理 O racle 数 据 库 , SQL*Plus 命 令 、基 本 的 SQL 语 句 和 Oracle 对 事 务 的 管 理 ,在 Oracle 数 据 库 中 使 用 PL/SQL 进 行 编 程 ,Oracle 数 据 库 的 模 式 对 象 管 理 ,O racle 数 据 库 的 文 件 管 理 ,O racle 数 据 库 的 安 全 性 等 。本 书 内 容 全 面 、结 构 完 整 、深 入 浅 出 、通 俗 易 懂 ,并 且 每 章 都 提 供 了 实 验 指 导 , 以 帮 助 读 者 掌 握 面 向 实 际 的 应 用 知 识 。 附 书 光 盘 提 供 了 本 书 实 例完整的素材文件和全程配音教学视频文件。 本 书 可 作 为 各 级 院 校 Oracle 11g 数 据 库 管 理 的 教 材 ,也 可 作 为 Oracle 数 据 库 应 用 和 开 发 人 员 的 参 考资料。

本 书 封 面 贴 有 清 华 大 学 出 版 社 防 伪 标 签 ,无 标 签 者 不 得 销 售 。 版 权 所 有 ,侵 权 必 究 。侵 权 举 报 电 话 :010-62782989 13701121933

C IP )数据 图书在版编目( Oracle 11g中文版数据库 管理、应用与开发 标准教程/许勇等 编著.一北京:清华大学出 版社,2009. 5 ISBN 978-7-302-19407-1 口. 许 … 1 .0 IV. TP311.138

Π I .关系数据库-数据 库管理系统,Oracle 11g-教 材

2009)第 012746号 中国版本图书馆C IP 数 据 核 字 (

责 任 编 辑 :冯志强 责 任 校 对 :徐俊伟 责 任 印 制 :孟凡玉 地

出 版 发 行 :清 华 大 学 出 版社 http :〃w w w . tup. com. cn 社



机 :010-62770175

址 :北 京 清 华 大 学 学 研 大 厦 A 座



编 :100084



购 :010-62786544

投 稿 与 读 者 服 务 :010-62776969 ,c-service@tup. tsinghua. edu. cn 反 馈 :010-62772015,zhiliang@tup. tsinghua. edu. cn 质 量 印 刷 者 :清 华 大 学 印 刷 厂 装 订 者 :北 京 国 马 印 刷 厂 开

销 :全 国 新 华书 店 本 :1 8 5 X 2 6 0 印 张 :25



附光盘1 张 次 :2 0 0 9 年 5 月 第 1 版





数 :l ~ 5 0 0 0



价 :43. 0 0 元

字 印

数 :6 1 9 千字 次 :2 0 0 9 年 5 月 第 1 次印刷

请与清华大学出版社出版部联系 脱页等印装质量问题, 倒页、 缺页、 漏印、 本书如存在文字不清、 产 品 编 号 :031019-01 010)62770177转 3103 调 换 。联 系 电 话 :(

O racle数据库作为当今世界上最优秀、使用最广泛 的关系数据库管理系统,以能够 提供分布式信息安全性、完整性、一致性,很强 的并发控制和恢复能力以及管理超大规 模数据库的能力而著称于世。在硬件允许的前提 下,O racle数据库能支持上万的用户, 管 理 数 百 G B 的数据,而 且 O racle的跨平台性能非常好。 O racle公司总在跟踪并利用计算机科学中的最新成 就,以保证O racle数据库在功能、 理论和实践方面处于领先地位。因此,O racle数据库系统较为复杂,学习时要掌握的东 西较多,相对于初学者入门比较困难。 到目前为止,O racle公司推出的最新版本的数据库产品为Oracle llg , 11g和 10g都 提供了网格计算的能力,但 11g又 在 1 0 g 的基础上进行了扩充。虽 然 本 书 以 Oracle 11g 为例,系统地介绍O racle数据库的基础知识和应用,但是本书所介绍 的知识同样适用于 其他版本。 1 . 本书内容 本 书 作 为 Oracle 11g的入门教程,共 分 为 1 5 章 。第 1〜 3 章介绍关系数据库的基本 理论、O racle数据库的体系结构和管理O racle数据库。第 4 ~ 5 章 介 绍 SQL*Plus命令、 第 6 - 7 章介绍 在 O racle数据库中使用PL/SQL 基 本 的 SQ L语 句 和 Oracle对事务的管理。 进行编程的知识。第 8〜 1 0 章主要介绍O racle数据库的模式对象管理,O racle数据库的 模式对象包括基本表、索引和索引组织表、分区 表和分区索引、外部表、临时表、簇和 簇表、视图、序列和同义词等。第 11、1 2 章 介 绍 对 O racle数据库的文件进行管理的知 识 ,包括控制文件、日志文件和数据文件,以及与 数据库文件对应的表空间。第 13〜 15 章 介 绍 O racle数据库的安全性,包括用户权限、角色、导 入/导出数据、备份数据。 2 . 本书特色 本书内容详略得当、重点突出,理论讲解、虚实结合,简明实用,是一本优秀的Oracle 11g中文版教程。 □ 实 验 指 导 本 书 安 排 了 丰 富 的 实 验 指 导 ,以实例形式演示Oracle 1 1 g中文版的 应用和开发,便于读者模仿学习操作,同时方便 教师组织授课内容。 实验指导 内容加强了本书的实践操作性。 本书结合了 1 0 多 个 Oracle 11g应用实例展开内容,涵盖了 O ra c le 的



丰富实例



主要应用领域。 多媒体光盘 随书光盘提供了全部的案例素材文件,为读者的实际操作提供了 一个完善的练习平台。

3 . 本书读者对象 本书内容全面、结构完整、深入浅出、通俗易懂 、可读性和可操作性强,并配有多 媒体光盘。既适合作为各级院校学生学习Oracle 11g数据库管理的教材,也 可 作 为 Oracle 数据库应用和开发人员的参考资料。 参与本书编写的除了封面署名人员外,还有王敏 、马海军、祁凯、孙江玮、田成军、

--------------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 刘俊杰、赵俊昌、王泽波、张银鹤、刘治国 、何方、李海庆、王树兴、朱俊成、康显丽 、 崔群法、孙岩、倪宝童、王立新、王咏梅、辛爱军、牛小平、贾栓稳、赵元庆、杨宁宁 、 郭晓俊、方宁、王黎、安征、亢凤林、李 海峰等。 由于时间仓促,水平有限,疏漏之处在所难 免,欢迎读者朋友登录清华大学出版社 的网站www.tup.com.cn与我们联系,帮助 我们改进提高。

目录

O

C

N

T E N

T S

第 1 章 Oracle 11g简介............. 1

2 . 5 实例的进程结构................. 35

1 . 1 关系数据库的基本理论........... 1

2 . 5 . 1 用 户 进 程 ................. 35

1 . 1 . 1 数据库系统与关系数据库…•…1

2 . 5 . 2 服 务 器 进 程 ...............36

1.2

1 . 1 . 2 关系数据库的逻辑模型..... 2

2 . 5 . 3 后 台 进 程 ................. 36

1 . 1 . 3 关系数据库的设计规范..... 3

2 . 6 数据字典....................... 41

O racle数据库与网格技术.......... 6

2.7

思考与练习..................... 42 I

1 . 2 . 1 网格技术.................. 6 1.2.2 1.3

O racle网格体系结构....... 7

O racle应用结构.................. 8

第3章

3 . 1 管理初始化参数................. 44

1 . 3 . 1 多数据库的独立宿主结构…•…8

3 . 1 . 1 常用初始化参数.......... 44

1 . 3 . 2 客户机/服务器结构......... 9

3 . 1 . 2 初始化参数文件.......... 45 3 . 1 . 3 创建初始化参数文件...... 46

1 . 3 . 3 分 布式结构................9 1.4

3 . 1 . 4 显示和设置初始化

Oracle 11g for Windows 的 安 装 与 配 置 ..................... 10

1.5

管 理 O racle数据库......... 44

Oracle 1 1 g 的管理工具............ 16 1.5.1 使用 SQL*Plus......................... 16 1.5.2

参 数 文 件.......... 47 3 . 2 启动数据库与实例............... 50 3 . 2 . 1 启动数据库的步骤........ 50 3 . 2 . 2 启 动 模 式 .................51

使用 Oracle Enterprise Manager........................ 17

1 . 5 . 3 使 用 D B C A 创建数据库……-18

3 . 2 . 3 转 换 启动模式.............53 3 . 3 关闭数据库与实例............... 55 3 . 3 . 1 数据库的关闭步骤........ 55 3 . 3 . 2 正常关闭方式

第 2 章 O racle的体系结构........... 19 2.1

(NORMAL) ........ 56

O racle体系结构概述............. 19

3 . 3 . 3 立即关闭方式

2 . 2 逻 辑 存 储 结 构 ................... 20

(IMMEDIATE) ... 56

2 . 2 . 1 数 据 块 ................... 21 2.2.2

盘 区 ..................... 22

2.2.3

段 ....................... 22

3 . 3 . 4 事务关闭方式 (TRANSACTIONAL) •……57 3 . 3 . 5 终止关闭方式

2 . 2 . 4 表 空 间 ................... 23 2 . 3 物 理 存 储 结 构 ................... 25

(ABORT) ..............57 3 . 4 数据库的特殊状态.............. 58

2 . 3 . 1 数 据 文 件 ................. 25

3.4.1

静 默 状 态 ................. 58

2 . 3 . 2 控 制 文 件 ................. 26

3.4.2

挂 起 状 态 ................. 59

2 . 3 . 3 其 他 文 件 ................. 27

3.5

思考与练习......................60

2 . 4 实例的内存结构................. 30 2 . 4 . 1 系统全局区...............30

第 4 章 SQL*Plus命 令 ..............62

2 . 4 . 2 程 序全局区...............33

4.1 SQL*Plus的运行环境.............62

Oracle 11g中文版数据库管理、应用 与开发标准教程 4 . 1 . 1 使 用 S E T 语句选项....... 62

4.2

5.6

Oracle 事务处理............... 110

4 . 1 . 2 设置运行环境示例........ 64

5 . 6 . 1 事务的基本概念......... 110

SQL*Plus 命令................. 67

5.6.2

事务控制............... 111

4.2.1

HELP 命令.............. 67

5 . 7 实验指导..................... 113

4.2.2

DESCRIBE 命令.......... 68

5 . 8 思考与练习.................... 114

4.2.3

PROMPT 命令........... 69

4.2.4

SPOOL 命 令 ............. 69

第6章

PL/SQL编程基础.......... 116

4 . 3 格式化查询结果................ 70

6.1

PL/SQL 概 述 .................. 116

4.3.1

COLUMN 命令........... 70

4.3.2

ΓΠ TLE 和 BTITLE 命令•……73

6 . 2 变量与数据类型............... 118 6.2.1

PL/SQ L 变量的声明...... 118

4 . 4 缓存区........................ 74

6.2.2

%TYPE 变量............ 119

4 . 5 实验指导...................... 76

6 . 2 . 3 复合变量............... 120

4 . 6 思考与练习.................... 77

6 . 3 条件语句..................... 122

第 5 章 S Q L 语句基础.............. 78

6.3.1

IF -T H E N 条件语句..... 122

6.3.2

IF—T H E N -E L SE

条件语句......... 123

5 . 1 用户模式...................... 78

IV

5.1.1

SCOTT 模 式 ............. 78

5.1.2

HR 模式................. 79

6.3.3

条件语句......... 124 6.3.4

5 . 1 . 3 其他模式................ 80 5.2

SELECT 语句的用法............ 81 5 . 2 . 1 检索单表数据............ 81 5 . 2 . 2 过滤数据................ 84 5 . 2 . 3 排序数据................ 87 5 . 2 . 4 多表检索................ 89

5 . 3 函数的使用.................... 94 5 . 3 . 1 字符函数................ 94 5 . 3 . 2 数学函数................ 97 5 . 3 . 3 时间和日期函数.......... 98 5 . 3 . 4 转换函数................ 99 5 . 3 . 5 统计函数............... 101 5 . 3 . 6 分组技术............... 101 5.4

子查询....................... 103 5 . 4 . 1 子查询的概念........... 103 5 . 4 . 2 单行子查询............. 104

6.4

5 . 5 操作数据......................107

CASE 条件语句......... 125

循环语句..................... 126 6.4.1

L O O P -E N D LOOP 循环…126

6.4.2

WHILE 循 环 ............ 127

6.4.3

FOR 循环............... 128

6 . 5 游标的使用...................130 6 . 5 . 1 隐式游标............... 130 6 . 5 . 2 显式游标............... 132 6 . 5 . 3 游 标 F O R 循环.......... 134 6 . 6 异常处理.....................135 6 . 6 . 1 预定义异常............. 135 6 . 6 . 2 非预定义异常........... 138 6 . 6 . 3 用户定义的异常......... 139 6 . 7 实验指导..................... 140 6 . 8 思考与练习................... 143

第 7 章 存 储 过 程 、触发器

5 . 4 . 3 多行子查询............. 105 5 . 4 . 4 关联子查询............. 106

IF∙∙∙THEN∙∙∙ELSIF

和程序包......... 145 7 . 1 存储过程..................... 145 7 . 1 . 1 创建存储过程........... 145

5 . 5 . 1 插入数据............... 107

7.1.2

参 数 ................... 148

5 . 5 . 2 更新数据............... 109

7.1.3

默认值................. 153

5 . 5 . 3 删除数据............... 109

7 . 1 . 4 过程中的事务处理...... 154

目录 7.2

函数......................... 155

9 . 2 . 2 建立位图索引.......... 209

7.3

触发器....................... 156

9 . 2 . 3 建立反向键索引........ 212

7 . 3 . 1 触发器概述............. 157

9 . 2 . 4 基于函数的索引........ 214

7 . 3 . 2 语句级触发器........... 158

9 . 3 修改索引..................... 215

7 . 3 . 3 行级触发器............. 161

9 . 3 . 1 合并索引和重建索引.... 215

instead o f 触发器........ 162

9 . 3 . 2 删除索引.............. 216

7 . 3 . 5 用户事件触发器......... 164

9 . 3 . 3 显示索引信息.......... 217

7.3.4

7.4

程序包....................... 166

9 . 4 . 1 索引组织表与标准表.... 219

7 . 4 . 2 程序包主体............. 167

9 . 4 . 2 修改索引组织表........ 220

7.4.3 7.5

9 . 4 索引组织表................... 218

7 . 4 . 1 程序包规范............. 166

重载................... 169

实验指导..................... 171

7 . 6 思考与练习....................173

第 8 章 管 理 表 ...................... 176 8 . 1 创建表....................... 176 8.1.1

表结构................. 176

9.5

实验指导..................... 221

9.6

思考与练习................... 222

第 10章

1 0 . 1 管理表分区与索引分区........ 224 1 0 . 1 . 1 分区的概念............ 224 1 0 . 1 . 2 建立分区表............ 225

8 . 1 . 2 创建表................. 178 8.1.3

8 . 2 . 1 增加和删除字段......... 184 8 . 2 . 2 更新字段............... 186 8.2.3

1 0 . 1 . 3 修改分区表............ 231

表特性................. 179

8 . 2 修改表....................... 184

1 0 . 1 . 4 分区索引和全局索引••••・ ・ ••236 1 0 . 2 外部表...................... 238 1 0 . 2 . 1 建立外部表............ 238 1 0 . 2 . 2 处理外部表错误........ 239

重命名表............... 186

10.2.3

8 . 2 . 4 改变表的存储表空间

和存储参数....... 187 8 . 2 . 5 删除表定义............. 188 8 . 2 . 6 修改表的状态........... 189

其 他 模 式 对 象 .............. 224

10.3

修改外部表............ 241

临时表...................... 241

1 0 . 4 簇与簇表.................... 242 10.4.1 索引簇................ 242

8 . 3 定义和管理数据完整性约束..... 190

10.4.2

散列簇................ 245

非空约束............... 191

10.4.3

显示簇信息............ 248

8.3.1

8 . 3 . 2 主键约束............... 192 8 . 3 . 3 唯一性约束............. 193

1 0 . 5 管理视图.................... 249 1 0 . 5 . 1 创建视图.............. 249 10.5.2

8 . 3 . 4 外键约束............... 194 8 . 3 . 5 禁止和激活约束......... 197

管理视图.............. 252

1 0 . 6 管理序列.................... 254

8 . 3 . 6 删除约束............... 198

10.6.1

创建序列.............. 254

8 . 4 使用大对象数据类型........... 199

10.6.2

修改序列.............. 256

8.5

实验指导..................... 201

8 . 6 思考与练习................... 202

1 0 . 7 管理同义词.................. 256 10.8

实验指导.................... 258

1 0 . 9 思考与练习.................. 260

第9 章

索 引 与 索 引 组 织 表 ........... 204

9 . 1 索引基础..................... 204 9.2

建立索引..................... 207 9.2.1 建 立 B 树索引.......... 207

第 11章

控制文件与日志文件的 管 理 ....................... 262

1 1 . 1 管理控制文件................ 262

Oracle 1 1g中文版数据库管理、应用与开发标准教程 11.1. 1

控制文件简介.........262

1 2 . 2 . 5 删 除 表 空 间 .............297

11.1.

2

复合控制文件........ 263

12.2.6

11.1.

3

建立控制文件........ 265

11.1.

4

控制文件的备份与恢复∙…268

1 2 . 3 . 1 数 据 文 件 的 管 理 策 略 ” 298

11.1.

5

删除控制文件........ 269

1 2 . 3 . 2 添加表空间数据文件••……299

11.1.

6

查看控制文件信息.... 269

1 2 . 3 . 3 改变数据文件的大小....300

1 1 . 2 管理重做日志文件............. 270

1 2 . 3 . 4 改变数据文件的可用性…•301

1 2 . 3 管理数据文件................. 298

1 1 . 2 .1 重做日志简介.......... 270

1 2 . 3 . 5 改变数据文件的

1 1 . 2 .2 增加重做日志.......... 271 1 1 . 2 .3 删除重做日志.......... 272

名称和位置...... 301 12.4

1 1 . 2 . 4 改变重做日志的

11.3

管 理 U N D O 表 空 间 ............ 303 12.4.1

UNDO 概 述 ............ 303

位置或名称...... 273

12.4.2

UNDO 参 数 ............ 304

1 1 . 2 . 5 显示重做日志信息...... 274

12.4.3

建 立 U N D O 表空间......304

管理归档日志................. 275

12.4.4

修 改 U N D O 表空间......305

1 1 . 3 . 1 日志操作模式.......... 275

12.4.5

切 换 U N D O 表空间......305

1 1 . 3 .2 控 制 归 档 ...............276

1 2 . 4 . 6 设 置 U N D O 记录保留

1 1 . 3 . 3 配置归档文件格式...... 278

VI

查询表空间信息........ 298

的时间.......... 306

1 1 . 3 . 4 配置归档位置.......... 278

12.4.7

删 除 U N D O 表空间......306

1 1 . 3 . 5 显示归档日志信息...... 280

12.4.8

查看 UNDO 表 空间信息............... 307

1 1 . 4 查看日志信息................. 281 11.4.1

LogMiner 概 述 .......... 281

1 2 . 5 实验指导..................... 307

11.4.2

创 建 LogM iner使用的

12.6

思考与练习................... 308

第 13章

用户权限与安全....... 310

字典文件........ 282 1 1 . 4 . 3 指定分析的日志文件.... 283 启动 LogMiner.....................284

1 3 . 1 用户和模式................... 310

1 1 . 4 . 5 查看分析结果.......... 285

1 3 . 2 管理用户......................311

结束 LogMiner.....................285

1 3 . 2 . 1 创 建 用 户 ...............311

11.5

实验指导......................285

1 3 . 2 . 2 修 改 用 户 ...............314

11.6

思考与练习................... 286

1 3 . 2 . 3 删 除 用 户 ...............315

11.4.4

11.4.6

13.3

第12章 12.1

管理表空间和数据文件

资源配置 PROFILE......................... 316

… 288

13.3.1

PROFILE 概 念 .......... 316

建 立 表 空 间 ................... 288

13.3.2

使用 PROFILE

12.1.1

建立普通表空间........ 288

管理密码............... 316

1 2 . 1 . 2 建立大文件表空间...... 290

13.3.3

1 2 . 1 . 3 建立临时表空间........ 291

使用 PROFILE 管理资源............... 319

1 2 . 1 . 4 建立非标准块表空间.... 293

13.3.4

修 改 和 删 除 PROFILE…•…321

1 2 . 2 维 护 表 空 间 ................... 294

13.3.5

显示 PROFILE 信 息 ..... 322

1 2 . 2 . 1 改变表空间可用性...... 294

13.4

管理权限..................... 323

1 2 . 2 . 2 改变表空间读写状态.... 296

1 3 . 4 . 1 权 限 简 介 ...............323

1 2 . 2 . 3 改变表空间名称........ 297

1 3 . 4 . 2 管理系统权限......... 324

1 2 . 2 . 4 设置默认表空间........ 297

1 3 . 4 . 3 管理对象权限...........329

目录 13.5

管理角色.................... 332 1 3 . 5 . 1 角色的概念............ 332

15.2

.3

RMAN 命 令 ........ 366

1 5 . 3 使 用 R M A N 备份数据库....... 367

1 3 . 5 . 2 预定义角色............ 333

15.3.1

1 3 . 5 . 3 管理自定义角色........ 334

1 5 . 3 . 2 使用 R M A N 备份数据

1 3 . 6 实验指导.................... 338

库文件和归档日志.370

1 3 . 7 思考与练习.................. 339

1 5 . 3 . 3 多重备份.............. 373

第 1 4 章 导 出 与 导 入 ................. 341 14.1

EXPDP 和 IMPDP 简介.........341

14.2

EXPDP 导出数据............. 342

14.3

14.2.1

调用 EX PD P........................ 342

14.2.2

EXPDP 命令参数....... 345

14.3.1

IMPDP 参数........... 347

14.3.2

调用 IMPDP......................... 349

15.3.5

镜像复制.............. 374

RM A N 完全恢复.............. 375 15.4.1

RMAN 恢复机制....... 375

15.4.2

恢复处于 NOARCHIVELOG 恢复处于 ARCHIVELOG 模式的数据库.......... 378

15.5

R M A N 不完全恢复............ 379 1 5 . 5 . 1 基于时间的不完全恢复…•379 1 5 . 5 . 2 基于撤销的不完全恢复…•381

SQL *Loader 概述....... 353

1 5 . 5 . 3 基于更改的不完全恢复…•382

1 4 . 4 . 2 加载数据.............. 354 1 4 . 5 实验指导.................... 356

BACKUP 增量备份..... 373

15.4.3

SQL*Loader 导入外部数据..... 353 14.4.1

15.3.4

模式的数据库... 377

IMPDP 导入数据............. 347

1 4 . 3 . 3 移动表空间............ 350 14.4

15.4

RMAN 备份策略....... 367

15.6

维护 RMAN..................................... 383 1 5 . 6 . 1 交叉验证备份

1 4 . 6 思考与练习.................. 357

CROSSCHECK..... 383

第 1 5 章 备 份 与 恢 复 .................358

15.6.

2

添加操作系统备份.... 384

1 5 . 1 备份与恢复概述.............. 358

15.6.

3

查看备份信息........ 384

RMAN 概 述 ................. 359

15.6.

4

定义保留备份的策略…••…386

15.2

15.2.1

RMAN 组件............ 360

15.2.2

RMAN 通道........... 362

1 5 . 7 实验指导.................... 387 15.8

思考与练习.................. 388

VII

第 1 章 Oracle 11g 简介 随着计算机技术、通信技术和网络技术的发展,人类社会已经进入信息化时代。信 息资源已经成为最重要和宝贵的资源之一,确保信息资源的存储及其有效性就变得非常 重要,而保存信息的核心就是数据库技术。对于数据库技术,当前应用最为广泛的是关 系型数据库,而在关系型数据库中,O racle公司推出的O racle数据库是其中的佼佼者。 到目前为止,O racle数据库的最新版本为1 1 g , 也就是本书所基于的数据库。 本章首先介绍一些关系数据库的理论基础知识,并 对 O racle数据库提供的网格技术 进行介绍。作为 学 习 O racle的第一步,首先要做的是在自己的机器上安装O racle数据库 服务器。因此,本 章 还 对 O racle的应用结构、安装时的注意事项和常用的管理工具进行 讲解,这是随后学习的基础。 本章学习要点: > >

关系数据库的逻辑模型 关系数据库的设计规范

> >

正 确 安 装 Oracle 11g数据库 使 用 SQL*Plus连接到数据库

>

理解什么是网格技术

A

通 过 O E M 连接到数据库

>

了 解 O racle的应用结构

q

关系数据库的基本理论

关系数据库有坚实的理论基础,这一理论有助于关系数据库的设计和用户对数据库 信息需求的有效处理。它涉及有关模式的基本知识、关系数据库的标准语言S Q L 以及关 系数据理论,本节将对这些做简要介绍。

f

r- 1 . 1 . 1 数 据 库 系 统 与 关 系 数 据 库 : 数据库系统是指一个计算机存储记录的系统, 它需要特定的软件和一系列硬件支持。

利用数据库系统能够存储大量的数据记录,支持用户进行检索和更新所需的信息。数据 库系统通常在企业应用或科学研究中用于对大量数据进行存储和分析,从而为实际应用 提供帮助信息。 数据库系统的硬件设备主要包括以下两部分。 □ 二级存储设备以及相关的I/O 设 备 、 设备控制器等。最常用的存储设备即为磁盘, 数据库系统利用存储设备为数据记录提供物理存储空间。 □ 处理器以及相应的主存。足 够 快 的 C P U 和足够大的内存用于支持数据库系统软 件的运行。 在 物 理 数 据 库 (即存储物理数据的存储设备)与数据库用户之间有一个中间层,这 就是数据库软件,它通常被称为数据库管理系统DBMS。D B M S建立在操作系统的基础 上 ,对物理数据库进行统一的管理和控制。用户对数据库提出的访问请求都是由DBMS 来处理的。D B M S还提供了许多数据操作的实用程序。

--------------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 D B M S提供的基本功能为数据库用户屏蔽了数据库物 理层的细节,使得数据库管理 员或者用户可以以更高级的方式对物理数据进 行管理和操作。另外,D B M S通常也指某 个特定厂商的特定产品,例如,O racle公 司 的 Oracle 11g是一个非常优秀的DBMS。 实际上,数据库系统经历了由层次模型到网状 模型、再由网状模型到关系模型的发 展过程。当今的数据库大部分是支持关系模型 的关系数据库。 关系数据库模型主要由3 部分组成。 — □ 数 据 结 构 在 关 系 数 据 库 中 ,只有一种数据结构—

关系。简单地说,关系就

是一张二维表,而关系数据库就是许多表的集 合。 □ 关 系 操 作 关 系 操 作 的 特 点 就 是 集 合 操 作 方 式 ,即操作的对象和结果都是集合。 □ 完整性规则 完整性规则用于限制能够对数据和数据对象进 行的关系操作,提 供对数据和数据结构的保护;

φ - 1 . 1 . 2 关系数据库的逻辑模型 在关系数据库的设计阶段,需要为它建立逻辑 模型。关系数据库的逻辑模型可以通 过实体和关系组成的图来表示,这种图称为E -R 图。使 用 E -R 图表示的逻辑模型被称为 E R 模型。一 个典型的E R 模型 由如 下 3 部分组成:实体、联系和属性。 1 . 实体和属性 客观存在并可相互区分的事物称为实体。实体 可以指实际的对象,也可以指某些概 念 ,例如,一个雇员、一个职位都是实体。在 E -R 模型中,实体用矩形表示,矩形框内 写明实体名,以区别于现实世界中的其他对象 。 每个实体由一组属性来表示,其中的某一部分属性可以唯一标识实体,如雇员编号。 实体集是具有相同属性的实体集合,例如,学 校所有教师具有相同的属性,因此教师的 集合可以定义为一个实体集;学生也具有相同 的属性,因此学生的集合可以定义为另一 个实体集。 在数据库中,每个实体集都对应于一个表,实体集中的每个实体是表中的一条记录, 而实体的每个属性就是表中的一个字段。例如 ,企业中的雇员、职位和部门可以分别定 义为一个实体集,这些实体集分别对应表EMP LOYEES、JO B S和 DEPARTMENTS。每 个实体又有它自己的属性,这些属性组成了表 的字段。例如,雇员实体具有雇员编号、 姓名、电话号码、职位、薪水、所属部门等属 性。 2 . 联系 实际应用中的实体之间是存在联系的,这种联系必须在逻辑模型中表示出来。在 E-R 模型中,联系用菱形表示,菱形框内写明联系名 ,并用无向边分别与有关实体连接起来, 同时在无向边旁标注上联系的类型。两个实体 之间的联系可以分为3 类 。 □ 一对一 若对于某个实体集A 中的每一个实体,实 体集B 中至多有一个实体与 之相关;反之亦然,则称实体集A 与实 体 集 B 具有一对一的联系,记 为 1 :1。 若对于实体集A 中的每一个实体,实 体集B 中有多个实体与之相关, 反过来,对 于 实 体 集 B 中的每一个实体,实体集A 中至多有一个实体与之相关,

□ 一对多

则称实体集A 与 实 体 集 B 有一对多的联系,记 为 1 :n 。 □ 多对多 若对于实体集A 中的每一个实体,实 体集B 中有多个实体与之相关, 反过来,对于 实 体 集 B 中的每一个实体,实体集A 中也有多个实体与之相关,



Oracle 11 g 简 介 ---------则称实体集A 与实体集B 具有多对多的联系,记 为 m :n 。 例如,一个雇员只能属于一个部门,而一个部门可以同时对应多个雇员,因此,雇 员与部门之间具有一对多的联系,在 E -R 模型中的表示如图1-1所示。 通过逻辑设计,可 以 将 E -R 图表 示的逻辑模型转换为具体D B M S 处 理的数据模型— — 关系表。从 E ∙R 模 型 向 关 系 表 转 换 时 ,所遵循的规则 如下。 □ 每 个实体都要转换成一个关 系表,它的属性为关系表的 各个列。 □ 一 个 1 :1 的联系可以转换 为一个关系表,或者与任意 一端的关系表合并。若独立 转换为一个关系表,那么两 端关系表的键及联系的属性为该关系表的列;若与一端合并,那么将另一端的 键与联系的属性合并到该端。 □ 一 个 1 :n 联系可以转换为一个关系表,或 与 n 端的关系表合并。若独立转换为 一个关系表,那么两端关系表的键及联系的属性为关系表的列。 □ 对 于 n :m 的联系可以转换为一个关系表,那么两端关系表的键及联系的属性为 关系表的列,而关系表的键为两端实体的键的组合。 例如,在 上 面 的 E -R 模型中,可以将部门号合并到职工信息表中作为一个列。

fr- 1 . 1 . 3 关 系 数 据 库 的 设 计 规 范 1 在关系数据库中,为了保证构造的表(关系)既能准确地反应现实世界,又有利于 应用和具体操作,还需要对构造的表进行规范化,常用的规范化方法就是对关系应用不 同的设计范式。在关系数据库中构造数据库时必须遵循一定的规则,这种规则就是范式。 关系数据库中的关系表必须满足一定的要求,即满足不同的范式。 目前关系数据库 有 6 种范式:第 一 范 式 (1NF)、第 二 范 式 (2N F)、第 三 范 式 (3N F)、第 四 范 式 (4N F )、 第 五 范 式 ( 5 N F ) 和 第 六 范 式 (6 N F ) 0 满足最低要求的范式是第一范式( lN F ) o 在第一 范式的基础上进一步满足更多要求的称为第二范式( 2 N F ) , 其余范式依次类推。一般说 来 ,数据库只需满足第三范式( 3 N F ) 就足够了。下 面 举 例介绍第一范式(1NF)、第二 范 式 ( 2 N F ) 和 第 三 范 式 (3NF)0 1 . 第 一 范 式 (1N F ) 在任何一个关系数据库中,第 一 范 式 ( 1 N F ) 是对关系模式的基本要求,不满足第 一 范 式 ( 1 N F ) 的数据库就不是关系数据库。 所 谓 第 一 范 式 ( 1 N F ) 是指数据库表中的每一列都是不可分割的基本数据项,同一 列中不能有多个值;即实体的某个属性不能具有多个值或者不能有重复的属性。如果出 现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与

Oracle 11g 中文版数据库 管理、应用与 开发标准教程 原实体之间为 一对多关系。 在 第 一 范 式 ( 1 N F ) 中,表的每一 行只包含一 个实例的信 息。例如 ,对于职工信 息 表 ,不能将职工信 息都放在一列 中显示,也不能将其中 的两列或多列存入在一列中 显示; 职工信息表中 每一行只表示 一个职工的信 息,一个职工 的信息在表中 只出现一次。 经 过 第 一 范 式 ( 1 N F ) 后 ,数据库表中 的字段都是 单一的、不可 再分的。这个单一 属性由基本数 据类型构成:包括整型、实 型、字符型、逻辑型、日 期型等。例如 ,表 1-1 所示的学生信 息表是符合第 一范式的。 圣



1-1

一 学 生 信 息 表 (1)

学号

姓名

电话号码

年龄

课程名称

成绩

学分

1001

刘丽

0371-6862651

20

物理

80

2

而 表 1-2所示的学生信 息表是不符合 第一范式的。 果



编号

1-2 τ 学 生 信 息 表 (2) 姓名

联系方式 电话号码

年龄

课程名称

成绩

学分

电子邮件

很显然,第 一范式是任 何关系数据 库管理系统 ( D B M S ) 必须满足的 基本条件,任 何关系表中各 个列的数据类 型都是基本的 数据类型,不 允许再进行分 割。

2 . 第 二 范 式 (2NF) 第 二 范 式 (2NF) 是在第一范 式 (1NF) 的基础上建立 起来的,即满足第二 范式 (2NF) 必 须先 满 足 第 一 范 式 (lNF) 0 第 二 范 式 ( 2 N F ) 要求数据库 表中的每个实 体,或者各个 行必须可以被 唯一地区分。为实现区分各 行通常需要为 表加上一个列 ,以存储各个实体 的唯一标识。职工信息表中 加上了员工编 号列,因为每 个员工的员工 编号是唯一的 ,因 此每个员工可 以被唯一区分 。这个唯一属 性列被称为主 关键字或主键 、主码。 第 二 范 式 ( 2 N F ) 要求实体的属 性完全依赖 于主关键字 。所谓完全依 赖是指不能存 在仅依赖主关 键字一部分的 属性,如果存 在,那么这个 属性和主关键 字的这一部分 应该 分离出来形成 一个新的实体 ,新实体与原 实体之间是一 对多的关系。为实现区分通 常需 要为表加上一 个列,以存储 各个实例的唯 一标识。简而 言之,第二范 式就是非主属 性非 部分依赖于主 关键字。 假定上述学生 信息表为表示 学生选课信息 ,以 (学 号 ,课 程 名 称 )为 组 合 关 键 字 , 因为存在如下 决定关系。 (学号,课程名称) f

(姓 名,联系电话,年 龄,成 绩 ,学分)



. ‘3

因为存在如下 决定关系,这 个关系表不满 足第二范式。 (课 程 名 称 )一 (学分) ( 学 号 ) — (姓名 ,年龄)

即存在组合关 键字中的部分 字段决定非关 键字的情况。 由于不符合 2 N F , 这个学生 选课关系表 会存在如下问 题。 □ 数据冗余

由于同一门 课程可以由 n 个学生选修 ,则 “学分”就 重 复 n 次; 同 样 ,一个学生选修了 m 门课程,则 “ 姓名”和 “ 年龄”等列 也就会重复 m 次。 □ 更 新 异 常 若 调 整 了 某 门 课 程 的 学 分 ,关 系 表 中 所 有 行 的 “学分”值都要 更新,

Oracle 11g 简介



否 则 会 出 现 同一 门 课 程 学 分 不 同 的 情 况 。 □ 插入异常

假 设 要 开 设 一 门 新 的 课 程 ,暂 时 还 没 有 人 选 修 。这 样 , 由于还没有

“学号” 关 键 字 ,“ 课 程 名 称 ”和 “学分”将 无 法 录 入 数 据 库 。 □ 删 除 异 常 假 设 一 批 学 生 已 经 完 成 课 程 的 选 修 ,这 些 选 修 记 录 就 应 该 从 关 系 表 中删除。与 此 同 时 ,“ 课 程 名 称 ”和 “学分”信 息 也 将 会 被 删 除 了 。 为 克 服 上 述 问 题 ,可 以 把 上 述 关 系 表 改 为 如 下 3 个 表 。 学 生 : STUDENT ( 学 号 ,姓 名 ,年 龄 ,电 话 号 码 ) 课 程 :COURSE ( 课程名称,学分) 选 课 关 系 : SELECTCOURSE ( 学号,课程名称,成绩)

进 行 上 述 分 解 后 ,关 系 表 就 符 合 了 第 二 范 式 ,消 除 了 数 据 冗 余 、更 新 异 常 、插入异 常 和 删 除 异 常 。另 外 ,所 有 单 关 键 字 的 关 系 表 都 符 合 第 二 范 式 , 因为不可能存在组合关 键字。

3 . 第三范式( 3N F ) 满足第三范式( 3NF)必 须 先 满 足 第 二 范 式 ( 2NF) , 第 三 范式要求关系表不存在非 关 键字 列 对 任 一 候 选 关 键 字 列 的 传 递 函 数 依 赖 。简 而 言 之 ,第三范式要求一个关系表 中 不包含已在其他表中已包含的非主关键字信息。 所 谓 传 递 函 数 依 赖 ,就 是 指 如 果 存 在 关 键 字 段 x 决 定 非 关 键 字 段 y , 而 非 关 键 字 段 y 决 定 非 关 键 字 段 z , 则 称 非 关 键 字 段 z 传 递 函 数 依 赖 于 关 键 字 段 X。 例 如 ,假 定 学 生 关 系 表 STUDENT (学 号 ,姓 名 ,年 龄 ,所 在 学 院 ,学 院 地 点 ,学 院 电 话 ),该 关 系 表 的 关 键 字 为 单 一 关 键 字 “学 号 ”,因 此 存 在 如 下 决 定 关 系 : (学 号 )一 (姓 名 ,年 龄 ,所 在 学 院 ,学 院 地 点 ,学 院 电 话 )

这 个 关 系 表 是 符 合 2 N F 的 ,但 是 它 不 符 合 3 N F , 因为存在如下决定关系: (学 号 )一 (所 在 学 院 )一 (学 院 地 点 ,学 院 电 话 )

即 存 在 非 关 键 字 列 “学 院 地 点 ”、“学 院 电 话 ”对 关 键 字 段 “学 号 ”的 传 递 函 数 依 赖 。 该 关 系 表 也 会 存 在 数 据 冗 余 、更 新 异 常 、插 入 异 常 和 删 除 异 常 的 情 况 。因 此 ,可以把学 生关系表分解为如下两个表。 学 生 : STUDENT ( 学 号 ,姓 名 ,年 龄 ,所 在 学 院 ) 学 院 : DEPARTMENT^学 院 ,地 点 ,电 话 )

这 样 关 系 表 就 符 合 了 第 三 范 式 ,消 除 了 数 据 冗 余 、更 新 异 常 、插 入 异 常 和 删 除 异 常 。

4

. B C N F 范式

当 第 三 范 式 消 除 了 主 关 键 字 列 对 候 选 关 键 字 列 的 部 分 和 传 递 函 数 依 赖 , 则称为

BCNF 。举 一 个 示 例 来 说 明 ,假 设 仓 库 管 理 关 系 表 (仓 库 编 号 ,存 储 物 品 编 号 ,管理员 编 号 ,数 量 ),并 且 规 定 一 个 管 理 员 只 在 一 个 仓 库 工 作 ,一 个 仓 库 可 以 存 储 多 种 物 品 。则 这个关系表中存在如下决定关系。 (仓 库 编 号 ,存 储 物 品 编 号 )一 (管 理 员 编 号 ,数 量 ) (管 理 员 编 号 ,存 储 物 品 编 号 )一 (仓 库 编 号 ,数 量 )

所 以 ,(仓 库 编 号 ,存 储 物 品 编 号 )和 (管 理 员 编 号 ,存 储 物 品 编 号 )都是仓库管理 关 系 表 的 候 选 关 键 字 列 ,表 中 的 唯 一 非 关 键 字 列 为 “数 量 ”,它 是 符 合 第 三 范 式 的 。但是,

5

Oracle 11g 中 文 版数据库管理、 应用与开发标准 教程 由于存 在 如下 决 定关 系 。 (仓库编号)一 (管理员编号) (管理员编号)一 (仓库编号)

即 存 在 关 键 字 段 决 定关 键 字 段的 情 况 ,所 以 它 不 符 合 B C N F 范 式 。它会出现如下 异 常情况: □ 删除异常

当清空仓库删除“ 存 储 物 品 编 号 ”和 “ 数 量 ”信 息 时 ,“ 仓库编号” 和 “管 理 员 编号 ”信 息 也 将 被 同 时 删 除 。

□ 插 入 异 常 当 仓 库 没 有 存 储 任 何 物 品 时 ,无法给仓库分 配管理员. □ 更 新 异 常 如 果 仓 库 换 了 管 理 员 ,则 表 中所 有 行 的 管 理 员 编 号 都 要 修 改 。 同 样 ,可 以 将 仓 库 管 理 关 系 表 分 解 为 两 个 关 系 表 。 仓 库管理表( 仓 库 ID,管 理 员 ID) 仓 库信息表( 仓库工D,存 储 物 品 ID,数量)

这样创建的关系 表就符合了 B C N F 范 式 ,消 除 了 删 除 异 常 、插 入 异 常 和 更 新 异 常 。

Oracle数据库与网格技术 6

O racle 数 据 库 是 O racle 公 司 出 品 的 十 分 优 秀 的 D B M S , 当 前 Oracle D B M S 以及相关 的产 品 几乎 在 全 世界 各 个 工 业 领 域 中 都 有 应 用 。无 论 是 大 型 企 业 中 的 数 据 仓 库 应 用 ,还 是 中 小 型 的 联 机 事 务 处 理 业 务 ,都 可 以 找 到 成 功 使 用 O racle 数 据 库 系 统 的 典 范 。到目前 为 止 , 1 1 g 是 O racle 数 据 库 的 最 新 版 本 ,它 在 1 0 g 的基础上对企业 级网格计算进行 了扩 展 ,提 供 了 众 多 特 性 支 持 企 业 网 格 计 算 。

. - ' 1 2 1 网格技术 超 级 计 算 机 作 为 复 杂 科 学 计 算 领 域 的 主 宰 , 以 其 强大 的 处理 能 力 著称 。但以超级计 算 机 为 中 心 的 计 算 模 式 明 显 存 在 不 足 , 由 于 它 造价 极 高 ,通 常 只 有 一 些 国 家 级 的 部 门 , 如 航 天 、气 象 等 部 门 才 有 能 力 配 置 。而 随 着 日 常 工 作 遇 到 的 商 业 计 算 越 来 越 复 杂 ,人们 越 来 越 需 要 数 据 处 理 能 力 更 强 大 的 计 算 机 。于 是 ,人们开始寻找 一种造 价 低廉 而 数据 处 理 能 力 超 强 的 计 算 模 式 ,最终找到了答 案— —

网格计算( GRID COMPUTING) 。 网 格 计 算 是 伴 随 着 互 联 网 而迅 速 发展 起 来 的,专门针对复 杂科学计 算的 新 型 计算 模

式 。这 种 计 算 模 式 利 用 互 联 网 把 分 散 在 不 同 地 理 位 置 的 电 脑 组 织 成 一 个 “虚拟的超级计 算 机 ”,其 中 每 一 台 参 与 计 算 的 计 算 机 就 是 一 个 “节 点 ”,而 整 个 计 算 由 成 千 上 万 个 “节 点 ”组 成 “虚 拟 的 一 张 网 格 ”,所 以 这 种 计 算 方 式 叫 网 格 计 算 。简 单 而 言 ,网格计算就是 把 整 个 因 特 网 整 合 成 一 台 巨 大 的 超 级 计 算 机 ,实 现 各 种 资 源 的 全 面 共 享 。当 然 ,网格并 不 一 定 要 整 合 整 个 因 特 网 ,也 可 以 构 造 地 区 性 的 网 格 。网 格 的 根 本 特 征 不 是 它 的 规 模 , 而是资源共享。 实 际 上 , 网 格 计 算 是 分布 式计 算的 一 种,如 果 某 项 任 务 是 分 布 式 的 ,那么参与这项 任 务 的 一 定 不 只 是 一 台 计 算 机 ,而 是 一 个 计 算 机 网 络 ,显 然 这种计算方式将 具有很强的 数 据 处 理 能 力 。这 种 组 织 方 式 有 两 个 优 势 :一 个 是 超 强 的 数 据 处 理 能 力 ;另一个是能充 分 利 用 网 上 的 闲 置 处 理 能 力 。网 格 计 算 模 式 首 先 把 要 计 算 的 数 据 分 割 成 若 干 “小 片 ”,然

第 Oracle 11g 简介



后由不同节点的计算机 根据自己的处理能力下 载一个或多个数据片断 。当节点的计算机 空闲时,就会处理下载 的任务片断,这样一台 计算机的闲置计算能力 就被充分地调动起 来了。 网格计算和标准的网络 计算看起来全然不同。现在很多服务都是基于 客户机/服务器 模式进行的。在这种模 式中,通过确认客户、检查其授权级别,决定 客户可以在服务器 上所做的操作来确保安 全。而对于网格计算,客户机和服务器的功能 划分远没有如此明 确 。在网格计算模式中,一台计算机可以要求另 一台计算机去完成一项 任务的同时,还 可能为其他计算机进行 着一项任务,而用户不 用考虑这些互动是通过 怎样的途径来实 现的。 关于网格计算的另一个 重要概念是它强大的数 据处理功能,它被设计 成来完成兆兆 字节规模或更大规模的 计算。

Oracle 1 0 g ∕llg 中 的 g 代表网格计算,O racle数据库作为第一个 为企业级网格计算而 设计的数据库,为管理信息和应用提供 了最灵活的、成本最低的方式。例如,通 过 Oracle 网格计算,可以在几个互连的数据 库服务器网格上运行不 同的应用。当应用需求增加时, 数据库管理员能够自动 为应用提供更多的服务 器支持。网格计算使用 最高端的负载管理 机制,使得应用能够共 享多个服务器上的资源 ,从而提高数据处理能 力,减少对硬件资 源的需求,节省企业成 本。 O racle数据库为支持企业 网格计算提供了以下特 性。 □ 使用低成本的硬件集群 技术提供高性能的、大 规模的处理能力。 □

O ra c le 具有高级集成特性,通 过分布式计算使得应用 和数据能够位于网络的 任 何地方。

□ Oracle提供了许多自动 化功能,使得一个管理 员能够管理大量的服务 器。 □ Oracle提供了较高的安 全性能,使得用户能够 在信任的机制上共享网 格资源。 集群和网格之间存在一 定的差异,集群是用于 创建网格框架的一种技 术,简单集群 对于特定的应用提供静 态资源。而网格可以包 含多个集群,为不同应 用和用户提供动态 资源池。在网格服务器 中,能够调度和移植应 用,网格能够在不同的 系统所有者之间共 享资源。对于最高层的 应用,网格计算被当作 为一种计算工具。简单 地说,用户不须关 心数据的存储位置以及 由哪个计算机处理用户 请求。 从服务器端来看,网格 关注资源分配、信息共 享和高可用性。资源分 配使得请求的 资源能够得到保证,防 止请求未得到服务而相 关资源被闲置。信息共 享保证用户和应用 所需的信息能够可用。高可用性保证所有的数 据和计算能够提供更高 的服务质量。 网格计算保证计算资源 能够动态分配应用程序 ,资源的分配是按照业 务优先级和需 求进行分配的,Oracle 提供了许多特性支持计 算资源分配。 □ 真正应用集群( RAC) R A C 是 Oracle 9 i 数据库中采用的一项新 技术,也 是 O racle数据库支持网格计 算环 境的核心技术。它的出 现解决了传统数据库应 用中面临的一个重要问 题:高性能、高可 伸缩性与低价格之间的 矛盾。R A C 技 术 通 过 C P U 共享和存储设备共享实 现多节点之间 的无缝集群,用户提交 的每一项任务被自动分 配给集群中的多台机器 执行,用户不必通

7

Oracle 11g中文版数 据库管理、应 用与开发标准 教程 过冗余的硬件 来满足高可靠 性要求。另一 方面,R A C 可 以 实 现 C P U 的共享,即使普通 服务器组成的 集群也能实现 过去只有大型 主机才能提供 的高性能。 Oracle 11g数据库使得 管理集群数据 库更加容易。Oracle 11g数据库支持 所有平台均 可使用集成的 集群组件,它 们的功能包括 集群连接、消 息和锁定、集 群控制和恢复 及工 作负载管理框 架。集成的集 群组件消除了 购买、安装、配置和支持第 三方集群组件 的需 求 ,从 而 使 得 Oracle R A C 变得容易。自 动负载管理简 化了动态服务 器对负载的响 应,可 以定义规则使 之在正常工作 时和应对故障 时自动为每个 服务分配处理 资源,这些规 则可 以动态修改以 满足不断变化 的业务需求。除了集群管理 的改进以外,O racle数据库中的 R A C 还提供了在集 群配置发生改 变时向中间层 发送自动通知 事件的功能,于是中间层能 够立即进行例 程故障切换或 使用新例程。这使终端用户 能够在发生例 程失败时继续 工作, 而不会发生由 于网络超时而 引起的延迟。如果有新例程 可用,中间层 能够立即启动 到该 例程的负载平 衡连接。 □ 自动存储管理( ASM ) 对于数据库而 言,一个非常 重要的资源就 是存储器。对 于大型数据库 而言,要尽量 获得最大吞吐 量,在磁盘存 储器之间存放 数据的过程可 能是一个费时 的过程。O racle数 据库的自动存 储管理A SM 解决了这些问 题,A S M 为 Oracle数据库 提供全面的存储管理,

8

不需要文件系 统和大容量磁 盘管理。A S M 自动向所有磁 盘散布数据,以最小的管理成本 提供 最高 的 I/O 吞吐率。 O racle资源管理器 虽 然 O racle数据库在 很大程度上是 自动管理数据 库,但 是 使 用 O racle资源管理 器,



资源管理员能 够控制如何为 用户分配O racle资源。

Oracle 应用结构 在安装、部 署 Oracle 11g数据库时,需要根据硬件 平台和操作系 统的不同采取 不同 的结构,下面 介绍几种常用 的应用结构。

■ - - 1 . 3 . 1 多 数 据 库 的 独 立 宿 主 结 构 ;、 这种应用结构 在物理上只有 一台服务器,服务器上有一 个或多个硬盘 。但是在功能 上是多个逻辑 数据库服务器 和多个数据库 ,如 图 1-2所示。

O

图 1-2

一多数据库的独立 宿主结构

这种应用结构 由多个数据库 服务器、多个 数据库文件组 成,也就是在 一台计算机上

第 1

Oracle 11g 简 介 -----------装 2 个 版 本 的 O racle数 据 库 (如 Oracle 10g、Oracle l l g )□ 尽管它们在同一 台计算机上, 但无论是内存结构、服务器 进程、数据库文件等都不是 共享的,它们各自都有自己 的内 存结构、服务器进程和数据 库文件。 对于这种情况,数据库的文 件要尽可能地存储在不同硬 盘的不同路径下,由于每个 逻辑服务器都要求分配全局 系统区内存和服务器后台进 程,因此对硬件要求较高。

在客户/服务器结构中,数据 库服务器的管理和应用分布 在两台计算机上,客户机上 安装应用程序和连接工具,通 过 O racle专用的网络协议SQL *N et建立和服务器的连接, 发出数据请求。服务器上运 行数据库,通过网络协议接 收连接请求,将执行结果回 送给 客户机。客户/服务器结构 如图1-3所示。 同一个网络中可以有多台物 理数据库服务器和多台物理 客户机。在一台物理数据库 服务器上可以安装多种数据 库 服务器,或者一种数据库服 务 器的 多个数据库例程。Oracle 支持多主目录,允许在一台 物 理数据库服务器上同时安装

9

Oracle 10g 和 Oracle 1 1 g ,它们 可以独立存在于两个不同的 主 目录中。

O

图 1-3

:客户/服务器结构

客户/服务器结构的主要优点 如下。 □ 客户机、服务器可以选用不 同的硬件平台,服 务 器 (一 个 或 几 个 )配置要高, 客 户 机 (可能是几个、几十个、上 百 个 )配置可低些,从而可以降 低成本。 □ 客户机、服务器可以选用不 同的操作系统,因此可伸缩 性好。 □ 应用程序和服务器程序分别 在不同的计算机上运行,从 而减轻了服务器的负担。 □ 具有较好的安全性。 □ 可以进行远程管理,•只要有通信网络(包括局域网、W W W 网 ) , 就可以对数据 库进行管理,这 也 是 Oracle数据库的管理器O E M 所要实现的功能。

-/、 ___1 __.3_._3___分 ___布 __式 __结 __ 构 一一 分布式结构是客户机/服务器 结构的一种特殊类型。在这 种结构中,分布式数据库系 ’ 统在逻辑上是一个整体,但 在物理上分布在不同的计算 机网络里,通过连接网络连 接在 一起。网络中的每个节点可 以独立处理本地数据库服务 器中的数据,执行局部应用 ,同 \ 是也可处理多个异地数据库 服务器中的数据,执行全局 应用。 ' 各数据库相对独立,总体上 又是完整的,数据库之间通 过SQL*Net协议连接。因此 异种网络之间也可以互连,操作系统和硬件平台可伸缩 性好,可以执行对数据的分 布式| 查询和处理,网络可扩展性 好,可以实现局部自治与全 局应用的统一。分布式结构如图 1-4所示。

Oracle 11g中文版数 据库管理、应 用与开发标准 教程

-O-----图 ---1--4 -- -一分布式数据库系 统结构

其中,局部数 据库管理系统 负责创建和管 理局部数据,执行局部应用 和全局应用的 子查询;而全 局数据库管理 系统则负责协 调各个局部数 据库管理系统 ,共同完成全 局事 务的执行,并 保证全局数据 库执行的正确 性和全局数据 的完整性;通 信管理则负责 实现 分布在网络中 各个数据库之 间的通信;局 部数据库存放 了全局数据的 部分信息;全局数 据字典则存放 了全局数据库 在各服务器上 的存放情况。 分布式数据库 管理系统的数 据在物理上分 布存储,即数 据存放在计算 机网络上不同 的局部数据库 中;而在逻辑 上数据之间有 语义上的联系 ,属于一个系 统。访问数据 的用 户既可以是本 地用户,也可 以是通过网络 连接的远地用 户。

Oracle 11g for Windows 的安装与配置 数据库管理系 统的安装与升 级是一项比较 复杂的任务。为 了 使 Oracle 11g数据库系 统可以安装在 多种平台上,O racle提 供 的 O racle通用安 装工具( Oracle Universal Installer, OUI)是 基 于 Jav a技术的图形 界面安装工具 ,利用它可以完 成在不同操作 系统平台上的 、 不同类型的、不同版本的 O racle数据库 软件的安装。无 论 是 Windows NT/XP/2003 、Sun Solaris, HP UNIX、Digital UNIX, V M S还 是 O S/390都可以 通过使用O U I以标准化的 方式来完成安 装任务。本节主要介绍 如何在W indows平台上 安装和配置 O racle数据库服 务器。 Oracle 11g数据库服 务器由Orac le数 据 库 和 O racle例程组 成。安装数据 库服务器就 是将管理工具 、网络服务、实用工具、基 本的客户机软 件等部分,或 者相应的文件 从安 装盘复制到计 算机硬盘的文 件夹结构中,并创建数据库 、配置网络、启动服务等。 Oracle 1 1 g 数据库服务器 有两种安装方 式:高级安装 和基本安装。 由于基本安装比 较简单,配置 参数较少,只 需要按照Oracle 11g的安装步 骤要求一步一 步往下安装就 可 以了,而高级 安装较为复杂 。下面以高级 安装为例进行 介绍,其安装 步骤如下。 (1)运行安装文件 夹中的 Setup.exe,将启动 Universal In staller,出现 Oracle Universal Installer自动运行窗口,即快速检查计 算机的软件、硬件安装环境 ,如果不满足最小需求, 则返回一个错 误并异常终止 ,如 图 1-5所示。 ( 2 )当 O U I检查完软、硬件环境之后 ,出 现 【选择要安装的 产品】窗口,如 图 1-6 所示。 如果想快速 安装Oracle 11g数据库,可 以 选 择 【基本安装】单 选按钮,再输入数据 库登录密码,然 后 单 击 【下一步】按钮 开始基本安装 。由于这种方 法比较简单,只需要 输入少量信息 ,读者可自己 按照步骤要求 去学习安装。

Oracle 11g 简介

图 1-5

, Oracle Universal Installer

O

图 1-6

第 1 章

1选择要安装的产品

自动运行窗口

( 3 )选 择 【高级安装】单选按钮,再 单 击 【下一步】按钮,出 现 【选择安装类型】 窗口,如 图 1-7所示。 在该窗口中可以选择如下安装类型。 □ 企业版 该类型适用于面向企业级应用,用于对安全性要求较高并且任务至上 的联 机 事 务 处 理 (OLTP)和数据仓库环境。在标准版的基础上安装所有许可的 企业版选项。 □ 标准版 该类型适用于工作组或部门级别的应用,也适用于中小企业。提供核 心的关系数据库管理服务和选项。 □ 个人版 个人版数据库只提供基本的数据库管理服务,它适用于单用户开发环 境 ,对系统配置的要求也比较低,主要面向技术开发人员。 □ 定制允许用户 从 可 安 装 的 组 件 列 表 中 选 择 安 装 单 独 的 组 件 。还可以在现有的 安装中安装附加的产品选项,如要安装某些特殊的产品或选项就必须选择此选 项。定制安装要求用户是一个经验丰富的Oracle DBA。 ( 4 )选 择 【企业版】单 选 按 钮 后 单 击 【下一步】按钮,开始安装企业版O racle数据 库 ,出 现 【指定主目录详细信息】窗口,如 图 1-8所示。



图 1-7

一 选择安装类型

c

图 ι-8

.指定主目录详细信息

在该窗口中可以指定存储所有与O racle软件以及与配置相关的文件的O ra c le基目 录 。O racle基目录是用于安装各种O racle软件产品的顶级目录,如果在操作系统中已设

11

Oracle 1 1g中文版数据库管 理、应用与开发标准 教程 置了 ORACLE_BASE 环境变量,则 Oracle Universal Installer 将 ORACLE_BASE 变量的 默认值显示为6 ra c le 基目录字段的默认 值。用 户 也 可 以 单 击 【浏 览 】按钮指定存储所有 O racle软件和配置相 关文件的目录。 ( 5 ) 设置好安装位置后 ,单 击 【下一步】按钮,O U I将检查安装环境是 否符合最低 的要求,以便及早发 现系统设置方面的问 题,可减少用户在安装 期间遇到问题的可 能性。 例如,磁盘空间不 足、缺少补丁程序、硬件不合适等问题 ,如 图 1-9所示。 ( 6 ) 当检查安装环境总体 为通过时,单 击 【下一步】按钮,打 开 【选择配置选项】 窗口。在该窗口中可以选 择创建数据库,配置自动存储管理 实例,或 只 安 装 O racle软件, 如 图 1-10所示。

12 C

图 1-9

一 产品特定的先决条件检 查

£ 7 图 1-10 一 选择配置选项

(7 ) 采用默认设置(即在 安装数据库服务器 软件时创建数据库 ),单 击 【下一步】按 钮 ,打 开 如 图 1-11所 示 的 【选择数据库配置】窗口。 在该窗口中,用户可 以根据自己的需求 选择以下数据库配 置之一。 □ 一般用途/事务处理 选择此配置类型可 以创建适合各种用 途的预配置数据库 。 □ 数 据 仓库选择此配置类 型可以创建适用于 针对特定主题的复 杂查询环境。数 据仓库通常用于存 储历史记录数据。 □ 高级

选择此配置类型可 以在安装结束后运 行O ra c le 数 据 库 配 置 助 手 (Oracle

Database Configuration Assistant, ODCA ) , 进行手工配置数据 库。如果选择此选 项 ,Oracle Universal Installer在运行该助 手之前不会提示输 入数据库信息。该助 手启动后,便可以指定如何配 置新的数据库。O racle建议只有经验 丰富的Oracle D B A 才应使用此配置类 型。 (8 ) 选 择 创 建 【一般用途/事务处理 】类型的数据库,单 击 【下一步】按钮,出 现 【指 定数据库配置选项 】窗口,如 图 1-12所示。 全局数据库名采用 如下形式:database_name.database_dom ain» 例如:sales.atg.com , 其 中 sa le s为数据库名,atg. com 为数据库域。指定全 局数据库名时,尽量 为数据库选择 能够反映其用途的 名称,例 如 sales。数据库域用于 将数据库与分布式环 境中的其他数据 库区分开来。例如 在上海的数据库可 以命名为sales.shan ghai.com ,北京的数据库可以 命 名 为 sales.beijing.com。即 使数据库名都相同,但数据库域不同,所 以也能区分开。 S ID 定义了 O racle数据库实例的 名称,因 此 S ID 主要用于区分同一台 计算机上不同 的实例。O racle数据库实例由 一组用于管理数据 库的进程和内存结 构组成,对于单实例

Oracle 11g 简介

第 1 章

数据库,其 S ID 通常与数据库名相同。

r y 图 ι-ιι .选择数据库配置

Q

图 1-I2 ,指定数据库配置选项

( 9 )采用默认设置,单 击 【下一步】按钮,出 现 如 图 1-13所 示 的 【指定数据库配置 详细资料】窗口。可以在该窗口 中对数据库的内存、字符集、安 全性、示例方案配置进行设置。

13

在 【内存】选项卡中,可以 设置要分配给数据库的物理内 存 ( RAM )。可以通过滑块和微 调按钮调整可用物理内存的最 大 值 和 最 小 值 限 制 。如果选中 【启用自动内存管理】复 选 框 , 则系统 会 在 共 享 全 局 区 (SGA) 与程序全局区( PGA)之间将采 用动态分配。 在 【字符集】选项卡中,可 以设置在数据库中要使用哪些 O

图 "13 "指定数据库配置详细资料

语言组,采用默认设置即可。 在 【安全性】选项卡中,可以选择是否 要在数据库中禁用默认安全设置,Oracle 11g 增强了数据库的安全设置。 在 【示例方案】选项卡中,可以设置是 否要在数据库中包含示例方案。O racle提供 了与产品和文档示例一起使用的示 例方案。如果选择安装示例方案,则会在数据库中创 建 EXAM-PLES表空间。当选择添加 示例方案后,将在数据库中添加如 下示例。 □ 人力资源 人 力 资 源 (H R )方案是基本的关系数据库方案。在 H R 方 案 中 有 6 张表:雇员、部门、地 点 、国家/地区、工作和工作历史。 □ 定单输入

定 单 输 入 (O E )方案建立在完全的关系型人力 资源(H R )方案上, 该方案具有某些对象关系和面向 对象的特性。O E 方 案 包 含 7 张表:客 户 、产品 说 明 、产品信息、定单项目、定单、库 存和仓库。0 E 方案具有到H R 方 案 和 PM 方案的链接。

□ 产 品 媒 体 产 品 媒 体 (P M ) 方案包含2 张 表 ONLINE_MEDIA和 PRINT_MEDIA、

Oracle 1 1g中文版数据 库管理、应用 与开发标准教 程 1 种 对 象 类 型 ADHEADER T Y P 以 及 1 张嵌 套 表 TEXTDOC_T YP。P M 方案包 含 INTERMedia 和 L O B 列类型。 □ 销售历史

销 售 历 史 (S H )方案是关系 星型方案的示 例。它 包 含 1 张大范围分 区的事实表 SALES 和 5 张 维 表 :TIMES. PROMOTION S. CHANNELS ,

PRODUCTS 和 CUSTOMER S.链接至!∣CUSTOMERS 的附力口 COUNTRIES 表显 示一个简单雪 花。 □ 发运队列

发 运 队 列 (Q S )方案实际上 是包含消息队 列的多个方案 。 (10)单 击 【下一步】按钮 ,出 现 【选择数据库管 理选项】窗口 ,在该窗口中 可以选 择要用于管理 数据库的Oracle Enterprise M anager界面,如 图 1-14所示。 在选择数据库 管理选项时, 由 于 O racle数 据 库 从 10g开始已经 支持网格运算 ,因此 除了使用 Oracle Enterprise Manager Database Control管理数 据库外,用户 还可以选择使 用 Oracle Enterprise Manager Grid Controlo 无论是使用 Grid Control 还是使用 Database C o n tro l,用户都可以 执行相同的数 据库管理任务 ,但 使 用 Database Control只能管 理一个 数据库。 (11)选 择 默 认 设 置 即 使 用 Database C o n so le管理数据库 ,就可以在本 地进行数据 库管理了,单 击 【下一 步 】按 钮 ,打 开 【指定数据库文 件存储选项】窗口,如 图 1-15 所示。

14

图 1 -1 4 ,选择数据库管理 选项

Γ 7 图 1-15 一 指定数据库文件 存储选项

在该窗口中可 以选择用于存 储数据库文件 的方法,Oracle 1 1 g 提供了如下两 种存储 方法。 □ 文件系统 选择该选项后 ,Oracle将使 用操作系统的 文件系统存储 数据库文件。 □ 自动存储管理 如果要将数据 库文件存储在 自动存储管理 磁盘组中,则 选择此 选项。通过指定一个 或多个由单独 的O ra c le 自动存储管理实例管理的磁盘设备, 可以创建自动 存储管理磁盘 组, 自动存储管理 可以最大化提 高U O 性能。 (12)选 择 【文件系统】单 选按钮,存储 位置采用默认 设置,单 击 【下一步】按钮 , 出 现 【指定备份和恢 复选项】窗口 ,在该窗口中 可以指定是否 要为数据库启 用自动备份 功能,如 图 1-16所示。 如果选择启用 自动备份功能 ,O racle会在每天 的同一时间对 数据库进行备 份。默认 情况下,备份 作业安排在凌 晨2:00运行。要配置自动备 份,必须在磁 盘上为备份文 件指 定 一 个 名 为 “快速恢复区”的存储区域,可以将文件系 统或自动存储 管理磁盘组用 于快

Oracle 11g 简介 速恢复区。备份文件 所需的磁盘空间取决 于用户选择的存储机 制,一般原则上必须 指定 至 少 2 G B 的磁盘空间的存储位 置。也可以在创建数 据库后再启用自动备 份功能。 (13)采 用 默 认 设 置 (即不启用自动备份功 能) ,单 击 【下一步】按钮,出 现 【指定 数据库方案的口令】窗口,如 图 1-17所示。 ∙* 0 x * c l e U n iv e r s a l I n s t a l l e r : 指定!S据库方案的口令



'× ;

指定数据库方案的口令 月动数据库中包含被加曜昉案, 速B第羹的大名敷口令杼荏5口嗡束后失效并相S定.安装完成存必须方要使用 的那按帐户并谓新《 口令• 有 电 Γ窠将用于首密8嘴康和执行方乞安装后功能.因此侯舒解镜状数,并且这的 臬的口令不会失效. 请推定S8圈帐户的口令.

图 1-16 ■指定备份和恢复选项

O

图 1-17 / 旨定数据库方案的口令

O racle从 10g开始已经不再采 用默认的口令,而建议为每个账户(尤其是管理账户, 如 SYS、SYSTEM> SYSMAN> DBSNMP)指定不同 的密码。这里为了方 便,设置所有 账户使用同一个密码 。 (14)单 击 【下 一 步 】按 钮 ,经 过 短 暂 的 处 理 后 会 出 现 如 图 1 - 1 8 所 示 的 【Oracle Configuration Manager 注 册 】窗口。 (15)采用默认设置,单 击 【下一步】按钮,出 现 【概 要 】窗口,如 图 1-19所示。

C

图 1-18 , Oracle Configuration Manager 注册

Q F 图 1-19 一 安装概要

用 户 可 以 在 【概 要 】窗口中检查前面对 数据库的设置是否满 意,如不满意可以单 击 【上一步】按钮,返回 到前一个步骤进行修 改。 (16)单 击 【安装】按钮,0 U I 将正 式 开始安装O racle系统,如果前面 选择了创建 数据库选项,0 U I 则会在安装的过程中 打开数据库配置助手 创建数据库,如 图 1-20所示。 (17)创建数据库完毕后,就 会 显 示如 图 1-21所示的数据库配 置助手窗口。单 击 【口 令管理】按钮,弹 出 【口令管理】窗口,在 此窗口中可以锁定、解除数据库用户账户 ,

15

Oracle 11g中文版数 据库管理、应 用与开发标准 教程 设置用户账户 的密码。在这里解除了 SC O TT和 H R 用户账户,设 置其密码分别 为tiger 和 hro

图 1-20 select name z value from v$sga; NAME

ALUE

Fixed Size Variable Size Database Buffers Redo Buffers

1333312 310380480 58720256 6201344

习思考与练习 一、填空题

则 该 日 志 信 息 首 先 被 存 储 在 , 随后由

1 . O racle 数据库系统的物理存储结构 主要 由 3 类文件组成,分别为数据文件、 控制文件。

2



. 用户对数据库的操作如果 产生日志信息,

3

进程保存到 o . 在物理上,一个表空间对 应一个或多个

4

. 在 Oracle 的逻辑存储结构中,根据存储

第 2

★ O racle的体系结构------------- 合 数据的类型,可以将段分为

、索引段、

、LOB 段 和 。 5 . 在 Oracle 的逻辑存储结构中, 是最小的 I/O 单元。 6 . 在 Oracle 实例的进程结构中,进程大致 可 以 分 为 3 类 ,分 别 为 、后台进程和 。 当 用 户 运 行 一 个 应 用 程 序 (如 PRO*C 程 序 )或一个 Oracle 工 具 (如 SQL*Plus) 时 ,系 统 将 建 立 一 个 。 二 、选择题 1 . 当用户与 Oracle 服务器的连接非正常中 断 时 ,哪个后台进程负责释放用户所锁定的资 源? ( )

A. DBWn C. SMON

B. LGWR D. PMON 2 . 向 数 据 库 发 出 一 个 COM M IT 命令提交

件 ,提交的数据也能保留下来? (

数据缓冲区

C . 空闲的数据缓冲区 D . 已经被修改,并且已经写到磁盘的 数据缓冲区

11 . 当一个服务器进程找不到足够的空闲 空 间 来 放 置 从 磁 盘 读 入 的 数 据 块 时 ,将 发 生 什么? (

A

事务时,哪个后台进程将重做日志缓冲区的内容 写入联机重做日志文件? ( )

B

A. DBWn B. LGWR C. CKPT D. CMMT 3 . 当 启 动 Oracle 实例时,默认情况下,哪 个后台进程不会被启动? (

序排列是正确的是(

) 。

A . 表空间、区、段 、块 B . 表空间、段 、区、块 C . 段、表空间、区、块 D . 区、表空间、段 、块 5 . 在全 局存储区 SG A 中,哪部分内存区域 是循环使用的? (



A . 数 据 缓 冲 区 B . 日志缓冲区 C . 共享池 D . 大池 7 . 哪一个内存结构记录实例对数据库所做 的所有修改? ( ) A . 数据库缓冲区缓存 B . 数据字典缓存 C . 共享池 D . 重做日志缓冲区

8 . 哪个后台进程负责将脏数据缓冲区的内 容写入数据文件? ( ) A. DBWn B. SMON C. LGWR D. CKPT 9 . 哪个后台进程和其相关的数据库组成部 分保 证即 使数 据 库的修改 还没 有记 录到 数据 文

) . 通 知 C K P T 进 程 清 楚 D IR T Y 缓 冲区 . 通 知 SM O N 进 程 清 楚 D IR TY 缓 冲区 . 通 知 CKPT 进程激活一个检查点 . 通 知 DBWn 进 程 将 DIRTY 缓冲区 写到磁盘

12 . 下 列 哪 个 组 件 不 是 O racle 实例的一部 分? (



A . 系统全局区( SGA) B . 进程监控进程( PMON) C . 控制文件 D . 共享池 13 . 以下哪些事件不会引起 LGW R 进程启 动? (



A . 用户提交事务 B . 用 户 执 行 UPDATE C . 在 D B W n 进程将修改的缓冲区数



A . 数据缓冲区 B . 日志缓冲区 C . 共享池 D . 大池 6 . 解 析 后 的 SQ L 语 句 在 SG A 的哪个区域 中进行缓存? (

C D



A. DBWn B. LGWR C. CKPT D. ARCn 4 . 在数据库逻辑结构中,按从大到小的次



DBWn 和数据库高速缓冲存储区 LGWR 和联机重做日志文件 CKPT 和控制文件 DBWn 和归档重做日志文件 10 . 脏( DIRTY)缓冲区指的是什么? ( A . 正在被访问的数据缓冲区 B . 已经被修改,但还没有写到文件的 A. B. C. D.

据写到磁盘前

D . 当重做日志缓冲达到 1/3 满时 14 . 下 列 哪 个 不 是 重 做 日 志 缓 冲 区 的 特 点? (



A B C D

. 可循环再用 . 包含已经修改的块信息 . 其大小由参数 LOG_BUFFER定义 . 是 PG A 区的一部分

三 、简答题 1 . 简述表空间和数据文件之间的关系。 2 . 概 述 Oracle 数据库体系的物理结构。 3 . 简要介绍表空间、段 、盘区和数据块之 间的关系。

4

. 简 述 O racle 实例系统中各后台进程的

作用。

5 . 共享操作模式和专用操作模式的工作过 程有什么区别?



第3章

管 理 Orac le数据库

O racle数据 库系统由 实例和数 据库两部 分组成。为 了使客户 程序能够 访问O racle数 据库系统 ,必须在 服务器端 启动实例 并打开数 据库,即 启 动 O ra c le 数据库系 统。由于 O racle数据 库的启动 是分步骤 进行的,其 中会涉及 到实例的 启动、数 据库的加 载和打开 3 种状态。本章将对 数据库的 启动和关 闭过程进 行详细介 绍。 本章学习 要点: > 参数文件的类型 A 转换启动模式 > 常用的参数 > 数据库的关 闭步骤 > 创建参数 文件 > 各种关闭 数据库的方式 > 显示和设 置初始化 参数文件 > 数据库的 特殊状态 > 启动数据库的步骤 > 启动与关闭数据库服务 > 启动模式

管理初始化参数 初始化参 数用于设 置实例和 数据库的 特征。通过 设置初始 化参数,不仅可以定义例 程和数据 库的特征 ,还可以定 义许多其 他特征和 限制。例 如,通过使 用初始化 参数可以 定 义 S G A 的大小、设 置数据库 的名称、定 义用户和 进程的限 制、定义控 制文件、跟踪文 件和警告 日志的位 置等。在 O racle数据 库中,初始 化参数是 存储在参 数文件中 的,启动 实例、打 开数据库 时都必须 提供相应 的参数文 件。

^ - 3 . 1 . 1 常用初 始化参 数二 Oracle 11g提供了 2 0 0 多个初始 化参数,并 且多数初 始化参数 都具有默 认值。使用 O racle数据 库时,只 需要根据 特定需求 设置相应 的参数即 可,并且多 数参数都可以保留 默认值。表 3 -1 分别介绍 了一些常 用的初始 化参数。 表 3-1

-初始化参数

参数

说明

DBNAM E

该参数用于 定义数据库 的名称 该参数用于 指定数据库 在分布式网 络环境中的 逻辑位置。 设置该参 数时,应该 将其设置为 网络域名。该 参 数 和 D B_NAM E共同构成 了全局数据库名

DB DOMAIN

INSTANCE_NAME

该参数用于 指定实例的 唯一名称,主要用于在 R A C 环境中标识同 一 个 数 据 库 的 不 同 例 程 。在 单 实 例 数 据 库 系 统 中 ,其 值应 与 DB_NAME 保持完全一 致

SERVICE_NAMES

该参数用于 指定客户连 接到实例时 可以使用的 一个或多个 服务名 称 ,默认值为 DB_NAME .DB_DOMA IN

CONTROL_FILES

该参数用于 指定一个或 多个控制文 件名。当指 定多个控制 文件时, 名称之间用 逗号隔开。需要注意,设置该参数 时,最 多 可以指定 8 个控制文件

第 3 管 理 O ra c le 数据库 续表 参数

说明

DB_BLOCK_SIZE

该参数用于指定O racle数据库标准块的大小

DB_CACHE_SIZE

该参数用于指定标准数据高速缓存的大小,在 标 准 O ra cle块上的 读写操作会使用标准数据高速缓存

SHARED_POOL_SIZE

该参数用于指定共享池的大小

LOG_BUFFER

该参数用于指定重做日志缓存区的大小

SGA_MAX_SIZE

指 定 S G A 的最大大小

JAVA_POOL_SIZE

该参数用于指定Jav a池的大小。 如果在数据库中安装Ja v a虚拟机, 必须设置该参数,并且其值不要低于20MB

LARGE_POOL_SIZE

该参数用于指定大缓存池的大小

REMOTE_LOGIN_

该 参 数 用 于 指 定 特 权 用 户 的 验 证 方 式 ,其 取 值 可 以 是 NONE、

PASSWORDFILE

SHARED、EXCLUSIVE o 其中,N O N E 表 示 使 用 O S 验证特权用 户 ,SHARED表 示 多 个 数 据 库 可 以 共 用 同 一 个 密 码 文 件 , EXCLUSIVE表示密码文件只能用于单个数据库

UNDO_MANAGEMENT

该参数用于指定U N D O 管理模式,其 取 值 为 A U TO 或 MANUAL 0 设 置 为 A U T O 时 ,表示使用撤销表空间管理回退数据;设置为 M ANUAL时,表示使用回滚段管理回退数据

UNDO_TABLESPACE

该参数用于指定启动实例时使用的撤销表空间名。需要注意,该 参数指定的撤销表空间必须是已经存在的撤销表空间

BACKGROUND_DUMP_DEST

该参数用于指定预警文件和后台进程跟踪文件所在的目录

USER_DUMP_DEST

该参数用于指定服务器进程跟踪文件所在的目录

PROCESSES

该参数用于指定连接到O racle的并发用户进程的最大个数

NLS_DATE_FORMAT

指定使用的默认日期格式。该参数的值可以是包含在双引号内的 任何有效的日期格式掩码。例 如 :, , MMM∕DD∕YYYY',

在传统上,O racle在启动实例时将读取本地的一个文本文件,并利用从中获取的初 始化参数对实例和数据库进行设置,这个文本文件称为初始化参数文件(简 称 PFILE)。 如果要对初始化参数进行修改,必须先关闭数据库,然后在初始化参数文件中进行编辑, 再重新启动数据库使修改生效。 从 Oracle 8 i 开始,许多初始化参数都成了动态参数,也就是说可以在数据库运行期 间利 用 ALTER SYSTEM (或 ALTER SESSION)语句来修改初始化参数,并且不需要重 新启动数据库,修改后就可以立即生效。但是 使 用 ALTER SYSTEM语句对初始化参数 进行的修改并不能保存在初始化参数文件中。因此,在下一次启动数据库时,O racle依 然会使用初始化参数文件中的参数对实例进行设置。如果要永久性地修改某个初始化参 数 ,数据库管理必须通过手动方式对初始化参数文件进行编辑,这就为初始化参数的管 理带来了困难。 因此,从 Oracle 9 i 开始提供了服务器端初始化参数文件(简 称 SPFILE) 。服务器端 初始化参数文件是一个二进制格式的文件,它始终存放于数据库服务器端。这样,如果 在数据库的任何一个实例中使用ALTER SYSTEM语句对初始化参数进行了修改,在默 认情况下都会被永久地记录在服务器端初始化参数文件中。当下一次启动数据库时,这

45

Oracle 11g中文版数据 库管理、应用与 开发标准教程 些修改会自动继 续生效。因此,不必对初始化参 数文件进行手动 编辑,就能够保证在数 据库运行过程中 对初始化参数的 修改不会丢失。

西 __________________________ —

服务器端初始化参 数文件是一个二进 制格式的文件。尽管能够打开它并查 看其中的内容,

I 但是任何用户都不 应当手工对其中的 内容进行编辑,否 则实例将无法启动.

在启动数据库时 必须提供一个初 始化参数文件, 因为在启动数据 库时将按照如下 顺 序寻找初始化参 数文件。 □ 首先检查是否使 用SPFILE参数指 定了服务器端初 始化参数文件。 □ 然后再检查是否使用了 PFIL E参数指定了文本 初始化参数文件 。 □ 如 果 没 有 使 用 SPF IL E 参 数 和 P F IL E 参数,则在默认 位置寻找默认名 称的服务 器端初始化参数 文件。 □ 如果没有找到默 认服务器端初始 化参数文件,则 在默认位置寻找 默认名称的文 本初始化参数文 件。

φ - 3 . 1 . 3 创建初始化参 数文件 3 46

如果当前实例正 在使用S P F IL E ,那么使 用 ALTER SYSTEM命令将 无法修改某些初 始化参数,如 DB_NAME。为 了修改这些初始 化参数,必 须 建 立 P F I L E ,并且手工修改 该 PFIL E文件的相应参数 。可 以 使 用 CREATE PFIL E命令可以建立文 本参数文件,其语 法如下: create pfile [=,pfile_name, ] from spfile [= , spfile_name *]

其中,PFILE_NA ME用于 指 定 PFIL E 的文件全名,SPF ILE_NAME用 于 指 定 SPFILE 的文件全名。如 果不指定PFIL E文件名,则会在 默认路径下建立 默认PFILE;如果不指 定 SPFILE文件,则 会使用当前实例 正在使用的SPF ILE文件。需要注 意,只有特权用户 才 能 执 行 CREATE PFILE命令,例 如: C:∖ >sqlplus sys/password as sysdba SQL*Plus: Release 11.1.0.6.0 - Production on 星期三 3 月 12 10:54:05 2008 Copyright (c) 1982, 2007f Oracle. All rights reserved. 连接到:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> create pfile from spfile; 文件已创建。

因 为 SPFILE易于管理 ,并且可以对其 进行备份,所 以 O racle建 议 使 用 SPFILE。使 用 PFIL E修改了某些初始 化参数后,为 了 将 PFIL E 转 换 为 S P F IL E ,可 以 使 用 CREATE SPFILE命令建立 服务器参数文件 。语法如下:

第 3 管 理 O racle数据库 create spfile [=, sρfile_name , ] from pfile [=,pfile_name , ]

其中,SPFILE_NAME用 于 指 定 SPFILE文件全名, PFILE_NAME用 于 指 定 PFILE 文件全名。如 果 不 指 定 S P F IL E 文件名,则 会 在 默认路径下建立SPFILE;如果不指定 PFIL E文件名,则使用默认的PFIL E文件。需要注意,只有特权用户才能执行CREATE SPFILE 命令。

在 执 行 CREATE S P F IL E 语句时不需要启动实例,如果已经启动了实例,并且实例已经 使用了一个服务器端初始化参数文件,则新建的服务器端初始化参数文件不能覆盖正在使用 的那个文件。

举例如下: C:∖>sqlρlus sys/password as sysdba SQL*Plus: Release 11.1.0.6.0 - Production on 星期三 3 月 12 11:14:10 2008 Copyright

(c) 1982, 2007, Oracle. All rights reserved.

连接到: Oracle Database 11g Enterprise Edition Release 11.1 .0 .β.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> create spfile from pfile; create spfile from pfile * 第 1 行出现错误: ORA-32002:无 法 创 建已由实例使用的SPFILE

启动实例时,既可以使用P F I L E ,也可以使用SPFILE。当实例处于运行状态时,如 果 要 确 认 实 例 使 用 的 参 数 文 件 类 型 ,首 先 应 以 特 权 用 户 登 录 ,然后显示初始化参数 SPFILE的值。示例如下: SQL> conn sys/password as sysdba 已连接. SQL> show parameter spfile NAME

TYPE

spfile

string

VALUE D:\APP\MANAGER\PRODUCT\11.1.0∖ DB_1\DATABASE\SPFILEORCL.ORA

如 果 VALUE存在返回值,表示实例正在使用SPFILE;如 果 VALUE没有任何返回 结果,则表示实例正在使用PFILE„

ai: .4 显 示 和 设 置 初 始 化 参 数 文 件 一, 为 了 在 SQL*Plus中显示初始化参数,可 以 使 用 SHOW PARAMETER命令。该命令

.

Oracle 1 1 g 中文版数据库管 理、应用与开发标 准教程 会显示初始化参 数的名称、类型 和参数值。 为了显示所有初 始化参数的位置 ,可以直接执行 SHOW PARAMETER命 令,例如: SQL>show parameter NAME

TYPE

VALUE

db_writer_processes dbwr_io_slaves ddl_lock_timeout dg_broker_config_filel

integer integer integer string

dg_broker_conf ig_file2

string

dg_broker_start

boolean

1 0 0 D:\APP\MANAGER\PRODUCT\11.1.0∖ DB_1∖DATABASE∖DR1ORCL.DAT D:\APP\MANAGER\PRODUCT\11.1.0∖ DB_1∖DATABASE∖DR2ORCL.DAT FALSE

SHOW PARAMETER命 令也可以显示特 定初始化参数。为了显示特定初始化参数的 名称、类型和参 数值,可 以 在 SHOW PARAMETER命 令后指定参数名 。示例如下: SQL> show parameter db_block_size ,NAME db_block_size

TYPE

VALUE

integer

8192

当 使 用 SHOW PARAMETER命 令显示初始化参 数信息时,只能 显示参数名、类型 和参数值,为了 取得初始化参数 的详细信息,应 该查询动态性能 视图V$PARAMETER, 例如: SQL> select isses_modifiablez issys_modifiable,ismodified 2 from v$parameter where name= , sort_area_size , ; ISSES

ISSYS_MOD

ISMODIFIED

TRUE

DEFERRED

FALSE

1SSES_MODIFIABLE用于标识初 始化参数是否可 以使用ALTER SESSIO N命令进 行 修 改 , 当 取 值 为 T R U E 时 表 示 可 以 修 改 ;取 值 为 F A L S E 则 表 示 不 可 以 修 改 。 ISSYS_MODIFI ABLE用于标识初 始化参数是否可 以使用ALTER SY STEM 命令进行修 改 ,取 值 为 IMMEDIATE时 表示可以直接修 改;取 值 为 DEFERRED表示 需要使用带有 DEFERRED的选 项进行修改;取 值 为 FALSE表示不能 进行修改。ISMO DIFIED用于标 识该初始化参数 是否已经被修改 ,取 值 为 MODIFIED表 示 使 用 ALTER SESSION进行了 修改;取值为SY STEM M O D 表示使用ALTER SYSTEM命令进 行了修改;取值为 FALSE 表示未进行修改 。 静态参数是指只 能通过修改参数 文件而改变的初 始化参数:动态参 数是指在数据库 运行时可以使用 ALTER SESSION或 ALTER SYSTEM命令动 态改变的初始化 参数。下 面的命令将显示 系统的静态参数 。 SQL> select name from v$parameter

管 理 O ra c le 数据库

第 3 章

where isses__modif iable= , F A LSE , ;

2 NAME

lock_name_space processes sessions resource_limit license__max__sessions license_sessions__warning cpu__count instance_groups event sga__max_size pre_page_sga shared_memory__address hi__shared_memory_address use__indirect_data_buffers lock_sga shared_pool_size large__pool__size java_pool_size

动态参数是指在数据库运行过程中可以动态修改的初始化参数。修改动态参数可以 使 用 ALTER SESSION命令,也可以使用ALTER SYSTEM命令。这两者之间的区别是: ALTER SESSION是对会话的设置,会话结束后就失效了;ALTER SYSTEM修改的是数 据库系统的配置,是全局性质。 在使用ALTER SYSTEM语句时, 可以在SET子句中通过SCOPE选项来设置ALTER SYSTEM语句的影响范围。所谓影响范围,也 就 是 ALTER SYSTEM语句对参数的修改 是仅对当前实例有效还是永久有效。 SCOPE选项的取值如下。 □ S C O P E = M E M O R Y 对参数的修改仅记录在内存中。对于动态初始化参数,更 改将立即生效,并且由于修改不会记录在服务器端初始化参数文件中,在下一 次启动数据库时,仍然会使用修改前的参数设置。对于静态参数,则不能使用 该选项。 □ S C O P E = S P F I L E 对参数的修改仅记录在服务器端初始化参数文件中。该选项 同时适用于动态参数与静态参数。修改后的参数只有在下一次启动数据库时更 改后才会生效。 □ S C O P E = B O T H 对参数的修改将同时记录在内存中和服务器端初始化参数文 件中 。对于动态初始化参数,在更改后将立即生效,并且在下一次启动数据库 时将使用修改后的参数设置。对于静态参数,则不能使用这个选项值。在执行 ALTER SYSTEM语句时,Oracle默 认 地 将 SCOPE选项设置为BOTH。 0

----------------------------------------------------------------------- . 在修改静态初始化参数时,只 能 将 SCOPE 选 项 设 置 为 SPFILE。

49

Oracle 11g中文版数据库管理 、应用与开发标准教程 在修改动态初始化参 数时,还 可 以 指 定 D EFERR ED关键字,这样对参 数所做的修 改将延迟到新的会话 产生时才生效。如果 数据库没有使用服务 器端初始化参数文件 ,在 ALTER SYSTEM 语 句 中 将 SCOPE选 项 设 置为 SPFILE或 B O TH 将会产生错误。 例如,利用下面的语 句将对动态初始化参 数LOG_CHECKPOIN T_INTERVAL进行 修改,修改结果不仅 在当前实例中有效,而 且还将记靠在服务器 端初据化参数文件中 。 SQL> alter system set log_checkpoint_interval=50; 系统已更改。

如果要修改静态参数 ,则 必 须 将 SCOPE选 项 设 置 为 SPFILE。例如修改静 态初始化 参数 DB FILESo SQL> alter system set db_files=100 scope=spfile; 系统已更改。

SQL> alter system set db_files≈200 scope=memory; alter system set db_files=200 scope=memory * 第 1 行出现错误: ORA-02095: 无法修改指定的初始化参 数

50

学启动数据库与实例 由 于 O racle数据库的启动过 程是分步进行的,因此 数据库有多种启动模 式。不同的 启动模式之间能够相 互切换。此外,除正 常方式启动数据库外 ,还能够将数据库设置 为 受限状态或只读状态 ,以满足特殊管理工 作的需要。

f - 3 . 2 . 1 启 动 数 据 库 的 步 骤 -、 由于实例是O racle用来管理数据库 的一个实体,在启动数 据库时将在内存中创建 与 该数据库所对应的实 例。O racle数据库的完整启 动过程分为如下3 个步骤。 (1)创建并启动与数据 库对应的实例。在启 动实例时,将为实例 创建一系列后台进 程和服务进程,并且在内存中创建S G A 区等内存结构。在实例启动的过程中只 会使用到 初始化参数文件,数据库是否存在对实 例的启动并没有影响 。如果初始化参数设置有误, 实例将无法启动。 ( 2 )为实例加载数据库 。加载数据库时实例将 打开数据库的控制文 件,从控制文件 中获取数据库名称、数 据文件的位置和名称 等有关数据库物理结 构的信息,为打开数据 库做好准备。如果控 制文件损坏,则实例 将无法加载数据库。在 加载数据库阶段,实例 并不会打开数据库的 物理文件一数据文件 和重做日志文件。 (3 )将数据库设置为打开 状态。打开数据库时 ,实例将打开所有处于 联机状态的数 据文件和重做日志文 件。控制文件中的任何一个 数据文件或重做日志文 件无法正常打开, 数据库都将返回错误 信息,这时需要进行 数据库恢复。 只有将数据库设置为 打开状态后,数据库才 处于正常运行状态,这时普通用户才能 够访问数据库。在很 多情况下,启动数据 库时并不是直接完成 上述3 个步骤,而是逐步

第 3 章 管 理 O ra c le 数 据 库 --------------- — 完成的,然后执行必要的管理操作,最后再使数据库进入正常运行状态。 例如,如果需要重新命名数据库中的某个数据文件,而数据库当前正处于正常启动 状态,可能还会有用户正在访问该数据文件中的数据,因此无法对数据文件进行更改。 这时必须将数据库关闭,并 进 入 到 加 载 ( 但不打开)状态,这样将断开与所有用户的连 接 ,然后再对数据文件进行重命名。完成操作后再重新打开数据库供用户使用。因此, 数据库管理需要根据不同的情况决定以不同的方式启动数据库,并且还需要在各种启动 状态之间进行切换。 在启动实例之前,首先需要启动SQL*Plus并连 接 到 Oracle。具体步骤如下。 (1)在命令提示符窗口中输入如下命令,以不连接数据库的方式启动SQL*Plus0 C: ∖>sqlplus ∕nolog SQL*Plus: Release 11.1.0.6.0 - Production on 星期三 3 月 12 16:17:01 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved.

( 2 )以 SYSDBA身份连接到Oracle。 SQL> connect system/admin as sysdba

已连接

φ - 3 . 2 . 2 启动模式 由上面的介绍可知,数据库和实例的启动过程可以分为3 个步骤:启动实例,加载 数据库,打开数据库。数据库管理员可以根据实际情况的需要,以不同的模式启动数据 库 。启动数据库所使用的STARTUP命令格式如下: startup [nomount ∣ mount ∣ open ∣ force] [resetrict] [pfile=filename]

其中,NOMOUNT选项用于指定启动实例;M OUNT选项用于指定启动例程并装载 数据库;O PEN 选项用于指定启动例程、装载并打开数据库,这也是默认的选项;FORCE 选项用于指定终止实例并重新启动数据库;RESTRICT用于指定以受限会话方式启动数 据库;PFIL E 则用于指定启动实例时所使用的文本参数文件。 由于数据库实例在启动时必须读取一个初始化参数文件,以便从中获得有关实例的 参数配置信息。当 用 STARTUP语句启动数据库时,通 过 PFIL E 参数指定一个服务器端 初始化参数文件或文本初始化参数文件。如 果 在 STARTUP语句中没有指定PFIL E参数, O racle首先读取默认位置的服务器端初始化参数文件S PF IL E ,如果没有找到默认服务器 端初始化参数文件,O ra c le则将继续读取默认位置的文本初始化参数文件。下面将详细 介绍如何使用STARTUP语句启动数据库到各种启动模式。 1 . 启动实例不加载数据库(NOMOUNT模式) 这种启动模式只会创建实例,并不加载数据库,O racle仅为实例创建各种内存结构 和服务进程,不会打开任何数据文件。当要执行下列维护工作时,必 须 在 NOMOUNT 启动模式下进行。

51

Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程 □ 创建新数据库 。 □ 重建控制文件 。 进入这种启动 模式需要使用 带有NOMOU NT子 句 的 STARTUP语 句 。下面显示了在 SQL*Plus中启 动数据库进入 NOMOUNT模 式的过程。 SQL> shutdown immediate 数据库已经关闭 。 已经卸载数据库 。 O R A C L E 例程已经关闭。 SQL> startup nomount O R A C L E 例程已经启动。 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers

52

376635392 1333312 310380480 58720256 6201344

bytes bytes bytes bytes bytes

启 动 到 N O M O U N T 模式下,只 能 访 问 那 些 与 S G A 区相关的数据 字典视图,包括 V$PARAMET ER、V$SGA、V$PROCESS 和 V$SESSION 等 ,这些视图中 的信息都是从 S G A 区中获取的,与数据库无关 。 2 . 加载数据但不 打开 数 据库 (MOUNT模 式 ) 这种启动模式 将为实例加载 数据库,却保 持数据库的关 闭状态,这在进行一些特定 的数据库维护 工作是十分必 要的。 在执行下列维 护工作时必须 在M OUNT启动模 式下进行。 □ 重 命名数据文件 。 □ 添 加、删除或重 命名重做日志 文件。 □ 执行数据库完 全恢复操作。 □ 改 变数据库的归 档模式。 加载数据库时 需要打开数据 库控制文件,但数据文件和 重做日志文件 都无法进行读 写 ,用户 也就无法对数 据库进行操作 。进 入 这 种 启 动 模 式 需 要 使 用 M O U N T 子句的 STARTUP语 句。下面显示 了在SQL*Pl us中启动数据 库进入M OUNT模式的 过程。 SQL> startup mount O R A C L E 例程已经启动《 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers 数据库装载完毕 。

376635392 1333312 310380480 58720256 6201344

bytes bytes bytes bytes bytes

启 动 到 M O U N T 模式下,只能 访问到那些与 控制文件相关 的数据字典视 图,包括 V$THREAD、VSCONTROLFILEΛ V$DATABASE、V$DATAFILE 和 VSLOGFILE 等 , 这些视图中的 信息都是从控 制文件中获取 的。 3

. 打 开 数 据 库 (O P E N 模式 )

这是正常启动 模式,用户要对数据 库进行操作时 ,数据库必须处 于O PEN 启动模式。



3 管 理 O ra c le 数据库 进入这种启动模式可以使用不带任何子句的STARTU P语句。下 面 显 示 了 在 SQL*Plus 中启动数据库进入O PEN 模式的过程。 SQL> startup O R A C L E 例程已经启动。 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers 数据库装载完毕。 数据库已经打开。

376635392 1333312 310380480 58720256 6201344

bytes bytes bytes bytes bytes

4 . 强制启动数据库 在某些情况下,使用上述各种启动模式可能都无法成功 启动数据库,这时需要强行 启动数据库。强制启动数据库时需要使用带有FO R C E子 句 的 STARTUP语句,例如: SQL> startup force O R A C L E 例程已经启动。 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers 数据库装载完毕。 数据库已经打开。

r

376635392 1333312 310380480 58720256 6201344

bytes bytes bytes bytes bytes

- 3.2.3

在进行某些特定的管理和维护操作时,需要使用某种特定的启动模式来启动数据库。 但是当管理或维护操作完成后,需要改变数据库的启动 模式。例 如 ,为一个未加载数据 库的实例加载数据库,或者将一个处于未打开状态的数 据库设置为打开状态等。 在数据库的各种启动模式之间切换需要使用ALTER DATABASE语 句 。下面分别介 绍在不同的情况下,如 何 利 用 ALTER DATABASE语句来改变数据库的启动模式。 1 . 实例加载数据库 在执行一些特殊的管理和维护操作时,需 要 进 入 N O M O U N T启动模式。在完成操 作后,可以使用如下语句为实例加载数据库,切 换 到 M OUNT启动模式。 SQL> startup nomount O R A C L E 例程已经启动。 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers SQL> alter database mount; 数据库已更改。

376635392 1333312 310380480 58720256 6201344

bytes bytes bytes bytes bytes

53

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 2 .打 开 数 据 库 为实例加载数据库后 ,数据库可能仍然处于 关闭状态。为了使用户能够访问数据库, 可以使用如下语句打 开数据库,即切换 到O PE N 启动模式。 SQL> alter database open; 数据库已更改。

数据库设置为打开状 态后,用户可以以正 常方式访问数据库。 3

. 切换受限状态

在正常启动 模 式 下 ( O PE N 启动模式),可以选择将数据库 设置为非受限状态和 受限 状态。在受限状态下 ,只有具有管理权限 的用户才能够访问数 据库。当需要进行如 下数 据库维护操作时,必 须将数据库置于受限 状态。 □ 执行数据导入或导出 操作。 □ 暂时拒绝普通用户访 问数据库。 □ 进行数据库移植或升 级操作。

54

当 打 开 的 数 据 库 被 设 置 为 受 限 状 态 时 , 只 有 同 时 具 有 CREATE S E S S IO N 和 RESTRICTED SESSION系统权限 的用户才能够访问。具 有 SYSDBA和 SYSOPER系统 权限的用户也有权连 接到受限状态的数据 库。 可以使用如下的语句 启动数据库,将数据 库启动到受限状态 的O PEN 模 式 。 SQL> startup restrict ORACLE 例程已经启动。 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers

376635392 1333312 310380480 58720256 6201344

bytes bytes bytes bytes bytes

数据库装载完毕。 数据库已经打开。

如果在完成管理操作 后需要将数据库恢复 为非受限状态, 可以使用ALTER SYSTEM 语句来改变数据库的 状态,例如: SQL> alter system disable restricted session; 系统已更改。

如果在数据库运行过 程中需要由非受限状 态切换到受限状态,同样可以通过ALTER SYSTEM语句来实 现,例如:



3 管 理 O ra c le 数据库



4 . 切换只读状态 在正常启动状态下,默认的数据库处于读写状态。此时用户不但能够从数据库中读 取数据,而且还可以修改已有的数据库对象或创建新的数据库对象。在必要的时候,可 以将数据库设置为只读状态。当数据库处理只读状态时,用户只能查询数据库,但是不 能以任何方式对数据库对象进行修改。

处于只读状态的数据库能够保证数据文件和重做日志文件中的内容不被修改,但是并不 限制那些不会写入数据文件与重做日志文件的操作。

可以使用ALTER DATABASE语句在数据库运行过程中切换为只读模式,例如: SQL> startup mount O R A C L E 例程已经启动。 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers 数据库装载完毕。

376635392 1333312 310380480 58720256 6201344

bytes bytes bytes bytes bytes

SQL> alter database open read only; 数据库已更改。

同样可以利用ALTER DATABASE语句重新将数据库设置为读写模式,例如: SQL> alter database open read write; 数据库已更改。

关闭数据库与实例 与数据库的启动相对应,关闭数据库也是分步骤进行的。在关闭数据库与实例时, 需要使用一个具有SYSDBA权限的用户账户连接到O racle中,然 后 使 用 SHUTDOWN 语句执行关闭操作。

3 . 3 . 1 数据库的关闭步骤 与启动数据库实例的3 个步骤相同,关闭数据库与实例也可以分为3 步 :关闭数据、 实例卸载数据库、最后终止实例。 关闭数据库时,O racle会将日志缓存中的重做日志记录到重做日志文件,并将数据 缓存中被修改的数据写入数据文件,然后再关闭所有的数据文件和重做日志文件。这时 数据库的控制文件仍然处于打开状态,但是由于数据库已经处于关闭状态,用户也将无 法访问数据库。

55

--------------------- Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程 关闭数据库后 ,实例才能够 卸载数据库。这时,数据库 的控制文件已 经被关闭,但 是实例仍然存 在。 最后是终止 实例,实例 所拥有的所 有后台进程 和服务进程 都将被终止 , 内存中的 S G A 区被回收。 在 SQ L*Plus中可 以使用SHU TDOWN语句 关闭数据库,SHUTDOW N语句可以带 有不同的子句 以控制数据库 关闭的方式。其语法格式如 下: shutdown [normal I tr a n s a c tio n a l I immediate ∣ abort]

. - 3.3.2

正常关闭方式( NORMAL )

如果对关闭数 据库的时间没 有限制,通常 会使用正常方 式来关闭数据 库。使用带有 NORM AL子 句 的 SHTUDOW N语句将以正 常方式关闭数 据库,下面显 示了在SQL*Plus 中以正常方式 关闭数据库的 过程。 SQL> shutdown normal 数据库已经关 闭。 已经卸载数据 库。 ORACLE 例程已经关闭 。

以正常方式关 闭数据库时,Oracle将执行 如下操作。 □ 阻止任何用户 建立新的连接 。 □ 等待当前所有 正在连接的用 户主动断开连 接,已经连接 的用户能够继 续当前的 操作。 □ 一旦所有的用 户都断开连接 ,则立即关闭 、卸载数据库 ,并终止实例 。

以正常方式关 闭数据库时,Oracle并不会断开当 前用户的连接 ,而是等待当前 用户主动 断开连接。因此,在 使 用 SHUTDOWN NORMAL 语句关闭数据 库时,应该通知所有在线的用 户尽快断开连 接。

立即方式能够 在尽可能短的 时间内关闭数 据库。以立即 方式关闭数据 库时,Oracle 将执行如下操 作。 □ 阻止任何用户 建立新的连接 ,同时阻止当 前连接的用户 开始任何新的 事务。 □ 任何未提交的 事务均被回退 。 □

O racle不再等 待用户主动断 开连接,而是 直接关闭、卸 载数据库,并 终止实例。

以立即方式关 闭数据库,只 需 要 使 用 带 IMMEDIAT E子 句 的 SHUTDOW N语句, 例如: SQL> shutdown immediate 数据库已经关 闭。



3 管 理 O racle 数 据 库



已经卸载数据库。 O R A C L E 例程已经关闭。 :

在 立 即 关 闭 方 式 下 ,O racle不 仅 会 立 即 中 断 当 前 用 户 的 连 接 ,而 且 会 强 行 终 止 用 户 的 当 前 事 务 ,并 将 未 完 成 的 事 务 回 退 。与 正 常 方 式 类 似 , 以 立 即 方 式 关 闭 数 据 库 后 ,在 下次启动数据库时不需要进行任何恢复操作。

如果存在太多未提交的事务,立即方式仍然会耗费很长的时间。这时如果需要快速关闭 数 据库,可 以 使 用 SHUTDOWN ABORT 语 句 .

事 务 关 闭 方 式 介 于 正 常 关 闭 方 式 与 立 即 关 闭 方 式 之 间 ,它 能 够 在 尽 可 能 短 的 时 间 内 关 闭 数 据 库 ,但 是 能 够 保 证 当 前 所 有 的 活 动 事 务 都 可 以 被 提 交 。使 用 事 务 方 式 关 闭 数 据 库 时 ,O racle将 等 待 所 有 未 提 交 的 事 务 完 成 后 再 关 闭 数 据 库 。 使 用 带 有 TRANSACTIONAL子 句 的 SHUTDOWN语 句 将 以 事 务 方 式 关 闭 数 据 库 , 例如:

57

SQL> shutdown transactional 数据库已经关闭。 已经卸载数据库。 O R A C L E 例程已经关闭。 :1

以 事 务 方 式 关 闭 数 据 库 时 ,O racle将 执 行 如 下 操 作 。 □

阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事务。



等 待 所 有 未 提 交 的 活 动 事 务 提 交 完 毕 ,然 后 立 即 断 开 用 户 的 连 接 。



关 闭 、卸 载 数 据 库 ,并 终 止 实 例 。

事 务 关 闭 方 式 既 能 保 证 用 户 不 会 丢 失 当 前 工 作 的 信 息 ,又 可 以 尽 可 能 快 地 关 闭 数 据 库 。 因 此 ,事 务 关 闭 数 据 库 方 式 也 是 最 常 用 的 数 据 库 关 闭 方 式 。

3 .3 .5 终止关闭 方式( ABORT) - 、 一一•.一一一一一一一一一一一―一一/

___—

如 果 上 述 3 种 关 闭 方 式 都 无 法 关 闭 数 据 库 ,说 明 数 据 库 产 生 了 严 重 的 错 误 ,这 时 只 能 使 用 终 止 方 式 来 关 闭 数 据 库 。终 止 关 闭 方 式 将 丢 失 一 部 分 数 据 信 息 ,会 对 数 据 库 的 完 整 性 造 成 损 害 。因 此 ,如 果 重 新 启 动 实 例 并 打 开 数 据 库 时 ,后 台 进 程 SM ON会 执 行 实 例 恢 复 操 作 。一 般 情 况 下 ,应 当 尽 量 避 免 使 用 这 种 方 式 来 关 闭 数 据 库 。 使 用 带 有 A BO R T子 句 的 SHUTDOWN语 句 可 以 以 终 止 方 式 关 闭 数 据 库 ,例 如 : SQL> shutdown abort O R A C L E 例程已经关闭。

以 终 止 方 式 关 闭 数 据 库 时 ,O racle将 执 行 如 下 操 作 。 □

阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事务。

Oracle 1 1 g 中文版数据库管理、应用与 开发标准教程 □ 立即终止当前正在执行的S Q L语句。 □ 任何未提交的事务均不被回 退。 □ 立即断开所有用户的连接, 关闭、卸载数据库,并终止 实例。

吁数据库的特殊状态 静默状态和挂起状态是两种 特殊的数据库状态。当数据库处于静默状态时, 只有SYS 和 SYSTEM用户能够在数据库 中进行操作。当数据库处于 挂起状态时,数 据 库 I/O 操作 都会被暂时停止。利用这两 种数据库状态,数据库管理 员可以完成一些特殊的管理 和维 护操作。

φ- 3 .4 .1 静默状态, 在静默状态下,只有具有管 理员权限的用户才能够在数 据库中执行查询、更新操作 和 运 行 PL/SQ L程序,任何非管理员用户 都不能在数据库中执行任何 操作。 在数据库运行过程中,执行 如下的语句将进入静默状态 。 SQL> alter system quiesce restricted; 系统已更改。

执行上述语句后,数据库将 等待所有正在运行的非管理 员用户会话主动终止,同时 不再允许开始任何新的非管 理员用户会话。当所有的非 管理员用户的活动会话都被 暂停 后 ,ALTER SYSTEM QUIESCE RESTRICTED语句执行完毕 ,这时数据库被认为处于静 默状态。 由于等待所有的非管理员用 户会话都终止可能会需要很 长一段时间,在这个过程中 如果 执行 ALTER SYSTEM语句的会话被意外 终止,进行静默状态的操作 将被撤销,已 经暂停的会话将被恢复。 如果数据库处于静默状态,可以执行如下语句从静默状 态恢复为正常状态: SQL> alter system unquiesce; 系统已更改。

可以通过使用动态性能视图 V$INSTANCE来查询当前 数据库是否处于静默状态。 VSINSTANCE视 图 的 ACTIVE_STATUS字段显示 数据库当前的活动状态。 □ N O R M A L 正常状态,即非静默状态。 □ Q U I E S C I N G 正在进入静态状态,仍然存 在活动的非管理员用户会话 。 □ QUIESCED

静默状态。 下面的示例显示了如何改变 和查询数据库的静默状态。

SQL> alter system quiesce restricted; 系统已更改。 SQL> select instance_name,active_state from v$instance;

第 3 章 管 理 O racle数 据 库 --------------- — INSTANCE_NAME

ACTIVE_ST

ord

QUIESCED

SQL> alter system unquiesce; 系统已更改。 SQL> select instance_name z active_state from v$instance; INSTANCE__NAME

ACTIVE__ST ,

Orel

NORMAL

0- 3 4 2 挂起状态3 当数据库处于挂起状态时,数据库所有的物理文件(控制文件、数据文件和重做日 志文件)的 I /O 操作都被暂停,这样能够保证数据库在没有任何I /O 操作的情况下进行 物理备份。挂起状态与静默状态的区别是:挂起状态并不禁止非管理员用户进行数据库 操作,只是暂时停止所有用户的I/O 操作。

59 ιv

当数据库进入静默状态时,不能通过复制物理文件的方法来对数据库进行备份,因为静

默状态下的数据文件仍然处于读写状态。只能在数据库关闭状态或挂起状态下才能对数据库 的物理文件进行复制操作.

在数据库进入挂起状态时,当前 的所有I /O 操作能够继续进行,但是所有新提交的 I / O 操作都不会被执行,而是被放入一个等待队列中。一旦数据库恢复到正常状态,这 些 I/O 操作将从队列中取出并继续执行。 挂起数据库操作可以通过ALTER SYSTEM语句完成,例如: SQL> alter system suspend ; 系统已更改。

如果要将数据库从挂起状态中恢复,可以使用如下语句: SQL> alter system resume; 系统已更改

可以通过使用动态性能视图V$INSTANCE来查询当前数据库是否处于挂起状态。 动态性能视图V$INSTANCE的 DATABASE_STATUS字段显示数据库当前的活动状态。 □ SUSPENDED 挂起状态。 □

ACTIVED

正常状态。

下面的示例显示了如何改变和查询数据库的挂起状态。 SQL> alter system suspend; 系统已更改。

--------------- Oracle 11g中文版数据库管理、应用 与开发标准教程 SQL>select database_status from v$instance; DATABASE__STATUS SUSPENDED SQL> alter system resume; 系统已更改。

SQL> select database_status from v$instance; DATABASE_STATUS ACTIVE

蓼思考与练习 一 、填空题

二 、选择题

1 . UNDO_MANAGEMENT参数用于指定

60

U N D O 管 理 模 式 ,其 取 值可以为 。设置为



时 ,表示使用撤

销表空间管理回退数据;设置为

1 . 如 果 用 户 S C O T T 执 行 了 语 句 UPDATE EMP SET S A L = 1 0 0 0 ,则以下哪个命令可以关闭 数据库? (

时,



A.

SHUTDOWN

表示使用回滚段管理回退数据。

B.

SHTUDOWN IMMEDIATE

2 . 指定会话使用默认的日期格式时 ,所设 置的参数为 O

C.

SHTUDOWN NORMAL

D.

3 . 在传统上,O ra c le 在启动实例时将读取

SHTUDOWN TflANSACTIONAL . 下列哪一个是错误的启动语句? (

2

本地的一个文本文件,并利用从中 获取的初始化

A.

STARTUP NORMAL

参数对实例和数据库进行设置,这个文本文件称

B.

STARTUP NOMOUNT



C.

STARTUP MOUNT

D.

STARTUP FORCE

(简 称 PFILE) o 而 从 Oracle 9 i 后 ,

始 提 供 (简 称 SPFILE)。它 是一个二进制格式的文件,并始终 存放在数据库

O racle开

服务器端。

复操作? (

命令,该命令会显示初始化参

数的名称、类型和参数值。 5 . O ra c le 数据库的完整启动过程依次为如 下 3 个步骤:启动数据库实例、

、将

数据库设置为打开状态。 6

.使 用 以 下 哪 一 条 SHUTDOW N语句关闭

数据库之后,在下一次打开数据库 时必须进行恢

4 . 为 了 在 SQL*Plus中显示初始化参数,可 以使用

3



A.

SHUTDOWN NORMAL

B.

SHTUDOWN IMMEDIATE

C.

SHTUDOWN TRANSACTIONAL

D.

SHTUDOWN ABORT

. 下列关于数据库静默状态的描述 ,哪一 . 关 闭 数 据 库 的 几 种 方 式 :正 常 关 闭 、项是不正确的? ( ) 、终止关闭、 O A . 在 处 于 静 默 状态的数据库中,只允

7 . 在 状 态 下,只有具有管理员 权限的用户才能够在数据库中执 行查询、更新操

4

许 S Y S 和 SYSTEM 两 种 D B A 用户 执行操作

作 和 运 行 PL/SQ L程 序 ,任何非管理员用户都不

B . 在 处 于 静 默 状 态 的 数 据库 中 ,具有

能 在 数 据 库 中 执 行 任 何 操 作 。 当数据库处于

SYSD BA 权 限 的 用 户 可 以 通 过 SQL

_状 态 时 ,数 据 库 所 有 物 理 文 件 的 I/O 操作都被暂停,这样能够保证数据 库在没有任何

C . 如 果 通 过 V$INSTANCE视图查询数

I/O 操作的情况下进行物理备份。

语句强行激活某个会话 据 库 处 于 Q U IE S C E D ,则说明当前



第 3 管 理 O racle数 据 库 -----c . 静默状态 D . 加载但不打开状态

数据库中已经不存在任何活动的非

DBA 会话 D . 静 默 状态下,数据库仍然存在物理 I/O 操 作,这一点与挂起状态不同 5 . 如果需要在操作系统中对数据库的文件 进 行 物 理 备 份 ,应 当 令 数 据 库 进 入 哪 种 状 态 ? (

)

A . 受限状态 B . 挂起状态

三 、简答题

1. 2. 3. 4. 5.

简 述 Oracle 初始化参数文件。 简述如何修改初始化参数。 简述启动数据库时的状态。 简述数据库的各种关闭方式。 简述数据库的特殊状态。

61

第 4 章 SQL*Plus命令 在数据库系统中,可以使用两种方式执行命令,一种方 式是通过图形化工具,另一 种方式是直接使用各种命令。图形化工具的特点是直观 、简单、容易记忆,而直接使用 命令则需要记忆具体命令及语法形式。但是,图形工具 灵活性比较差,不利于用户对命 令及其选项的理解;而命令则非常灵活,有利于加深用 户对复杂命令选项的理解,并且 可以完成某些图形工具无法完成的任务。在 Oracle 11g系统中,提供了用于执行S Q L 语 句 和 PL/SQ L程序 的 工 具 SQL*Pluso 本 章 将 对 SQL*Plus工具的特点、功能和用法进行全面描述,并 对 设 置 SQL*Plus的 运行环境、执 行 各 种 SQL*Plus命令、格式化输出结果、定义和使用变量、编 辑 S Q L 命 令等进行介绍。 本章学习要点: > 理 解 SQL*Plus的运行环境 > > > >

进行基本的运行环境设置 使 用 H E L P命令 DESCRIBE命令的作用 PROM PT命令的使用

>

SPO OL命令的使用

>

使 用 C O L U M N 命令格式化查询 结果 缓存区命令的使用 在 SQL*Plus中运行脚本文件

> >

SQL*Plus运 行 环 境 是 SQL*Plus的运行方式和查询语句执行结果显示方式的总 称。 设置合适的SQL*Plus运行环境,可 以 使 SQL*Plus能够按照用户的要求运行和执行各种 操作。

r ^ 4 . 1 . 1 使 用 SET 语 句 选 项 , 在 Oracle 11g系统中,用户可以使用S E T 命 令 来 设 置 SQL*Plus的运行环境。使用 S E T 命令的语法格式为: s e t system _option v alu e

S E T 命令的选项及其取值如表4 -1 所示。 至

表 4-1 ‘ S E T 命令选项

选项

说明

SET ARRAYSIZE {15∣N}

设 置 SQL*Plus 一次从数据库中取出的行数,其取值范围为任意正 整数

SET AUTOCOMMIT(ON∣OFF∣ IMMEDIATE∣N}

该参数的值决定 Oracle何时提交对数据库所做的修改。当设置为

O N 和 IMMEDIATE 时,S Q L 命令执行完毕后立即提交用户做的 更改;而 当设置为 O F F 时 ,则用户必须使用 COMMIT 命令提交。 关于事务处理请参考相关章节

第 4 SQL*Plus 命令 续表 选项 OFF) SET AUTOPRINT{ON∣

SET AUTORECOVERY OFF} {ON∣

说明 自动打印变量值,如果设置为 O N , 则在执行过程中可以看到屏幕 上打印的变量值;设置为 O F F 表示只显示“过程执行完毕”这样 的提示 设 定 为 O N 时,将以默认的文件名来记录重做记录,当需要恢复 时,可以使用 RECOVER AUTOMATIC DATABASE 语句恢复,否 则只能使用RECOVER DATABASE 语句恢复

OFF∣ SET AUTOTRACE {ON∣ TRACE[ONLY]} [EXPLAIN] [STATISTICS]

对正常执行完毕的SQL D M L 语句自动生成报表信息

SET BLOCKTERMINATOR OFF} ON∣ {C∣

定义表示 PL/SQL 块结束的字符

N} SET LINESIZE {80∣

定 义 SQL*Plus 的命令行区分字符,默认值为 O F F , 也就是说回车 键表示下一条命令并开始执行;假如设置为 O N , 则命令行区分字 符会被自动设定成“;”,这 样 就 可 以 在 一 行 内 用 分 隔 多 条 S Q L 命令 设置列和列之间的分隔字符。默认情况下,在 执 行 SELECT 语句 输出的结果中,列和列之间是以空格分隔的。这个分隔符可以通 过使用 SET CO LSEP 命令来定义 设 置 SQL*Plus 在一行中能够显示的总字符数,默认 值 为 8 0 o 可

N} SET LONG {80∣

以的取值为任意正整数 为 LO N G 型数值设置最大显示宽度,默认值为 80

SET CMDSEP{;|C|ON|OFF}

SET COLSEP{ JTEXT}

SET NULL TEXT

设置每页打印标题前的空行数,默认值为 1 设置当 SELECT 语句返回 N U LL 值时显示的字符串

SET NUMFORMAT FORMAT

设置数字的默认显示格式

N} SET PAGESIZE {14∣

设置每页打印的行数,该值包括 NEWPAGE 设置的空行数 设 置 SQL*Plus 输出结果时是否滚动显示。当取值为N O 时表示输 出结果的每一页都暂停,用户按回车键后继续显示;取值为字符 、 串时,每次暂停都将显示该字符串

NONE} N∣ SET NEWPAGE {1 ∣

TEXT} ON∣ SET PAUSE {OFF∣

SET RECSEP {WRAPPED ∣ EACH | OFF} N} SET SPACE {1 ∣ SET SQLCASE {MIXED ∣ UPPER) LOWER ∣ TEST} SET SQLCONTINUE{>∣ ON} SET TIME {OFF ∣ ON} SET TIMING {OFF ∣ ON ∣ C∣ SET UNDERLINE {-∣ OFF} SET WRAP {ON | OFF}

显示或打印记录分隔符。其取值为 W RAPPED 时,只有在折叠的 行后面打印记录分隔符;取值为 E A C H 则表示每行之后都打印记 录分隔符;O F F 表示不打印分隔符 设置输出结果中列与列之间的空格数,默认值 为 10 设置在执行 S Q L 命令之前是否转换大小写。取值可以为 MIXED 转换为大写) 转换为小写)和 UPPER ( 、LOWER ( 不进行转换) ( 设 置 SQL*Plus 的命令提示符 控制当前时间的显示。取 值 为 O N 时,表示在每个命令提示符前 显示当前系统时间;取值为 O F F 则不显示当前的系统时间 控制是否统计每个S Q L 命令的运行时间。取值为 O N 表示统计, 取值为 O F F 则不统计 设 置 SQL*Plus 是否在列标题下面添加分隔线,取值为 O N 或 OFF 时分别表示打开或关闭该功能;还可以设置列标题下面分隔线的 样式 设置当一个数据项比当前行宽时,SQL*Plus 是否截断该数据项的 显示。取值为 O F F 时表示截断,取值为 O N 表示超出部分折叠到 下一行显示

63

Oracle 1 1 g 中文版数据库管理 、应用与开发标准 教程 例如,下面设置显 示当前系统时间的 SQL*Plus命令提示 符。通 过 S E T 命令设置的 环境变量是临时的 ,当用户退出SQL *Plus后 ,用户设置的参数 将全部丢失。 SQL> set time on 18:22:07 SQL>

r

4 . 1 . 2 设置运行环境 示例 本节将通过几个示 例介绍如何设置运 行环境以及设置后 的效果。这些设置 都是在平

常操作中使用频率 较高的运行环境。 1. PAUSE 选项 如 果 在 SQL*Plus中运行的 查询语句可以返回 多行数据,以至于 无法在SQL*Plus窗 口中一次显示完,这 时 SQ L *Plus输出窗口会快 速滚动显示。这样 就需要在窗体上进 行 一次缓存,以存储 滚动到屏幕以外的 数据,以便一页一 页地查看查询结果 。 这可以通过设置环 境变量PAUSE为 O N 来 控 制 SQL*Plus在显示完一页后暂停显示, 直到按回车键后才 继续显示下一页数 据。当 设置PAUSE命 令 为 O N 时,需要注意一点 , 当提交查询的时候 ,SQL*Plus会在显 示第一页之前就暂 停显示。只有按回车 键后第一页

64

的内容才会显示。PAUSE选项还可以 设置暂停后显示的 字符串,以便提示 用户。例如, 使用下面的命令可 以设置在暂停后显 示“按回车键继续”字 符串。 SQL> set pause on SQL> set p a u s e , 按回车键继续, SQL> select empno z ename r job,hiredate, sal 2 from emp

接回车键继续 EMPNO

ENAME

JOB

HIREDATE

SAL

7369

SMITH

CLERK

17-12 月-80

800

7499

ALLEN

SALESMAN

20-2 月 -81

1600

7521

WARD

SALESMAN

22-2 月 -81

1250

7566

JONES

MANAGER

02-4 月 -81

2975

7654

MARTIN

SALESMAN

2 8 - 9 月 -81

1250

7698

BLAKE

MANAGER

01-5 月 -81

2850 2450

7782

CLARK

MANAGER

0 9 - 6 月 -81

7788

SCOTT

ANALYST

19-4 月 - 87

3000

7839

KING

17-11 月 -81

5000

08-9 月 -81

1500

23-5 月 -87

1100

7844

TURNER

PRESIDENT SALESMAN

7876

ADAMS

CLERK

按回车键继续

当不再需要暂停时 ,可以关 闭 PAUSE命令。关 闭 PAUSE命令的形式 如下: SQL> set pause off

2. PAGESIZE 和 NEWPAGE 选项 当执行有返回结果 的查询语句时,SQ L*Plus首先会显示用户所选择数据的 列标题, 然后在相应的列标 题下显示数据,列 标题之间的空间就 是SQL*Plus的一页 。

第 4

章.

SQL*Plus 命令 那 么 SQ L*Plus的一页有多大呢?使 用 命 令 SHOW PAGESIZE可 以 显 示 SQL*Plus 默 认 的一页的大小。可 以 通 过 使 用 PA G ESIZE命令来 改 变 这 个 默 认 值 。例 如 ,设置 PAGESIZE为 3 0 后 查 询 SCOTT.EMP表 ,结果如下: SQL> show pagesize pagesize 14 SQL> set pagesize 30 SQL> select empno z ename z sal 2

from s c ott.emp; EMPNO

ENAME

7369

SMITH

7934

MILLER

SAL 800 1300

已选择1 4 行。

当 PAGESIZE被 设 置 为 3 0 后 ,SQL*Plus在一页内显示了 1 4 行数据。

一页的内容不仅包含查询的数据结果,它还包括列标题、空行和列标题与数据行间的分 隔线。

一页中空行的数量可以通过设置NEWPAGE选项设置,默 认 NEWPAGE选 项 值 为 1, 即标题前有1 行空行。可以通过如下的命令设置标题与数据之间的空行: SQL> show newpage newpage 1 SQL> set newpage 3 SQL> select empno,ename z sal 2 from emp;

EMPNO

ENAME

SAL

7369

SMITH

800

7934

MILLER

1300

已选择14行。

3. LINESIZE 选项 通 过 设 置 LINESIZE选项,可以修改系统默认的每行打印8 0 个字符。当 SQL*Plus 输 出 LINESIZE指定数量的字符后,随后的数据就会折叠到下一行显示,如果用户窗口 特别宽,那么用户就可以设置更宽的L IN E S IZ E ,以避免折叠显示。 SQL> show linesize linesize 80

65

Oracle 11g中文版数据库管理、应用与开发标准教程 SQL> set linesize 100 linesize 100

使 用 与 SQL*Plus窗口的宽度相匹配的L IN E S IZ E ,就不会因为输出的数据超过窗口 的限制而折叠显示。 4. NUMFORMAT 选项 当用户查询数据库中的数字值 时,SQL*Plus将使用默认的格式显

SQL> create table numsample (num number);

表已创建。

示 ,即 以 1 0 个字符的宽度显示数 字 。如果用户处理的字符数量超过

SQL> insert into numsample 2

1 0 个 ,那 么 用 户 可 以 使 用 NUMFORMAT 选项设置一个更大的值。

v a l u e s (1234567890);

已 创 建 1 行。 SQL> insert into numsample

为了 演 示 NUM FORM AT选项

2

的功能,下面创建一个简单的表。

v a l u e s (1234567890123);

已创建1 行。

在上面的示例中,添加的第一 SQL> select * from numsample;

行 数 据 由 10个数字组成, 而第二行 数 据 则 由 13个数字组成。当查询该 表 时 ,SQ L*Plus会将结果调整为

66

NUM

10个字符宽。如果数字数据的长度 超过了 10个字符,则 SQL*Plus会

1234567890 1.2346E+12

采用另一种形式显示数字。可以通 过 设 置 N U M FO R -M A T设置数字的显示格式,例如: SQL> set numformat 999,999,999,999,999,999.99 SQL> select * from numsample;

NUM

1,234,567,890.00 1,234,567,890,123.00

表 4-2列出了数字值的格式化掩码以及它们对查询结果中的数字数据的影响。 甥

表 4 - 2 格式掩码

字符

示例

说明

9

999

查询结果中数字替换格式中的掩码

0

999.00

格式中的掩码屏蔽掉查询结果中的数字

$

$999

在查询结果中的数字前添加美元前缀

S

S999

为数字显示符号类型,通常用于显示查询结果中的正负数字

PR

999PR

在尖括号中显示数字

D or .

99D99.99

在字符D 或 字 符 小 数 点 位 置 上 放 置 小 数 点

,

999,99

在字符位置上放置逗号

RN or m

RN

根据字符的大小写形式,以大写或者小写的形式显示罗马数字

第 4 SQL*Plus 命令 5. TIMING 选项 在 SQL*Plus中 运 行 SQ L 命令时,不 同 的 SQ L 命令消耗的系统时间是不同的。为了 查看命令所消耗的系统时间,可以 设 置 TIM ING选 项 为 O N ,这时每当执行完S Q L 命令, SQL*Plus就会显示该命令所消耗的系统时间。设置显示消耗的系统时间后,当 执 行 SQL 命令后,SQL*Plus将显示该命令的执行时间,例如: SQL> set timing on SQL> select empno z ename λ sal 2 from emp;

已用时间: 0 0 : 0 0 : 0 0 ,0 3



SQL*Phιs 命令 在 Oracle 11g系统中,SQL*Plus提供了许多可以定制该工具行为的命令。这些命令

包括:HELP、DESCRIBE. PROMPT, SPOOL和 SHW O等 。本节将介绍这些命令的使 用方法。

φ - 4.2.1

HELP 命 令 ->

67

SQL*Plus有许多命令,而且每个命令都有大量的选项,要记住每一个命令的所有选 项是很困难的。不 过 SQ L *Plus提供了内建的帮助系统,用户在需要的时候,随时可以 使 用 H E L P 命令查询相关的命令信息。但 是 SQ L*Plus的内建帮助系统只是提供了部分 命令信息,SQL*Plus帮助系统可以向用户提供下面一些信息。 □ 命令标题。 □ 命令作用描述的文件。 □ 命令的缩写形式。 □ 命令中使用的强制参数和可选参数。 H E L P命令的语法形式如下: help [topic]

在上面的语法中,TO PIC参数表示将要查询的命令名称。 使 用 HELP IN DEX命令,厕可以通过H E L P命 令 查 看 SQL*Plus命令清单。该命令 的执行结果如下: SQL> help index Enter Help [topic] for help ■ @ ∕ ACCEPT APPEND ARCHIVE LOG

COPY DEFINE DEL DESCRIBE DISCONNECT EDIT

PAUSE PRINT PROMPT QUIT RECOVER REMARK

SHUTDOWN SPOOL SQLPLUS START STARTUP STORE

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 ATTRIBUTE BREAK BTITLE CHANGE CLEAR COLUMN COMPUTE CONNECT

EXECUTE EXIT GET HELP HOST INPUT LIST PASSWORD

REPFOOTER REPHEADER RESERVED WORDS (SQL) RESERVED WORDS (PL/SQL) RUN SAVE SET SHOW

TIMING TTITLE UNDEFINE VARIABLE WHENEVER OSERROR WHENEVER SQLERROR XQUERY

SHUTDOW N 命令可以关闭数据库实例。使 用 HELP 命令可以查看 SHUTDOW N 命

令的使用方式。结果如下: SQL> help shutdown SHUTDOWN Shuts down a currently running Oracle Database instance, optionally closing and dismounting a database. SHUTDOWN [ABORT ∣IMMEDIATE ∣ NORMAL ∣ TRANSACTIONAL [LOCAL]]

如 果 希 望 查 看 S Q L 和 P L /S Q L 中使用的关键字,则 可 以 使 用 HELP RESERVE W O RDS 命令。该命令的形式如下: SQL> help reserve words

曼- 4 2 2

DESCRBE 命令

在 S Q L *P lu s 的许多命令中,用 户 使 用 最 频 繁 的 命 令 可 能 是 D E SC R IB E 命 令 。 DESCRIBE 命令可以返回对数据库中所存储的对象的描述。对于表、视图等对象而言, DESCRIBE 命令都可以列出其各个列的名称以及属性。除此之外,DESCRIBE 还会输出

过程、函数和程序包的规范。 DESCRIBE 命令的语法形式如下: describe object_name;

其中 ,DESCRIBE 可以缩写为 DESC, OBJECT_NAME 表示将要描述的对象名称。 DESCRIBE 命令不仅可以描述表、视图的结构,而且还可以描述 PL/SQ L 对象,如

过程、函数和程序包等都能通过该命令描述。 下面通过 DESCRIBE 命 令 查 看 SCOTT.EMP 表的结构。 SQL> desc scott.emp 名称 EMPNO ENAME JOB MGR HIREDATE SAL

是否为空?

类型

NOT NULL

NUMBER(4) VARCHAR2(10) VARCHAR2(9) NUMBER(4) DATE NUMBER(7.2)

SQL*Plus 命令 COMM DEPTNO

NUMBER(7,2) NUMBER(2)

PROMPT 命令

.-τ 4 2 3

使 用 PROM PT命令可以在 屏幕上输出一 行数据,这种输 出方式非常有 助于在脚本文 件中向用户传 递相应的信息 。 PROM PT命令的语法 形式如下: prompt prompt_text;

其中, PROMPT_TE XT表示用于指 定要在屏幕上 显示的提示消 息。 下面编写一个 查由当前用户 及其默认表空 间的语句,并且为用户提 示一些描述信 息。 可以将以下命 令存储在USE R_TABLESPA CE.SQL文件中 。 prompt prompt

, 显示当前用户及

其默认的表空间 ,

prompt select username z default_tablespace from user_users;

在 SQL*Plus中 使 用 @命 令 运 行 USER_TABLE SPACE.SQL文 件,运行结果 如下: SQL> @ f :\user_tablespace , 显示当前用户及

其默认的表空间 '

USERNAME

DEFAULT_TABLESPACE

SCOTT

USERS

使 用 SPOOL命令可 以把查询结果 保存到文件中 或者发送到打 印机中。SPO OL命令 的语法格式如 下: spool file_name

[create ] ∣ [replace]

∣ [append]

∣ off;

其中,FILE_ N AM E参数用于指定 脱机文件的名 称,默认的文 件扩展名为.L ST。如 果使用了 CREATE关键 字,那么表示 创建一个新的 脱机文件;如 果使 用REPLACE 关键 字 ,那么表示替 代已经存在的 脱机文件;如 果 使 用 APPEND关键 字,那么表示把脱机内 容附加到一个 已经存在的脱 机文件中。 、 在下面的示例 中,将 使 用 S P O O L 命 令 生 成 OUTPUT_FIL E.TXT文件,并将查询 SCOTT.EMP表 的内容保存到 该文件中,显 示如下: SQL> spool f :\output_fil e.txt SQL> select empno z ename z job z hiredate z sal 2 from scott.emp;

69

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程

EMPNO

ENAME

JOB

HIREDATE

SAL

7369

SMITH

CLERK

7-12 月-80

800

7934

MILLER

CLERK

23-1 月-82

1300

已选择 1 4 行。 SQL> spool off

SPOOL命令执行的结果为:从 SPOOL命令开始,一 直 到 SPOOL O F F 或 者 SPOOL O U T 命令之间的查询结果都将保存到文件中。

4.3)格式化查询结果 SQL*Plus提供了大量的命令用于格式化查询结果,使用这些命令可以对查询结果进 行格式化,以产生用户需要的报表。使用这些命令可以实现重新设置列的标题,重新定 义值的显示格式和显示宽度,为报表增加头标题和底标题,在报表中显示当前日期和页 号 , 为 报 表 添 加 新 的 统 计 数 据 等 。常 用 的 格 式 化 查 询 结 果 命 令 包 括 COLUMN、 COMPUTE、BREAK, BTΓΓLE 和 TΠTLE 等 。 需要注意的是,使用格式化命令时应该遵循下面的一些规则。 □ 格式 化 命 令 设 置 后 ,将一直 起 作 用 ,直到该会话结束或下一个格式化命令的 设置 。 □ 每一次报表结束时,应该重新设置SQL*Plus为默认值。 □

如 果 为 某 个 列 指 定 了 别 名 ,那 么 必 须 引 用 该 列 的 别 名 , 而 不 能 再 使 用 列 名 。

4.3.1

COLUMN 命令

通 过 使 用 COLUMN命令,可以对控制查询结果集中列的显示格式。COLUMN命令 的语法格式如下: column [column_name ] alias ∣ option ]

其中,COLUMN_NAME参数用于指定要控制的列的名称。A LIA S参数用于指定列 的别名。OPTION参数用于指定某个列的显示格式,OPTION选项的取值及意义如表4-3 所示。 鸵

表 4 -3 - OPTION选项的取值及意义

选项

说明

CLEAR

清除为该列设置的显示属性,使其使用默认的显示属性

COLOR

定义列的显示颜色

FORMAT

为列指定显示格式

HEADING

定义列的标题

JUSTIFY

调整列标题的对齐方式。默认情况是数字列为右对齐,其他列为左对齐。可 以设置的标题位置值为:LEFT 、CENTER 、RIGHT

4 .π⅛,

SQL*Plus 命令 续表 选项 NULL

说明 '

指定一个字符串,如果列的值为N U L L ,则由该字符串代替

PRINT/NOPRINT

显示列标题/隐藏列标题

ON ∣ OFF

控制显示属性的状态,O F F 表示定义的显示属性不起作用

WRAPPED

当字符串的长度超过显示宽度时,将字符串的超出部分折叠到下一行显示

WORD_WRAPPED

表示从一个完整的字符处折叠

TRUNCATED

TRUNCATED表示截断字符串尾部

如果在关键字COLUM N后面未指定任何参数,则 COLUM N命 令 将 显 示 SQL*Plus 环境中所有列的当前显示属性;如 果 在 CO LUM N后面只指定了列名,则显示指定列的 当前显示属性。 在 SQ L*Plus中 运 行 SELECT查询命令时,如果有返回结果,则结果会以行和列的 形式显示。对于查询结果集中的每一 列 ,SQL*Plus都 允 许 在 COLUM N命 令中使用FORMAT选项规定其显示样 式 。 例 如 , 在 S Q L * P lu s中 查 询

SQL> column sal format $999,999.00 SQL> select empno,ename λ sal 2 from scott.emp; EMPNO

ENAME

7369

SMITH

$800.00

7934

MILLER

$1,300.00

SAL

SCOTT.EMP表 中 的 S A L 歹∣ J , 要求以 货 币 符 号 “& ”开 头 ,并且以千分位 形式表示。则所使用的COLUM N命令 如下: 上面的示例在格式化数字时使用

已选择14行。

了格 式 掩 码 “ 999,999.00”,该格式掩码的作用就是告诉O racle使用该列的数字值代替掩 码 中 的 9 , 而 对 应 0 的数字 值则不予显示。例 如 ,如果 某 行 的 SA L 列的值为 2 5 0 0 .3 ,则使用该格式掩码

SQL> column job format a5 wrapped SQL> select empno z ename z job z sal 2? from emp; EMPNO

ENAME

JOB

SAL

7369 7499

SMITH ALLEN

CLERK SALES MAN

$800.00 $1,600.00

7934

MILLER

CLERK

$1,300.00

后显示的数字值就是 2,500.00o 除此之外,还可 以规定列在显示时所附带 的字符前缀。其他常用的数 字格式化掩码见表4-2。 对于字符型的列,其值 以左对齐的方式显示。如果

已选择14行。

字符串列值的长度超过了定义的显示长度,则会根据系统变量W R A P的值进行截断或折 叠在下一行显示。如果列标题的长度超过了定义的显示宽度,则对列标题进行截断。下 面的示例为查询的各列设置了显示宽度,当数值超过显示宽度时,超过部分折叠在下一 行显示。 在默认情况下,查询中的列标题是从数据库中选择的列的名称。通 过 CO LUM N命 令可以为列指定一个别名,为列指定别名时需要在COLUM N命令 中 使 用 HEADING选 项 。例如 ,使用下面的命令为查询的各列指定别名。

71

Oracle 1 1 g 中文版 数据库 管理、应用与 开发标 准教程 SQL> column empno h e a d i n g 工作编号 SQL> column ename heading 姓名 SQL> column sal heading 工资 SQL> select empno ,enam e sal z 2 from emp; 工作编号

姓名

工资

7369

SMITH

$800.00

7934

MILLER

$1,300.00

已选择14行。

如果用 户想要 查看某 列的显 示属性 ,可以 通过如 下命令 显示特

定列的 显示属 性。

SQL> column sal COLUMN sal ON HEADING '工资' FORMAT $999,999.00

用户可 以通过 O N 或 O F F 设置某 列的显 示属性 是否起 作用。 例如,下面的 示例通过 O F F 禁用了 列的显 示属性 ,然 后 使 用 O N 启用了 列的显 示属性 。下面 的示例 通过O F F 禁 用了列 的显示 属性。 SQL> column empno off SQL> select empno z ename,sal 2 from emp; EMPNO 7369 7499 7521 7566 7654 7698 7782 7788 7839

姓名 SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING

工资 $800.00 $1,600.00 $1,250.00 $2,975.00 $1,250.00 $2,850.00 $2,450.00 $3,000.00 $5,000.00

如果想 要取消 对列的 显示属 性的设 置,则 可 以 通 过 C L E A R 选项清 除设置 的显示 属 性 。例如 ,下面 的示例清除了 ENAM E列的 显示属 性。 SQL> column ename COLUMN ename ON HEADING , 姓 名 , SQL> column ename clear SQL> column ename SP2-004 6 : COLUMN 'ename , 未定义

第 4 SQL*Plus 命 令 ----------------

. T 4.3∙2

TTITLE 禾口BTITLE 命 令 -、

SQL*Plus的显示结果通常包括一个头 部标题、列标题、查询结果和一个底 部标题。 如果输出结果需要打印多个页,则每 个页都可以拥有自己的页标题和列标 题。每页可以 打印的数量由用户设置的页的大小决 定,用户设置系统参数NEWPAGE可以决 定头部标 题之前的空行数;PAGESIZE参数则 规定每页打印的行数;而每行可打印的 字符数则由 LINESIZE参数决定。 除此之外,用户还可以利用TTITLE 和 B TITLE命令设置打印时每页的顶部和 底部 标题。使 用 TTITLE命令的语法格式为: ttitle [ printspec [ text ∣ variable ] ...] ∣ [off ∣ on ]

其中,T E X T 选项用于设置头标题的文字,如果头 部包含多个字符,则必须用单引 号括起来;VARIABLE选项用于在标 题中打印相应的变量;O F F 选项用于禁止打印头部 标题,O N 选项则用于打印头部标题;PRINTSP EC用来设置格式化头部标题的子句。它 可以使用如下选项。 □

COL

指定在当前行的第几列打印头部标题 。



SKIP

跳到从下一行开始的第几行,默 认 值 为 1。



T A B 指定向前跳的列数。



L E F T 在当前行中左对齐打印数据。 在当前行中间打印数据。



CENTER



R I G H T 在当前行中右对齐打印数据。



B O L D 以黑体打印数据。



FORMAT

指定随后的数据项格式。如果对指定 的数据项没有合适的格式,则 根据系统变量NUMFORMAT系统参 数打印数字值。 数据项的显示格式见表4-2.

B TITLE的语法格式与TTITLE的语法 格式相同。如 果 在 TTITLE或 BTITLE命令后 没有任何参数,则显示当前的TTITL E或 B T IT L E的定义。 例如,下面的示例使用TTITLE和 BTITLE命令在查询结果中打印其描述 信息。 SQL> ttitle center '职工信息表' SQL> btitle left '2008∕03∕15, SQL> select empnoz enamef sal 2 from emp; 职工信息表

EMPNO 7369 7499 7521 7566 7654 7698 7782 7788

ENAME SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT

SAL $800.00 $1,600.00 $1,250.00 $2,975.00 $1,250.00 $2,850.00 $2,450.00 $3,000.00

73

Oracle 1 1 g 中文版数据库管理、应用与开发标准 教程 7839 2008/03/15

KING

$5,000.00

这些设置会一直起作用,直到本次会 话结束为止。如果希望在本次会话过 程中,随 时根据需要中止这种页面头部标题和 底部标题,那么可以使用如下命令关 闭页标题,使 得打印查询结果时不显示定义的标题 。 SQL> ttitle off SQL> btitle off

4名)缓存区 SQL*P1 U

S

可以在缓存区中存储用户最近执行的 命令。通过在缓存区中存储这些命

令 ,用户可以重新调用、编辑或运行那 些最近输入的SQ L 语句。编辑缓存区最常用的方 法是将缓存区中的内容传递到Wind ows记事本中进行编辑。 为 了 在 SQL*Plus中 利 用 Windows记事本作为用户的编辑器,可 以 使 用 DEFINE命 令执行如下操作: SQL> define _editor=notepad; SQL> define _editor DEFINE _EDITOR = "notepad"

(CHAR)

执行完上面的设置之后,用户就可以 使用E D IT 命令来执行编辑操作了,除了 EDIT 命令外,还 可 以 使 用 SAVE命令。使 用 SAVE命令可以把当前SQ L 缓存区中的内容保存 到指定的文件中。SAVE命令的语法 形式如下: save file_name [create ∣ replace ∣ append]

其中, FILE_NAME为文件名,如果用户没提供文件的扩展名,则默认扩展名为SQL, 保存的文件为一个S Q L 脚本文件,它 由 S Q L 语 句 或 PL/SQ L程序组成,它是一个可在 SQL*Plus中执行的文件。CREATE选 项用于指定如果文件不存在,则创建 一个文件,该 选 项 也 是 SAVE命令的默认选项。REPLACE选 项用于指定如果文件不存在,则创建 它; 否则,用 SQL*Plus缓冲区中的内容替覆盖文 件中的内容。A PPEN D 选项则把缓冲区中 的内容追加到文件的末尾。 例如,保存查询职工信息的SQ L 语 句 到 C:\EMPLOYEES.SQL文件中,使 用 的 SAVE 命令如下: SQL> select empno r ename z job,sal 2 from emp 3 where deptno=10; EMPNO

ENAME

JOB

SAL

7782 7839 7934

CLARK KING MILLER

MANAGER PRESIDENT CLERK

2450 5000 1300

SQL> save c :∖employees .sql 已 创 建 file c :∖employees.sql

第 4 -T⅛^

SQL*Plus 命 令 ----------------SAVE 命令默认的保存路径为 Oracle 系统安装的主目录。最 好 将 S Q L 文 件 与 Oracle

系统文件分开保存,所以应在文件名前加绝对路径。 由 于 SQL*Plus 缓冲区中只能存放 SQ L 命 令 ,所以可以使用这种方法把 SQ L 命令或 PL/SQL 块保存到指定的文件中去,而 要 保 存 SQL*Plus 命令及其运行结果到文件中,就

需要配合使用 INPUT 命令。 下 面 的 示 例 使 用 I N P U T 命 令 将 S Q L 语 句 和 其 运 行 结 果 一 同 保 存 到 文 件 C:\ EMPLOYEES.SQL 中,由于在 SAVE 命令中使用了 REPLACE 选项 ,所以新添加的内容

将替换原文件的内容。 SQL> clear buffer b u f f e r 已清除 SQL> input 1 select empno z ename,job z hiredate, sal 2 from emp 3 where sal>2000; EMPNO

ENAME

JOB

7566

JONES

7902

FORD

HIREDATE

SAL

MANAGER

02-4 月 -81

2975

ANALYST

03-12 月-81

3000

已选择6 行。 SQL> save c :∖employees.sql replace 已写入 file c :∖employees .sql

在上面的示例中,通 过 CLEAR BUFFER 命令清除了 SQL*Plus 缓存区中的内容。 使 用 SAVE 命令可以将缓存区中的内容保存到文件,如果要把一个命令文件的内容 放进缓冲区,就必须使用 G E T 命 令 。G E T 命令的语法形式如下: get file_name[.ext ] [ list ∣ nolist ]

其中 ,FILE_N A M E 为要检索的文件名,如果省略了文件的扩展名,则默认文件的 扩展名为 .SQL 。L IST 选项指定文件的内容加载到缓冲区时列出该文件的内容;NOLIST 选项则不显示文件内容。 执 行 G E T 命令时,将在默认的目录下检索指定文件,除非用户在文件名的前面指定 该文件的存放路径;如果找到该文件,则 把文件的内容加载到 SQ L *P lus 缓冲区中,并 显示该文件的内容。例如,下面的语句清除缓存区中的内容,并 通 过 G E T 命令将文件 C:\EMPLOYEES.SQL 中的内容加载到缓存区。 SQL> clear buffer b u f f e r 已清除 SQL> 1 2 3*

get c :∖employees.sql select empno z ename,job z hiredate f sal from emp where sal>2000

SQL> ∕

75

Oracle 1 1 g 中文版数据库管理、应用与开发 标准教程

EMPNO

ENAME

7566

JONES

7902

FORD

JOB MANAGER ANALYST

HIREDATE

SAL

02-4 月 -81

2975

03-12 月-81

3000

已选择6 行。

获取指定文件的内容后,就可对 缓冲区中的命令作进一步的编辑 。如果该命令只包 含 S Q L 命令,也可以使用运行命令"/”执行缓存区中的语句。

实验指导 1 . 使 用 COLUM N命令格式化显示列 SQL*Plus中的COLUMN命令是 使用频率最高的, 本练习将练习如何使用COLUM N 命令。 (1)改变默认的列标题。

76

SQL>select * from dept; DEPTNO

DNAME

LOC

10 ACCOUNTING NEW YORK SQL>col LOC heading location SQL>select * from dept; DEPTNO 10

DNAME ACCOUNTING

location NEW YORK

( 2 )改变列的显示长度。 SQL> col ename format a40 EMPNO ENAME JOB 7369

SMITH

CLERK

(3 )设置列标题的对齐方式,列的 对齐方式可以为:LEFT、CENTER> RIGHT0 SQL> col ename justify center

对 于 NUM BER型的列,列标题默认为右对 齐,其他类型的列标题默认为左 对齐。 ( 4 )控制某列的显示。 SQL> col job noprint

(5 )格 式 化 NUM BER类型列的显示。 SQL>column sal format ,990 SQL> ∕

(6 )显示列值时,如果列值为N U L L值 ,用 T E X T值 代 替 N U L L值 。

第 4 SQL*Plus 命令 SQL>col comm null text

( 7)设置一个列的回绕方式。 SQL> col coll wrapped SQL> col coll wrapped word_wrapped SQL> col coll word_wrapped

( 8)显示列当前的显示属性值。 SQL> column column_name

( 9)设置所有列的显示属性为默认值。 SQL> clear columns

思考与练习 一、填空题 1 . SQL*Plus中的HELP命令可以向用户提

2 . 如果要控制列的显示格式,那么可以使 用哪个命令? ( ) 供 的 帮 助 信 息 包 括 、命令作用描述的 A. SHOW B. DEFINE 文件、命令的缩写形式、 » C. SPOOL D. COLUMN 3 . 如果要设置SQL*Plus每页打印的数量, 2 .使 用 命令可以在屏幕上输出 一行数据。这种输出方式有助于在脚本文件中向 则可以使用如下哪个命令? ( ) 用户传递相应的信息。 A. SET PAGE B. PAGESIZE 3 . 使用 命令可以将查询结果保 C. SIZE D. SET PAGESIZE 存在一个文件中。 4 .使用哪两个命令可以在SQL语句中定义 4 .使用 命令可以设置头部标题, 变量? ( ) 使用 命令可以设置底部标题。 A. DEFINE 和 ACCEPT 5 . 在 SQ L *P lus工 具 中 , 可 以 使 用 B. DEFINE和& 符号 C. ACCEPT和& 符号 、 命令来调用脚本文件。 6 . 通过使用 命令,可以对控制 D. DEFINE ⅛ DECLARE 查询结果集中列的显示格式。 三、简答题 1 . 如何使用SQP*Plus帮助命令获知某命令 二、选择题 1 . 使用DESCRIBE命令显示某个表的信息 时,不会显示哪类信息? ( ) A . 列名称 B . 列的空值特性 C . 表名称 D . 列的长度

的解释信息? 2 . 如何设置SQL*Plus的运行环境? 3 . 如何为SQL*Plus设置缓存区?

77

第 5 章 SQL语句基础 在 O racle数据库中,为了方便管 理用户所创建的数据库对象, 引入了模式的概念, 这样用户所创建的数据库对 象就都属于该用户模式。对于 一般的用户而言,数据库中的 数据是以表、视图等方式存 储的(表和视图就是最基本的用户 模式对象),用户只需要根 据自己的需求查询数据库,然 后由数据库根据请求执行相 关的处理,并且将处理结果返 回给特定的用户。另外,用户 还可以向数据库添加数据、删 除特定数据。在 O racle中, 对这些用户模式对象的操作 都是通过SQ L 语句来完成的。此外,Oracl e通过事务管理用 户对数据库所做的操作,用户 可以通过相关的事务处理控 制SQ L 语句对数据库的操作。 本章将首先介绍Oracle 11g所附带的用户模式,这也 是本书示例的基础。然后通过 SELECT语句查询其中的数据 ,并进一步通过INSERT、UPDATE, DELETE语句进行操 作 。最后介绍如何通过O racle提供的事务处理来控制 SQ L 语句对数据库的操作。 本章学习要点:

.

>

O racle示例中的用户模式

A

正规表达式的使用

>

使 用 SELECT语句检索数据

A

分组查询

>

检索多个表中的数据

>

插入、更新和删除数据

>

O racle中各种函数的使用

>

控 制 O racle中的事务处理

用户模式

为了更好地理解O racle的各种具体操作,下 面 介 绍 O racle自带的示例模式(也称示 。这些模式在安装数据库时由用 户选择安装,所有这些模式一起形成了相同 的虚 例方案) 拟公司的一部分,它们都有自 己的侧重点。

φ - 5.1.1

SCOTT 模式

Oracle所提供的SCOTT模式 可以提供一些示例表和数据 来展 示数据库的一些特性。它是 一个 非常简单的模式,如 图 5 -1 所示。 该模式演示了一个很简单的 公 司 人 力 资 源 管 理 , 它也是 O ra c le 早期版本中最经常使用的 示例模式,该用户模式的连 接密

SALGRADE

BONUS ENAME JOB SAL COMM

VARCHAR2 VARCHAR2 NUMBER NUMBER

DEPT DEPTNO DNAME LOC

NOT NULL NUMBER VARCHAR2 VARCHAR2

κ

码 为 TIGER。通 过 连 接 到 SCOTT 用 户 模 式 ,查 询 数 据 字 典 视 图 USER_TABLES可以获知该 模式 所包含的表。例 如 ,下面的语句

图 5-1

NUMBER NUMBER NUMBER

GRADE LOSAL HISAL

SCO TT模式结构图

EMP EMPNO NOT NULL NUMBER ENAME VARCHAR2 VARCHAR2 JOB MGR NUMBER HIREDATE DATE NUMBER SAL COMM NUMBER NUMBER DEPTNO

第 5 S Q L 语句基础 显示了 SCOTT模式拥有的上述 4 个表。 SQL> connect scott/tiger 已连接。 SQL> select table_name from user_tables; TABLE_NAME SALGRADE BONUS EMP DEPT

r - 5.1.2

HR 模 式 「

H R 模式 类 似 于 SCOTT模式,也是一个基本的关系数据库 的示例模式,其中有部门 和员工数据表。在 H R 模 式 中 有 7 个表:雇员、部门、地点、国家、地区、工 作和工作 历史,如 图 5 -2 所示。

79

图 5-2

H R 模式结构图

在 H R 模式中,对人力资源的记录更为详尽。对于每个雇员,H R 都存储了唯一的雇 员编号、姓名、电子邮件、 电话号码、雇佣日期、工作、薪金、佣金、经理编号以及部 门编号。DEPARTMENTS使 用 唯 一 的 部 门 号 I D , 部门名称、经理以及地点描述了各个 部门。部门位置包括了国家和地区,并分别 使用了两个单独的表描述这部分的细节。HR 通 过 表 JO B S和 JOB HISTORY记录职工的工作情况。 除了简单地存储这些信息外,H R 还规定了一系列业务规则, 以防止用户在执行 INSERT, UPDATE或 DELETE操作时执行一些违反业务逻辑的 操作。 默认情况下,H R 模式已经被锁定,这就需要对该用户模式 解锁。对用户模式解锁 的具体步骤如下。 ( 1 ) 以 SYSTEM身份连接到数据库。 SQL> connect system/password 已连接。

Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程 ( 2 ) 解锁用户账号 ,并修改其登 录密码。 SQL> alter user hr account unlock; 用户已更改。 SQL> alter user hr identified by hr; 用户已更改。

(3 ) 连 接 到 H R 模式并查看该 模式所包含的 表。 SQL> connec hr/hr 已连接。 SQL> select table_name from user_tables; TABLE_NAME EMPLOYEES JOBS JOB_HISTORY COUNTRIES DEPARTMENTS LOCATIONS REGIONS 已选择7 行 。

f

5 .1 .3 其 他 模 式 :

除了上面介绍 的两种常用模 式外,O racle附带的示 例方案还包括 订单目录(O E ) 模 式 、产 品 媒 体 ( P M ) 模式、信 息 交 换 (I X ) 模 式 和 销 售 记 录 ( S H ) 模式等。 1. O E 模式 订 单 目 录 O E 模式是一个稍 微复杂的模式 ,它 具 有 到 H R 模式的连接。O E 模式建立 在完全的关系 型人力资源H R 模式上,该模 式具有某些对 象关系和面向 对象的特性。该 模式新增加了 客户、产品和 订单数据表,它所 包 含的 7 张表包括客户 、产品说明、产品 信息、订单项 目、订单、库 存和仓库。 2.

P M 模式

产 品 媒 体 P M 模 式 主 要 用 于 演 示 存 储 多 媒 体 数 据 类 型 。P M 模 式 包 含 2 张表 ONLINE_MED IA 和 PRINT MEDIA, 1 种对象类型 ADHEADER _TYP,以及 1 张嵌套表 TEXTDOC_TY Po P M 模 式 包 含 INTERMEDIA 和 L O B 列类型。需要 注意的是,如果要 使用 INTERMEDIA T E X T ,则必须创建 INTERMEDIA TEXT 索弓I。 3. IX 模式 信 息 交 换 I X 模式被设计用 于演示O racle的高级排 队中进程间通 信的特性。实际上, 在 1 0 g 以前的版本中 ,该模式称为 排队组装服务 质量。 4.

S H 模式

销 售 记 录 S H 模式的结构不 是很复杂,但 是它比其他模 式包含更多的 数据行,以验 证 S Q L 分析函数、M ODEL语句等 。 S H 模式是关系星 型模式的一个 示例,它 包 含 1 个范围分区表 SALES和 5 个维表:

第 5 S Q L 语 句 基 础 -------------- TIMES> PROMOTIONS> CHANNELS 、PRODUCTS 和 CUSTOMERS = 连接至!1 CUSTO­ MERS 的附 加 COUNTRIES 表显示一个简单雪花。 5 . Q S 模式

发 运 队 列 Q S 模式实际上是包含消息队列的多个模式。

SELECT 语句的用法 用户对表或视图的操作都是通过 SQ L 语句来实现的,SQ L 语句是一种标准的结构化 查询语言。在 众 多 的 SQ L 语句中,使用频率最高的是 SELECT 语句,该语句主用于检索 数据。虽然在前面已经使用了一些 SELECT 语句,但是这些使用是零散的、不完整的。 因此,这 里 将 对 SELECT 语句进行系统地、完整地介绍。

-、 . τ 5 2 1 检索单表数据, V _________________ ______________ ______________ √

检索单表数据是指从单个表中检索数据,检索的结果都来自于同一个表,检索单表 数据是检索数据最基础的操作。 在检索数据的过程中,既可以检索所有的列,也可以检索部分列。在检索数据时, 数据将按照 SELECT 子句后面指定的列的顺序显示。如 果 使 用 星 号 “*”,则表示检索所 有的列,这时数据将按照定义表时指定的列的顺序显示。 在下面的示例中将检索 E M P 表中的所有列、指定列。 ( 1 ) 以 SCOTT/TIGER 身份连接到数据库。 SQL> connect scott/tiger 已连接。

( 2 ) 使 用 SELECT 语 句 检 索 E M P 表中的所有数据。在该检索中,使用星号代表所

有的列名称。 SQL> SQL> SQL> SQL> SQL> SQL>

column column column column column select

EMPNO — 7369

ename format a8 mgr format 9999 sal format $9999.9 comm format 9999.0 deptno format 99 * from emp;

ENAME





SMITH

JOB —

------

CLERK

MGR

HIREDATE

SAL

------

-----------

------

7902

17-12 月 -80

$800.0

COMM ------

DEPTNO ————

20

已选择14 行。

( 3 ) 使用 SELECT 语句检索列 EMPNO 、ENAME> JOB> SAL> DEPTNO 。注意,

在该检索中,检索列的顺序与列的定义顺序是不相同的。 SQL> select empno,ename z job z sal,deptno 2 from emp;

81

Oracle 11g中文版数据库 管理、应用与开 发标准教程 EMPNO —

ENAME —

JOB —

SAL ----

DEPTNO ------

7369

SMITH

CLERK

$800.0

20

7934

MILLER

CLERK

$1300.0

10

已选择1 4 行。

在 Oracle系统中,有 一个标识行中唯 一数据的行标识 符,行标识符的名 称为ROWID。 行 标 识 符 RO W ID是 O racle数据库内部 使用的数据,其 长 度 为 1 8 位字符,包含了该行数 据 在 Oracle数据库中 的物理地址。 虽然使用DESCR IBE命令无法查看 到ROW ID的存在, 但 是 可 以 在 S E L E C T 语句中检索该列 。 由于该列并不是 在表中定义的列 ,所以也称为 伪列。 例如,下面的语 句检索E M P表 中 ROWID、EM PNO和 EN AM E列数据。 SQL> select empno z ename z rowid 2 from emp; EMPNO

ENAME

ROWID

7369

SMITH

AAAQ+jAAEAAAAA eAAA

7934

MILLER

AAAQ+jAAEAAAAA eAAN

已选择1 4 行。

在 使 用 SELECT语句检 索表中的数据时 ,还可以执行加 、减 、乘 、除算术运算。另 外 ,在 SELECT语句中 不仅可以执行单 独的数学运算,还 可以执行单独的 日期运算以及 与列名关联的运 算。 在执行运算时,经常使用系统提 供的D U A L表 ,D U A L表的结构和数据 如下: SQL> desc dual

名称

是否为空?

DUMMY

类型 V A R C H A R 2 (1)

SQL> select * from dual 2



D X

D U A L 表 只 包 含 1 列 1 行数据,列 名 为 DUMMY (中文含义为哑巴 、样品等),数 据 类 型 为 VARCHAR2(1)0 1 行 数 据 为 X 。该表本身的结构 和数据并不重要 ,但是基于该 表可以执行一些 基于表的运算。 实际上为了使结 果更好理解,用 户常常会为这些 列指定别名。另 外,在定义表时 , 为了简单起见,列名常常是一些 缩写形式,阅读 这样的列名感觉 有些困难。因此 ,为各 列指定一个描述 性的别名,可以 使阅读检索结果 更加方便。

第 5 章 S Q L 语句基础 例如,下面的示例分别为E M P 表的各个列指定中文别名。 SQL> select ename as "姓名" ,job a s 职 位 " ,hiredate as "工作日期" ,sal as “工资” 2 from emp; 工资

工作日期

姓名

职位

SMITH

CLERK

17-12 月 -80

800

MILLER

CLERK

23-1 月 -82

1300

已选择14行 。

在为列指定别名时,关 键 字 A S 是可选的。例如,下面的语句就省略了关键字A S。 SQL> select ename 2 from emp;

”姓名" ,job

"职位”,hiredate

”工作日期“,sal

”工 资 ”

’在检索数据时,有时要将检索出来的数据合并起来以满足实际需求。例 如 ,在 HR 用户模式中,职工的姓名是分别存储在FIRST_NAME和 LAST_NAME列中的。如果要 以 “姓名”的完整方式显示这些数据,就 可 以 使 用 连 接 运 算 符 将 两 个 列 连 接 在 一 起 。 通常为提高这种连接运算的可读性,在连接两个列后为其指定一个别名。 例如,下 面 以 H R 身份连接到数据库,并查询其中的职工信息表。 SQL> connect hr/hr 已连接。 SQL> select first_name ∣I ' ' I∣ last_name "姓名",phone_number ”联系电话”, salary ”工资” 2 from employees; 姓名

联系电话

工资

Donald OConnell Douglas Grant

650.507.9833 650.507.9844

2600 2600

在执行字符连接运算时,应该根据需要在两个字符表达式之间插入一个分隔符,以 防止将这两个字符表达式完全连接在一起,影响检索结果的可读性。 在检索数据时,还有一点需要注意,表中的空值既不表示空字符串,也不表示数字 0 , 而是表示没有值,是一个未知值。只有在允许为空的列中才会出现空值。在 Oracle 11g 中,可以使用N V L ()函数为空值提供一个指定的显示值,N V L ()函数的使用方法如下: n v l (column_name,displayed_message)

其 中 , 如 果 COLUMN- N A M E 列 为 空 值 ,那 么 就 在 空 值 相 应 的 位 置 上 显 示 DISPLAYED_MESSAGE指定的字符,例如: SQL> connect scott∕tiger 已连接。 SQL> select ename,job,sal,nvl(comm,'0') 2 from emρ

83

Oracle 1 1g中文版数据库管理、应用与开发标准教程 3 where deptno=30; ENAME

JOB

ALLEN WARD MARTIN BLAKE TURNER JAMES

SALESMAN SALESMAN SALESMAN MANAGER SALESMAN CLERK

NVL(COMM,, 0 , )

SAL 1600 1250 1250 2850 1500 950

300 500 1400 0 0 0

已选择6行。

在 SELECT语句中,还可以使用关键字D IS T IN C T ,限制在检索结果中显示不重复 的数据。该关键字用在SELECT子句的列表前面。例 如,下面的语句使用DISTINCT关 键 字 检 索 E M P表中所有职工的职务种类。 SQL> select distinct job 2 from emp;

84

φ - 5 . 2 . 2 过滤数据3 在 SELECT语句中可以使用W HERE子句过滤数据,只检索满足过滤条件的数据。 当表中的数据非常大时,这种过滤操作是非常有意义 的。通过过滤数据,可以从大量的 数据中获取自己所需要的数据。 1 .比 较 运 算 符 在 W HERE子句中可以使用比较运算符实现过滤数据,这 样只有满足比较条件的数 据行才会被检索出来,不满足比较条件的数据行则不 会被检索出来。可 以 在 W HERE子 句中使用的比较运算符见表5-1 o 彩

表 5-1

比较运算符

τ 比较运算符 说明

比较运算符

说明 小于或等于

=

等于

不等于

>=

大于或等于




大于

ALL

使用清单中的所有值来比较

当使用字符串和日期数据进行比较时,应注意要符合 下面一些规则。 □ 字符串和日期必须使用单引号标识。 □ 字 符串数据是区分大小写的。 □ 日期数据的格式是敏感的,默认的日期格式是DD-M ON-YY。 下面的示例将练习如何使用比较运算符过滤数据。 ( 1 ) 以 SC O TT身份连接到数据库。 ( 2 ) 使 用 SELECT语句 检 索 E M P表 ,要求工作编号为7521。 SQL> select enamez job,hiredatez sal 2 from emρ

第 5 章. S Q L 语句基础 3

where empno=7521;

ENAME WARD

JOB SALESMAN

IRE DATE

SAL

22-2 月-81

1250

( 3 ) 使 用 SELECT语句 检 索 E M P 表 ,要求职位为CLERK、ANALYST中的任何一 个 ,这时可以使用A N Y 比较运算符。 SQL> select ename,job,hiredate, sal 2 from emp 3 where job=any('CLERK', 'ANALYST'); ENAME SMITH SCOTT ADAMS JAMES FORD MILLER

JOB

HIREDATE

CLERK ANALYST CLERK CLERK ANALYST CLERK

SAL

17-12 月-80 19-4 月 -87 23-5 月 -87 03-12 月-81 03-12 月-81 23-1月 -82

800 3000 1100 950 3000 1300

已选择6 行 。

85

2. S Q L 运算符 使 用 SQ L 运算符可以基于字符串的模式匹配、值的列表、值的范围和是否为空值等 情况来过滤数据。在 Oracle 11g中,可以使用的SQ L 运算 符 如 表 5 -2 所示 。 立

表 5-2 , SQL 运算符

运算符

说明

运算符

说明

LIKE

按照指定的模式匹配

IS NULL

与空值匹配

IN

匹配值的清单

IS NAN

与非数字值匹配

BETWEEN

匹配范围内的值

,

表 5 - 2 中 的 S Q L 运算符也可以与N O T 运算符取反处理,例如,NOT LIKE、NOT BETWEEN 和 IS NOT NULL 等 。如果 LIKE 为真,则 NOT LIKE 为假。 可 以 在 W H ER E子句中使用 L IK E 运算符指定将要匹配的字符串模式。在这种模式 中,下 划 线 代 表 任 意 一 个 字 符 ,百 分 号 “%”代表任意数量字符。例如,, A%, 表示 以字母A 开头的任意长度的字符串,D B 「表 示 3 个字符长且前两个字符是D B 的字符串。 下面的示例使用L IK E 运算符过滤薪据,要求显示职工姓名中第一个字符是S 的职 工信息。 SQL> select empno,ename,job,sal 2 from emp 3 where ename like , S % , ; EMPNO

ENAME

7369 7788

SMITH SCOTT

JOB CLERK ANALYST

SAL 800 3000

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 如果在模式中包含了实际的下划线或斜杠,则可以 使用ESCAPE关键字来指定该字 符是实际数据而不是匹配标记。 例如,下 面 的 示 例 添 加 了 一 行 包 含 下 划 线 的 数 据 ,为了显示新添加的数据,使 用 ESCAPE关键字指定了一个转义字符“\",这样转义字符后的下划线就不再表示匹配 标记。 SQL> insert into e m p (empnoz ename z job,mgr,sal) 2 values(8000,, atg_fn , , 'manager∖ 7 6 9 8 Λ 1 3 0 0 ) ; 已 创 建 1 行。 SQL> select empno,ename f job,sal 2 from emp 3 where ename like , %\_% , escape EMPNO 8000

86

, ∖, ;

ENAME

JOB

SAL

atg_fn

manager

1300

使 用 I N 运 算 符 可 以 检 索 在 指 定 列 表 中 的 数 据 , 例 如 , 过 滤 条 件 EMPNO IN(7369,7521,7789)表示检索工作编号是7369、752 1或 者 7 7 8 9 的职工信息。NOT I N 正 好 与 I N 相反,例 如 ,EMPNO NOT IN(7369,7521,7789)表示检索工作编号除7369、7521 和 7789之外的职工信息。但是,如 果 在 NOT I N 条件中包括了 N U L L 值 ,则总是返回一 个空值。 SQL> select empno,ename λ job,sal 2 from emp 3 where empno in (7369,7521,7789); EMPNO 7369 7521

ENAME

JOB

SAL

SMITH WARD

CLERK SALESMAN

800 1250

SQL> select empno,ename z job r sal 2 from emp 3 where empno not in ( 7 3 6 9 Λ 7521,7789,null); 未选定行

使 用 B E T W E E N 运算符可以在指定范围内搜索数据。例 如 ,如果希望检索工资为 1 0 0 0 到 2 0 0 0 之间的职工信息,那 么 可 以 使 用 B E T W E E N 运 算 符 。需要注意的是, BETWEEN运算符仅适用于可以指定范围的数字数 据。 例如,使 用 BETW EEN运算符检索指定工资范围内的职工信息。 SQL> select empno λ ename,job,sal 2 from emp 3 where sal between 1500 and 2000;

3 . 逻辑运算符 前面介绍的过滤条件都是单一的条件,如果要写出 复杂的过滤条件,那么必须使用

第 5 章S Q L 语句基础 逻辑运算符,以便把简单的条件组合起来。在 Oracle 11g系统中,可以使用的逻辑运算 符 如 表 5 -3 所 示 。 会 表 5-3 .逻辑运算符 运算符

说明

AND

与 ,当两个条件为真时,结果为真

OR

或 ,当两个条件中有一个为真时,结果为真

NOT

取反 ,当条件为真时,结果为假;当条件为假时,结果为真

实际上,BETW EEN运算符的条件可以写成使用A N D 逻辑运算符连接起来的两个 简 单 条 件 。例 如 ,条件 SAL BETWEEN 1500 AND 2000 等价于 SAL>=1500 AND SAL select empno,ename,job z sal 2 from emp 3 where sal>=1500 and sal 2 3 4

select empno z ename z job z sal from emp where job i n ('MANAGER'J SALESMAN , ) and deptno=20;

EMPNO 7566

ENAME

JOB

SAL

JONES

MANAGER

2975

.- 5 2 3 排 序 数 据 : 在前面介绍的数据检索技术中,只是把数据库中的数据直接取出来。这时,结果集 中数据的排列顺序是由数据的物理存储顺序所决定的。这种存储顺序是比较混乱的,并 且可能不符合用户的各种业务需求,因此需要对检索到的结果集进行排序。在 SELECT 语句中,可以 使 用 ORDER B Y 子句对检索的结果集进行排序。 添 加 ORDER B Y 子 句 后 SELECT语句的语法规则如下:

87

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 select column _list from table_name where condition order by order_expression [ASCI DESC],order_expression [ASCI DESC],…

其 中 ,ORDER_EXPRESSION表示将要排序的列名或由列组成的表达式;关键字 A S C 指定按照升序彝列,这也是默认的排列顺序;关 键 字 D E SC 指定按照降序排列。 在排序过程中,可以同时对多个列进行排序。如果是按照多个列进行排序,那么列 之间的顺序非常重要。在这种情况下,系统首先按照第一个列进行排序,如果第一个列 相同,则按照第二个列进行排序,以此类推。 下面的示例将使用ORDER B Y 子句对检索到的数据进行排序。 (1) 以 SCOTT身份连接到系统。 ( 2 ) 使 用 SEL EC T语 句 检 索 E M P 表中的信息,并且按照职工的工资S A L 和姓名 ENAM E进行升序排序。 SQL> select ename,job,sal 2 from emp 3 order by sal,ename; ENAME

JOB

SAL

SMITH

CLERK

800

KING

PRESIDENT

5000

已选择14行 o

( 3 ) 在 ORDER B Y 子句通过指定列的位置指定进行排序的列。 SQL> select ename z job,sal 2 from (smρ 3 where deptno=30 4 order by 3; ENAME

JOB

JAMES WARD MARTIN TURNER ALLEN BLAKE

CLERK SALESMAN SALESMAN SALESMAN SALESMAN MANAGER

SAL 950 1250 1250 1500 1600 2850

已 选 择 6 行。

注 意 ----------------------------------------------------”‘:

这里使用的位置是根据SELECT子句后面出现的列表达式的顺序确定的。

S Q L 语句基础

φ - ,i 5.2.4

多表检索

在实际应用中,经常会碰到需要检索的数据存在于两个或两个以上的表中的情况。 这时就需要使用 SELECT 语句执行多表检索。多表检索操作比单表检索复杂得多。为了 更好地理解多表检索操作,需要理解表的别名、笛卡尔积、 内连接、外连接、 自然连接 和交叉连接等概念。 1 . 表的别名 在多表查询时,如果多个表之间存在同名的列,则必须使用表名来限定列引用。例

如 ,在 SCOTT 模式中,E M P 表 和 DEPT 表中都存在 DEPTNO 歹U,在进行多表检索时就 是根据该列连接两个表。 然而,随着查询变得越来越复杂,语句会由于每次限定列时输入表名而变得冗长乏 味 。因此,SQ L 语言提供了另一种机制— —

表的别名。表的别名是在 SELECT 语句中为

表定义的临时性名称,以简化对表的引用。 下面的示例将使用表的别名来实现多表检索。 ( 1 ) 以 SCOTT 身份连接系统。 ( 2 ) 使 用 SELECT 语 句 检 索 E M P 和 D E P T 表 ,查询属于某一个部门的职工信息。

在该检索中,没有使用表的别名,因 此 在 W H E R E 子句中需要使用表的全称对列进行 限定。 SQL> select ename 姓名 ,job 职位 ,sal 工资 ,dname 部门 2 from emp,dept 3 where emp.deρtno=dept.deptno 4 and dept.dname= , SALES , ; 姓名 ALLEN WARD MARTIN BLAKE TURNER JAMES

职位 SALESMAN SALESMAN SALESMAN MANAGER SALESMAN CLERK

工资

部门

1600 1250 1250 2850 1500 950

SALES SALES SALES SALES SALES SALES

已选择6 行。

( 3 ) 使 用 SELECT 语 句 查 询 E M P 和 D E P T 表 ,同样查询属于某一个部门的职工信

息 。只 是 在 该 SELECT 语句中为每个表指定了别名,并通过表的别名引用表。E M P 表的 别 名 为 E , 而 D E P T 表的别名为 D 。为表定义别名后,在 SELECT 语句的任何地方都可、 以使用 E 和 D 引用相应的表。 SQL> select e .ename 姓 名 ,e.job 职位 ,e.sal 工 资 ,d.dname 部门 2 from emp e z dept d 3 where e .deptno=d.deptno 4 and d .dname= , SALES , ;

89

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 姓名

职位

ALLEN WARD MARTIN BLAKE TURNER JAMES

SALESMAN SALESMAN SALESMAN MANAGER SALESMAN CLERK

工资

部门

1600 1250 1250 2850 1500 950

SALES SALES SALES SALES SALES SALES

已选择6 行。

为更好地理解表别名的工作过程,在这里有必要介绍一下 SELECT 语句中各子句执 行的顺序。在 SELECT 语句的执行顺序中,FRO M 子句最先执行,而 SELECT 语句最后 执行。这样一旦在 FROM 子句中指定表别名后,当限定引用列时,其他所有子句都可以 使用表的别名。需要注意,一旦为表指定了别名,则必须在整个剩余语句中使用表的别 名 ,并且不允许再使用表原来的名称。否则,将 出 现 O RA-00904 错误。

在多表检索中,由于需要频繁地使用表名限定指定的列,因此表的别名应该尽可能简单。 大多数表的别名是由一个或两个字母组成,但 是 ,表的别名也应该具有描述性,以求与其他

90

表的别名明显地区分开。 .∙

×

2 . 内连接

内连接是指满足连接条件的连接操作,也就是通常所说的连接操作。也就是说,在 内连接的检索结果中,都是满足连接条件的数据。因此,内连接的检索结果是笛卡尔积 中满足连接条件的子集。 内连接的语法形式如下: select column_list from table_namel [inner] join table_name2 on join_condition;

其 中 ,C O L U M N JIS T 表示将要检索的列名列表,通常情况下,这些列名来自两个 不同的表。TABLE_NAME1 和 TABLE_NAME2 表示将要连接的表的名称。INNER JOIN 关键字表示内连接,其 中 IN N E R 关键字是可选的。ON JO IN _C O N D m O N 用于指定连 接的条件。 例如,下面的示例将通过内连接检索 E M P 表 和 DE PT 表 。 ( 1 ) 以 SCOTT 身份连接到系统。

(2 ) 使 用 SELECT 语 句 检 索 E M P 表 和 D E P T 表 。这两个表之间的连接是内连接, 其连接条件是两个表中的 DEPTNO 歹U。 SQL> select e .ename r e .job,e.sal,d.deptno z d.dname 2 from emp e join dept d 3 on e .deptno=d.deptno; ENAME CLARK

JOB MANAGER

SAL 2450

DEPTNO 10

DNAME ACCOUNTING

第 5 章 S Q L 语 句 基 础 ----------------

MARTIN

SALESMAN

1250

30

SALES

已选择14行。

( 3 ) 使 用 SELECT语 句 检 索 E M P 表 和 D E PT 表 。但是,不 使 用 INNER JO IN 表示 内连接,也不通过O N 指定连接条件,而 是 在 W HERE子句中指定连接条件。 SQL> select e .ename z e.job,e.sal z d.deρtno,d .dname 2 from emp e z dept d 3 where e .deptno=d.deρtno;

3 . 外连接 如果某个表中的数据不满足条件,而又要出现在检索结果中,那么可以使用外连接。 外连接的特点是某些不满足连接条件的数据也可以出现在检索结果中。 根据外连接检索结果中包含的数据,外连接可以分为左外连接、右外连接和全外连 接 。左外连接表示在结果中不仅包含了满足条件的数据,而且还包含了连接左边的左表。 在右外连接中,结果则包含了满足条件的数据和不满足条件的右表中的数据。如果左表 和右表中不满足连接条件的数据都出现在结果中,那么这种连接是全外连接。

91 在连接语句中,JO IN关键字左边的表称为左表,而右边的表称为右表。

外连接的语法和内连接的语法规则相似,区别在于外连接中用LEFT OUTER JOIN、 RIGHT OUTER JOIN 或 FULL OUTER JOIN 关键字,而不使用 INNER JOIN 关键字。其 中 OU TER是可选的。例如,左外连接可以使用LEFT JO IN 代 替 LEFT OUTER JOIN。 理解不同类型外连接之间的区别的最好方法是看各自的查询结果。下面的示例将演 示内连接以及各种外连接之间的区别。 ( 1 ) 以 SCO TT身份连接到系统。 ( 2 ) 使 用 SELECT语 句 检 索 E M P 表 和 D E PT 表 , 在这两个表之间执行左外连接。 由于E M P 表 位 于 LEFT JO IN 关键字的左边,所 以 E M P表中的所有数据都将显示出来。 SQL> insert into e m p (empnoz ename z job,sal) 2 values(8000z ,A T G , , 'CLERK, z 950); 已 创 建 1 行。 SQL> select e .ename z e .job,e.sal,d.deptno z d.dname 2 from emp e left join dept d 3 on e .deptno=d.deptno; ENAME

JOB

SAL

MILLER

CLERK

1300

10

ACCOUNTING

1600

30

SALES

ALLEN

SALESMAN

已选择15行。

DEPTNO

DNAME

Oracle 1 1g中文版数据库管理、应用与开发标准教程 从查询结果可以看出,左外连接的查询结果中不仅包括内连接的检索结果,还包括 新添加的数据,尽管该行在D E PT 表中没有匹配的行。由于新添加行在D E PT 表中没有 匹配的行,所 以 E M P表 中 的 DEPTNO和 DNAM E列 以 N U L L值表示。 ( 3 ) 使 用 SELECT语 句 检 索 E M P 表 和 D E P T 表,在这两个表之间执行右外连接。 由 于 D E P T 表 位 于 RIGHT J O IN 关键字的右边,所 以 D E P T 表中的所有数据都将显示 出来。 SQL> select e .ename,e.job,e.sal,d.deptno,d .dname 2 from emp e right join dept d 3 on e .deptno=d.deptno; ENAME

JOB

SAL

DEPTNO

DNAME

KING

PRESIDENT

5000

10

ACCOUNTING

WARD

SALESMAN

1250

30 40

SALES OPERATIONS

已选择15行。

( 4 ) 使 用 SELECT语 句 检 索 E M P表 和 D E PT表 ,在这两个表之间执行全外连接。 SQL> select e .ename λ e .job,e .sal,d .deptno,d .dname 2 from emp e full join dept d 3 on e .deptno=d.deptno; ENAME

JOB

SAL

ATG SMITH

CLERK CLERK

950 800

FORD MILLER

ANALYST CLERK

3000 1300

DEPTNO

DNAME

20

RESEARCH

20 10 40

RESEARCH ACCOUNTING OPERATIONS

已选择16行。

在外连接中,用户需要特别注意两个表的位置。

4 . 自然连接 与内连接的功能相似,在使用自然连接检索多个表时,O racle会将第一个表中的列 与第二个表中具有相同名称的列进行连接。在自然连接中,用户不需要明确指定进行连 接的列,系统会自动完成这一任务。 下 面 的 SELECT语句将使用自然连接连接E M P和 D E PT表 。 SQL> select empno z ename,job,sal z deptno,dname 2 from emp natural join dept

第 5 ,7X⅛ S Q L 语 句 基 础 ---------------3

where dname= , SALES , ;

EMPNO

ENAME

JOB







7900 7499 7698 7654 7844 7521

JAMES ALLEN BLAKE MARTIN TURNER WARD

SAL



CLERK SALESMAN MANAGER SALESMAN SALESMAN SALESMAN

950 1600 2850 1250 1500 1250

DEPTNO

DNAME



— 30 30 30 30 30 30

SALES SALES SALES SALES SALES SALES

已选择6 行。 自然连接的实际应用性较差,因为它需要连接的各个表之间必须具有相同名称的列。 这将会强制设计者将要连接的表设计为具有相同名称的列,并且不能够让表中的其他列 具有相同的名称。假 如 E M P 表 和 D E P T 表中都有一个表示地址的A D D R E S S 歹∣ J , 则在 进行自然连接时,Oracle会尝试使用D E P T 表 和 E M P 表 的 A D D R E S S 列进行连接。 5 . 交叉连接 交叉连接实际上就是指没有连接条件的连接。实际上,这种连接的结果就是笛卡 交叉连接的语法形式如下: select column_list from table_namel cross join table_name2;

在上面的语法中,CROSS JO I N 关键字表示执行交叉连接。使用交叉连接检索表时, 虽然会得到一个无实际用处的笛卡尔积。但是,可以通过使用W H E R E 子句,从笛卡尔 积中过滤需要的数据。 下面的示例将使用交叉连接检索E M P 表 和 D E P T 表 ,并 使 用 W H E R E 子句从中过 滤所需要的数据。 ( 1 ) 以 S C O T T 身份连接系统。 ( 2 ) 使 用 S E L E C T 语 句 检 索 E M P 表 和 D E P T 表 。由于这两个表之间的连接是交叉 连接,并且没有限定条件,所以查询结果是一个笛卡尔积。 SQL> select count(*) 2

from emρ e cross join dept d;

COUNT(*) 56

( 3 ) 使 用 W H E R E 子句在笛卡尔积中过滤掉不必要的数据。 SQL> select count(*) 2

from emp e cross join dept d

3

where e .deptno=d.deptno;

COUNT(*)

93

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程

14

从检索结果中可以看出,W HERE子句的作用是从笛卡尔积中筛选适合 条件的数据。 实际上,各种连接方式都是从笛卡尔积中 筛选数据。

函数的使用 与其他编程语言一样,S Q L 提供了许多内置函数,使用这些函数可以大 大提高计算 机语言的运算、判断功能。例如,使用字 符串函数对字符串进行处理、使用数学函 数进 行数值运算、使用转换函数对数据类型进 行转换、使用日期函数处理日期和时间等 。通 过这些函数,用户可以对表中的数据按照 自己的需要进行各种复杂的运算和操作。

. τ 5 3 1 字符函数-: 字符函数是指用于对字符表达式进行处理 的函数,它 也 是 O racle系统中广泛使用的 函数。在使用字符函数时,其输入值一般 是字符数据类型,而其输出结果则是经过处 理

94

的字符表达式。 在 O racle系统中,可以使用的字符函数如表5 -4 所示。实际上,这些字符函数在许 多编程语言中都可以使用。 表5 -4 , 字符函数 函数

说明

ASCII(string X)

返 回 字 符 X 的 A SC II值

CHR(X)

返 回 整 数 X 所 对 应 的 A SC II字符

CONCAT(X,Y)

连接字符串X 和 Y

INITCAP(X)

将 字 符 串 X 中的第一个字母变为大写,其余字母不变

INSTR(X,FIND_STRING

在 字 符 串 X 中 搜 索 FIN D _ST R IN G ,返 回 FIND_STRING出现

[,START][, OCCURRENCE])

的位置。可以有选择地提供开始搜索的位置START。还可以有 选 择 地 提 供 表 示 出 现 次 数 的 O C C U R R E N C E ,表 示 当 FIND_ STRIN G出 现 OCCURRENCE次时才返回

LENGTH(X)

返回字符串X 的长度

LOWER(X)

将 字 符 串 X 中的字符转换为小写字母

LPAD(X,WIDTH[,PAD_STRING])

使用空格补齐在字符串X 的右边,使 得 其 长 度 为 WIDTH。如 果提供了可选的PA D _ST R IN G ,那 么 使 用 PAD_STRING重复 补齐字符串X , 使得其长度为WIDTH

LTRIM(X[,TRIM_STRING])

删 除字符串X 左边的字符。可以使用可选择的TRIM_STRING 来指定将要被删除的字符,如果没有 提 供 T R IM _S T R IN G ,则 在默认情况下将删除左边的空格

NANVI(X,VALUE)

如 果 X 不是数字,那 么 返 回 VALUE;否 则 返 回 X

NVL(X,VALUE)

如 果 X 是空值,返 回 VALUE;否 则 返 回 X

NVL2(X, VALUE 1,VALUE2)

如 果 X 不是空值,则 返 回 VALUE1;否 则 返 回 VALUE2

UPPER(string)

将 字 符 串 string的全部字母转换为大写

第 5 S Q L 语 句 基 础 -------------- 续表 函数

说明

REPLACE(X,SEARCH_STRING,

在 字 符 串 X 中 搜 索 S E A R C H _ST R IN G ,如 果 找 到 则 使 用

REPLACE_STRING)

REPLACE STRING 替换

RPAD(X,WIDTH[,PAD_STRING])

使用指定的字符在字符串的右边填充,各 参 数 的 意 义 与 LPAD 相同 去 掉 字 符 串 X 中 右 边 TRIM—S T R IN G 指 定 的 字 符 ,类似于

RTRIM(X[,TRIM_STRING])

LTRIM SOUNDEX(X)

返回包含字符串X 的音标

SUBSTR(X,START[,LENGTH])

返回字符串X 的子串,开 始 位 置 是 S T A R T ,可 选 的 LENGTH

TRIM([TRIM_CHAR] FROM X)

删除字符串χ

参数表示子串的长度 中 左 右 两 端 的 一 些 字 符 ,如果提供了可选择

的 TRIM _CH A R,那 么将删除TRIM_CHAR字符串;否则删除 空格 把 字符串X 中的字母转换为大写字母

UPPER(X)

为了更好地理解这些字符函数,下面通过一些示例详细介绍字符函数的用法。 □

ASCII。和 CHRO 函数

ASCΠ()函数可以返回某个字符的A SCII码值;CHR()函数则与其相反,它返回给出 A SC II码值所应的字符。这两个函数在判断某个字符时会经常用到。 下面的示例演示ASCΠ()和 CHR()函数的使用。 SQL> s e l e c t a s c i i ( , A*) A Λ a s c i i ( , a , ) a , a s c i i ( , 0 , ) z e r o , a s c i i ( , 2 fro m d u a l ; A

A

ZERO

65

97

48

SQL> s e l e c t c h r ( 5 1 1 4 1 ) 桥 ,c h r ( 6 5 ) 2 fro m d u a l ; 桥

c



A

,

) space

SPACE 32 ch r6 5

如 果 在 ASCΠ()函数中包含了多个字符,则只返回第一个字符的A SCΠ 值 。 □

CONCATO 函数

CONCAΓ(X,Y)函数用于连接字符串X 和 Y 形成新的字符串 。这种连接是紧密连接, 两个字符串的连接之间没有空格等分隔字符。 下面的示例使用CONCATO函数将两个字符串连接起来。 SQL> s e l e c t c o n c a t ( ' 0 1 0 - , , , 6 8 6 2 6 2 3 4 ') 联系电话 2 fro m d u a l ; 联系电话 0 1 0 -6 8 6 2 6 2 3 4

Oracle 11g中文版数据库管理、应用与开发标准 教程 □ INITCAP。函数 INΓΓCAP(X)函 数 表 示 把 字 符 串 X 中的所有英文单词转换为首字母大写的 形式。不 过 ,该函数对汉字没有影响。 例如,下面的示例对字符串进行处理,将字符串的第一个字母变为大写。 SQL> select initcap(ename) name,sal 2 from emp 3 where deptno=10; NAME

SAL

Clark King Miller

2450 5000 1300

INSTR。函数



INSTR(X,F1ND_STRING[,START][,OCC URRENCE])函 数 在 字 符 串 X 中 搜 索 FIND_STRING字符,并返回其位置。如 果使用了可选参数START和 OCCURRENCE, 那 么 表 示 从 START位 置开始当第OCCURRENCE次 搜 索 到 FIND STRIN G字符串时才 返回其位置。 例如,下面的示例将搜索字符A 的位置。 SQL> select instr(,Oracle , , ,a , ) position 2 from dual; POSITION 3



LOWER。和 UPPER。函数

LOWER(X)和 UPPER(X)函数也是一对常用的函数,前 一个函数将字符串X 中的字 符全部转变成小写字母,后一个函数则相反,将 字 符 串 X 中的字符全部转变为大写字母。 例如,下面的语句分别使用LOWER。和 UPPER。函数将数据转换成小写字母和大写 字母。 SQL> select lower(,EMPLOYEES , )r upper(,Employees , ) 2 from dual; LOWER(,EM

UPPER(,EM

employees

EMPLOYEES



LTRIM0> RTRIM0和 TRIM。函数

LTRIM(), RTRIM()和 TRIM。函数都是用来删除指定字符串周 围的字符。LTRIM (X[,TRIM_STRING])函 数 用 于 删 除 字 符 串 X 左 边 的 字 符 ,如 果 使 用 了 可 选 的 TRIM_ S T R IN G 参 数 ,那 么 将 删 除 字 符 串 X 左 边 的 TRIM _STRING字符串;如果没有指定 TRIM_STRING参数,那么删除字符串 X 左边的空格。RTRIM()函数与此类似,只是方 向在右边。TRIM。函数则删除字符串两端的字符。

第 5 S Q L 语 句 基 础 ---------------例如,下面的语句分别使用LTRIMO、RTRIM()和 TRIM()函数处理字符串。 SQL> select ltr i m ( , ***Welcome*** t r i m (, * , f r o m

2 3

, z

,♦ ,

) z rtr i m ( , ***Welcome*** , , ,

, ),

, ***Welcome*** , )

from dual;

L T R I M ( , ***

R T R I M ( , ***

T R I M (, *

Welcome***

***Welcome

Welcome

∙ - 5 .3 .2 数 学 函 数 3 数学函数可以用于执行各种数据计 算。在其他编程语言中提供了大量 的数学函数, 这也是编程语言最早的功能之一。O racle系统也提供了大量的数学函数 ,这些函数大大 增强了 O racle系统的科学计算能力。 在 O racle系统中,几乎包括所有常用的 数学函数。O racle系统可用的数学函数如表 5 -5 所示。 黑

表 5 - 5 数学函数

97

函数

说明

ABS(X)

返 回 X 的绝对值

CEIL(X)

返回大于等于数值X 的最小整数

COSH(X)

返 回 数 值 X 的双曲余弦值

EXP(X)

返回 e 的 X 次 冥 (e=2.71828183∙∙∙)

FLOOR(X)

返回小于等于数值X 的最大整数

LN(X)

返 回 数 值 X 的 自 然 对 数 (X 必 须 大 于 0)

LOG(X,Y)

返 回 以 X 为底的数值Y 的 对 数 (X>l,Y>0)

MOD(X,Y)

返 回 X /Y 后的余数,若 Y = 0 , 则 返 回 X ( 求模运算)

POWER(X,Y)

返 回 X 的 Y 次冥

ROUND(X,[Y])

执行四舍五入运算,Y 可以省略,当 省 略 Y 时,四舍五入到整数位;当 X 为正数 时,四舍五入到小数点后Y 位 ;当 X 为负数时,四舍五入到小数点前Y 位

SIGN(X)

检测数值的正负,XV0则返回- 1 ;X > 0 则 返 回 1, X = 0 则 返 回 0

SQRT(X)

返 回 数 值 X 的平方根(X>=0)

TRUNC(X,[Y])

截 取 数 值 X, Y 可以省略,当 省 略 Y 时 则 截 取 X 的小数部分;当 Y 为正数时则将 X 截取到小数点后Y 位 ;当 X 为负数时则将X 截取到小数点前Y 位

在科学计算中,数学函数是一种非 常重要的工具。下面着重介绍一些 比较复杂、常 用的数学函数。 □ CEIL。函数 CE1L(X)函数可以得到大于或等于 X 的最小整数。该函数适用于一些比 较运算。使 用该函数时要特别注意正负数的问 题。 下面的示例使用CEIL()函数计算大 于6.6、6 和-6 .6 的最小整数。 SQL> select c e i l (6.6) r c e i l (6),ceil(-6.β)

from dual;

Oracle 1 1g中文版数据库管 理、应用与开发标 准教程 CEIL(β.6) 7

CEIL(β)

CEIL(-6.β)

6

-6

□ EXP。和 POWER。函数 EXP(X)函数用于计 算数字e 的 X 次幕,而 POWER(X,Y)函数 则用于计算X 的 Y 次 幕 。这两个函数的差 别在于底不相同。 例如,下面的示例 将演示EXP()和 POWER。函数的使用。 SQL> select e x p (1)z e x p (10) from dual; EXP(1)

EXP(10)

2.71828183

22026.4658

SQL> select power(2.71828z 10) from dual; POWER(2.71828,10) 22026.3176 C Q Q

□U> 问 X ∩

□ 甘日西妻6

在默认情况下, 日期数据的格式是 DD-MON-YY。其 中,D D 表示两位数字的日 , M ON表 示 3 位数字的月份,Y Y 表示两位数字的年 。 在插入数据时, 默认也采用DD-MONY Y 格式。 日 期 数 据 的 格 式 由 NLS_DATE_FORM AT系 统 参 数 来 设 置 ,该系统参数存储 在 INIT.ORA文 件 和 SPFILE.ORA文件 中。可 以 使 用 SHOW PARAMETERS命令 来查看这 些系统参数的值,另外还可以通过ALTER SYSTEM 或 ALTER SESSION命令修改 该系 统参数。ALTER SY ST E M 命令表示修改系统 参数的文件,这种 修改设置在以后的 数据 库操作中将一直起 作用;ALTER SESSIO N命令的设置只在当 前的会话中起作用 ,该会 话结束后,其设置 就会失效。 在 Oracle 1 1 g中,系统提供了许 多用于处理日期和 时间的函数,表 5 -6 描述了常用 的日期、时间函数 的类型和功能。 ”

表 5 -6

.时间和日期函数

函数 ADD_MONTHS(X,Y)

说明 在 X 给定的日期上增加Y 个 月 。如 果 Y 为负数,则 表 示 从 X 中 减 去 Y 个月

LAST_DAY(X)

返 回包含在X 月份中的最后一天

MONTHS_BETWEEN (X,Y)

返 回 X 和 Y 之间的月数

NEXT_DAY(X,DAY)

返回 紧接着X 的下一天,参 数 D A Y 是一个字符串

SYSDATE()

返回当前系统的日期

CURRENT_DATE()

返回本地时区的当前日 期

NEW_TIME(X ,TIME_ZONE1 , TIME_ZONE2)

将 时 区 TIME_ZONE1的 时 间 X 转变成时区TIM E_ZONE2的时间

LOCALTIMESTAMP()

返回会话中的日期和时 间

第 5 S Q L 语 句 基 础 -------------- 在 O racle系统中,MONTHS_BETWEEN()函数可以返回两个日期之间的月数,其结 果值即可以是正数,也可以是负数。如果第一个参数指定的日期晚于第二个参数指定的 日期,则结果值为负数,示例如下。 SQL> select months_between(date , 1981-11-26 , z sysdate) 2 from dual; MONTHS_BETWEEN(DATE , 1981-11-26'z SYSDATE) -316.76572

∙τ 5 3 4 转换函数: 操作表中的数据时,经常需要将某个数据从一种数据类型转变为另外一种数据类型。 这时就需要使用数据转换函数。例如,如果要把表示价格的数字数据转变为字符数据, 就需要使用TO_CHAR()函数。通常这类函数遵循如下惯例:函数名称后面跟着待转换类 型以及输出类型。 □

TO_CHAR0 函数

TO_CHAR()函数是最常使用的转换函数,该函数可以把指定的表达式转变成字符 串。TO_CHAR()函数的语法形式如下: TO_CHAR(X[,FORMAT])

在上面的语法中,参 数 X 表示将要转变的表达式;FORM AT参数用于指定X 表达 式的格式,可用的格式如表5 -7 所示。 克 ; 表 5-7 .FO RM AT格式参数 参数

说明

9

返回数字。如果数字是负数,则在数字前面包括负号

0

0999表示数字前面有0, 9990表示数字后面有0 表示小数点的位置 表示在指定位置显示逗号

$

$ 9 9 表示数字前面是货币符号

B

表示如果整数部分为0 , 则使用空格表示

C

在指定的位置使用IS O 标准货币符号

D

在指定的位置返回小数点的位置

EEEE

使用科学记数法

FM

删除数字的前后空格

G

在指定的位置显示分组符号

L

在指定的位置显示本地货币符号

MI

负数的尾部有负号,正数的尾部有空格

PR

负数的尾部有三角括号“ O ”,正数的头部和尾部有空格

RN/m

返回罗马数字,R N 表示大写罗马数字,m 表示小写罗马数字。数 字 必 是 1 到 3999之间的整数

S

S 9 9 9 表示负数的前面有负号,正数的前面有正号。9 9 9 S 表示负数 的后面有负号,正数的后面有正号

Oracle 11g中文版数据库管理、应用 与开发标准教程 续表 参数

说明

TM

使用最小的字符数返回数字

U

在指定位置返回双货币号

V

返回一个数字乘以1 0 ^ n ,移 动 指 定 位 (小数)

X

返 回 1 6 进制数字

HH 或 HH12

一 天 的 小 时 数 (0 1 ~ 1 2 )

HH24

一 天 的 小 时 数 (0 0 - 2 3 )

MI

分钟

SS

秒 (00〜 59)

MS

毫 秒 (0 0 0 -9 9 9 )

US

微 秒 (000000〜 999999)

AM 或 A .M .或 PM 或 P.M.

正 午 标 识 (大写)

am 或 a .m .或 pm 或 p.m

正 午 标 识 (小 写 )

YYYY

4 位年号

YY

年的后两位

BC 或 B .C .或 AD 或 A.D

纪 元 标 识 (大写 )

be 或 b . c . 或 ad 或 a.d

纪 元 标 识 (小写)

MONTH/month

大/小写表示的月份名

00〜 59) (

MM

01~12) 月份号(

DAY/day

大/小写全长日期名(空 白填充为9 字符)

函数将当前系统时间按指定格 式转变为字符串。 ) 例如,下面的示例使用TO_C HAR( sysdate z , HH12-MI-SS , ) 时间 from dual; SQL> select to_char ( 时间 04-50-02



TO_DATE0 函数

函数的语法格式如下: ) 该函数将字符串转化为O racle中的一个日期。TO_DATE( TO_DATE (c[z fmt])

注 意 这 里 的 FMT 其中,如果 参 数 F M T 不为空时,则按照F M T 指定的格式进行转换。 参数,如 果 F M T 为 J 则表示按照公元制转换,为 C 则必须为大于0 并 小 于 5373484的 正整数。 例如: 2454000, SQL> select to_date(

,J , }

from dual;

245400 TO_DATE( 21-9 月 -06 SQL> select to_date(, 2007-9-23 23:25:00 , z , yyyy-mm-dd hh24:mi:s s , ) 2 from dual;

第 5 S Q L 语 句 基 础 -------------- 星

TO DATE(t 2007-

□ TO—NUMBER0 函数 可 以 使 用 TO_NUMBER()函数把某个表达式转变成数字。表达式的格式可以使用可 选的格式描述。TO_NUMBER()函数的语法形式如下: TO NUMBER(c[,fmt])

例如,下面的示例使用TO_NUMBER()函数 实 现 将 16进 制 数 转 换 为 1 0 进制数。 SQL> select to_number(, 19f , , , xxx'),to_number(, f , z , xxx') 2 from dual; TO_NUMBER('19F' r ,XXX , )

TO_NUMBER(, F , , ,XXX , )

415

15

. -"53.5,「统计函数 , -) 101 使用统计函数可以针对一组数据进行计算,并得到相应的结果。O racle提供的统计 函 数 如 表 5 - 8 所示。使用这些统计函数,可以计算表中数据列的平均值、最大值和最小 值等数据。 雪

表 5 -8 ..统计函数

函数

说明

函数

说明

AVG(X)

平均值

MIN(X)

最小值

COUNT(X)

统计数量

STDDEV(X)

标准差

MAX(X)

最大值

SUM(X)

汇总值

MEDIAN(X)

中位数

VARIANCE(X)

方差

在实际的应用中,统计函数的应用范围是非常广泛的。下 面 通 过 MAX()和 MIN()函 数 查 找 E M P 表中员工的最高工资和最低工资。 SQL> select max(sal) z m i n (sal) 2 from emp; MAX(SAL) 5000

MIN(SAL) 800

上一节讲述的统计函数是针对整个表中的数据的,例如,计算所有员工的最高工资 和最低工资。如果要计算每个部门的员工工资或者统计不同职位的员工人数,那么就需 要对表中的数据进行分组。

Oracle 11g中文版数据库管理、应 用与开发标准教程 在 SELECT语句中,可 以 使 用 GROUP B Y 子句进行分组操作,并可以使用HAVING 子句提供分组条件。 下面的查询将对SCOTT模 式 中的 E M P 表进行分组,以统计各部 门的员工人数。 SQL> select deptno, count (*) as 员工数量 2 from emp 3 group by deptno; DEPTNO 30 20 10

员工数量

β 5 3

H A V IN G 子 句 通 常 与 GROUP B Y 子 句 一 起 使 用 , 以便在完成分组后可以使 用 HA VING子句对分组的结果进 行进一步筛选。如 果 不 使 用 GROUP B Y 子句,HAVING 子句的功能与W HERE子句一样,对整个表 进行筛选。 下面的查询将搜索出所有 员工数量大于等于5 的部门。

102

SQL> select deptno, count (*) as 员工数量 2 from emp 3 group by deρtno 4 having count (*)>=5; DEPTNO 30 20

员工数量

6 5

理 解 H A V IN G 子句的方法,就 是 记 住 S E L E C T 语句中的各子句的执行次 序。在 SELECT语句中,首 先 执 行 FR O M 子句找到表,而 W HER E子 句 则 在 FR O M 子句输出 的数据中进行筛选,HAVING子句贝!!在GROU P BY、W HERE或 FR O M 子句执行后对其 结果进行筛选。 下面的示例分别演示HAV ING和 W HERE子 句 对 SELECT语句的影响。 第一个检索 语 句 使 用 HAVING子句对分组的结 果进行筛选;第二个检索语句则使用W HERE子句对 表中的数据进行筛选后再 分组。具体如下: SQL> select job, avg (sal) ,max (sal) ,count (*) as 职工人数 2 from emp 3 group by job 4 having avg(sal)>1000; JOB CLERK SALESMAN PRESIDENT MANAGER ANALYST

AVG(SAL)

MAX(SAL)

职工人数

1037.5 1400 5000 2758.33333 3000

1300 1600 5000 2975 3000

4 4 1 3 2

S Q L 语句基础

SQL> select job f avg (sal) ,max (sal) r count (*) as 职工人数 2 3 4

from emρ where sal > 1000 group by job; AVG(SAL)

MAX (SAL)

职工人数

1400 1200 5000 2758.33333 3000

1600 1300 5000 2975 3000

4 2 1 3 2

JOB SALESMAN CLERK PRESIDENT MANAGER ANALYST

从查询结果可以看出,W H E R E 子句直接从表中筛选数据过滤掉了部分员工信息; 而 HAVING 子句则在分组后进行筛选。

子查询 在执行数据操作的过程中, 如果某个操作需要依赖于另外一个 SELECT 语句的结果, 那么可以把 SELECT 语句嵌入到该操作语句中,这就形成了一个子查询。实际上,在对 表中的数据进行操作时,数据并不是孤立的,而是互相关联的。这样就可以根据数据之 间的关联使用相应的子查询,从而实现复杂的查询。

r

- 5 . 4 , 1 子查询的概念 在 一 个 SELECT 语句被嵌套在另外一个 SELECT, UPDATE 或 DELETE 等 S Q L 语

句中时,被 嵌 套 的 SELECT 语句所执行的就是子查询。使用子查询的原因是,如果要执 行 某 S Q L 语句,但 是 该 S Q L 语句还需要依赖于另外一个 SELECT 语句的执行结果。 例如,当要检索某一部门的员工信息时,可以 连 接 查 询 E M P 表 和 D E P T 表 ;另外 一个方法是在检索 E M P 表时使用子查询检索 DEPT 表 。如下的语句演示了一个子查询。 SQL> select empno,ename z job,sal 2 from emp 3 where deptno=( 4 select deρtno from dept 5 6 where dn a m e = ,,S A L E S , ); EMPNO 7499 7521 7654 7698 7844 7900

已选择6 行。

ENAME ALLEN WARD MARTIN BLAKE TURNER JAMES

JOB

SAL

SALESMAN SALESMAN SALESMAN MANAGER SALESMAN CLERK

1600 1250 1250 2850 1500 950

103

--------------------- Oracle 1 1 g 中 文 版 数据库管理、应用与开发标准教程 从 这 里 可 以 看 出 ,相 比 连 接 多 个 表 的 查 询 ,子 查 询 的 使 用 更 加 灵 活 ,且 功 能 更 强 大 。 在 执 行 子 查 询 操 作 的 语 句 中 ,子 查 询 也 称 为 内 查 询 ,包含子查询的查询语句也被称为外 查 询 语 句 。例 如 在 上 面 的 示 例 中 ,如 下 的 语 句 为 内 查 询 : select deptno from dept where dn a m e = , S A LES ,

外查询语句为: select empno,ename z job,sal from emp

在 一 般 情 况 下 ,外 查 询 语 句 检 索 一 行 ,子 查 询 语 句 需 要 检 索 一 遍 数 据 ,然后判断外 查 询 语 句 的 条 件 是 否 满 足 。如 果 条 件 满 足 ,则外查询语句检索到的数据行就是结果集中 的行 ;如 果 条 件 不 满 足 ,则 外 查 询 语 句 继 续 检 索 下 一 行 数 据 。 在 多 数 情 况 下 ,子 查 询 可 以 使 用 连 接 查 询 来 代 替 。也 就 是 说 ,使用子查询完成的操 作 也 可 以 使 用 连 接 查 询 完 成 。实 际 上 ,连 接 查 询 的 效 率 也 远 高 于 子 查 询 的 效 率 ,但是子 查 询 更 容 易 理 解 ,使 用 更 灵 活 、方 便 。 在 使 用 子 查 询 执 行 操 作 时 ,应 该 遵 循 如 下 规 则 。 □ 子 查 询 必 须 使 用 括 号 括 起 来 ,否 则 无 法 判 断 子 查 询 语 句 的 开 始 和 结 束 。 □ 子 查 询 中 不 能 包 括 ORDER B Y 子 句 。 □ 子 查 询 允 许 嵌 套 多 层 ,但 是 最 多 嵌 套 2 5 5 层 。 子 查 询 可 以 分 为 4 种 类 型 ,即单行子查询、多 行 子查询、多 列 子 查 询 和 关 联 子 查 询 。 各种子查询的特点如下。 □ 单行子查询

子 查 询 语 句 只 返 回 单 行 单 列 的 结 果 ,即 返 回 一 个 常 量 值 。

□ 多行子查询

子 查 询 语 句 返 回 多 行 单 列 的 结 果 ,即返 回 一 系 列 值 。

□ 多列子查询

子查询语句返回多列的结果。

□ 关联子查询

子 查 询 语 句 引 用 外 查 询 语 句 中 的 一 个 列 或 多 个 列 。 即外查询和内

查询是相互关联的。 各 种 子 查 询 之 间 还 可 以 相 互 嵌 套 。在 O racle 系 统 中 ,子 查 询 的 嵌 套 层 数 可 以 达 到 255 层 ,但 是 真 正 嵌 套 2 5 5 层 的 子 查 询 是 很 少 的 。实 际 上 ,嵌 套 的 层 数 越 多 ,查询语句的执 行 效 率 也 就 越 差 ,因此应该尽量 降 低 子 查 询 的 嵌 套 层 数 。

r

- 5 . 4 . 2 单 行 子 查 询 -、 在 单 行 子 查 询 中 ,该 内 查 询 只 返 回 单 行 单 列 值 , 因此可以把这种子查询作为一个常

量 。在 W HERE 子 句 中 ,可 以 使 用 单 行 比 较 运 算 符 来 比 较 某 个 表 达 式 与 子 查 询 的 结 果 。 可 以 使 用 的 单 行 比 较 运 算 符 包 括 :等 于 “= " 、大 于 “> " 、大 于 或 等 于 “> = " 、小 于 “< ”、 小 于 或 等 于 “< = ”和不等于 例 如 ,下 面 的 语 句 在 子 查 询 中 使 用 统 计 函 数 ,从 E M P 表中得到工资最低和工资最 高的员工信息。 SQL> select empno z ename,job z sal 2 from emp

S Q L 语句基础 3 where sal>=(select max(sal) from emp) 4 or sal select empno,ename,job z sal 2 from emp 3 where deptno=(select deptno ∙ 4 from dept 5 where dname= ,MANAGER , ); 未选定行

在单行子查询中,常见的错误是在子查询中 返回了多行数据或者包含 了 ORDERBY 子句。如果在单行子查询 中返回了多行数据,那么 这个查询就会发生错误,系统无法正 确执行该操作。 在子查询中也不能包含O RDER B Y 子句,如果要对数据进行排序,那么只能在外查 询语句中使用ORDER B Y 子句。

φ--

5 .4 .3

多 行 子 查 询 -、

多行子查询可以返回单列 多行数据。在这种多行子 查询中,必须使用多行运 算符来 判断,而不能使用单行运算符。使用多行运算符可以执行 与一个或多个数据的比较 操作。 、ANY 在 O racle系统中,可以使用的多行比较运算 符包括:IN (等于列表中的任何一值) 。 行比较) (与子查询返回的任何一个 值进行比较)和 ALL (与子查询返回的所有值进 A N Y 运算符表示与子查询中的 任何一个值进行比较。这时,需要将单行比较运算符 与该运算符组合起来使用 。与单行比较运算符组合 之后,所 使 用 的 A N Y 运算符结果 如下。 □ < a n y 表示小于最大值。 □

= a n y 与 IN 运算符等价。



> a n y 表示大于最小值。

对 于 A L L 运算符而言,与单行比较 运算符组合之后的结果如 下。 □ < a l l 表示小于最小值。 > a l l 表示大于最大值。 下面的示例将练习使用A LL、A N Y 和 I N 运算符进行查询。



105

Oracle 11g中文版数据库管理、应 用与开发标准教程 ( 1 ) 以 SC O TT身份连接到数据库。 ( 2 ) 在子查询的比较条件中,使用>A N Y 运算符查询大于M ANAGER职位中最小薪 金的员工信息。 SQL> select empno f ename,job,sal 2 from emρ 3 where sal>any(select sal 4 from emp where job='MANAGER , ); EMPNO

ENAME

JOB

SAL

7839

KING

PRESIDENT

5000

7782

CLARK

MANAGER

2450

已选择 6 行。

( 3 ) 下 面 是 使 用 I N 运 算 符 的 多 行 子 查 询 ,用 于 查 询 属 于 A C C O U N TIN G 和 RESEARCH部门的员工信 息。

106

SQL> 2 3 4

select empno z ename f job,sal f deptno from emp where deptno in (select deptno from dept where dname= ,ACCOUNTING , or dname= ,RESEARCH , );

( 4 ) 下面是使用A L L 运算符的多行子查询,用 于查询薪金大于所有MAN AGER职 位的员工信息。 SQL> select empno,ename z job,sal 2 from emp where sal >all(select sal from emp where job = ,MANAGER , );

另外,在 使 用 IN、A L L 和 A N Y 等多行比较运算符时,还 可 以 使 用 N O T 运算符表 示取反。

在前面介绍的子查询中, 内查询和外查询是分开执 行的,即内查询的执行与外 查询 的执行是没有关系的,外 查询仅仅是使用内查询的 最终结果。如果在子查询 语句中, 内 查询的执行需要借助于外 查询,而外查询的执行又 离不开内查询的执行。这 时,内查询 和外查询是相互关联的,这种子查询称为关联子查 询。例如,在 内 层 被 嵌 套 的 SELECT 语句中包含了外层SELEC T语句中的员工代码。这类 子查询在某些情况下可能 会产生一 定的问题,因为内层子查 询返回的记录都是外层查 询所操作的候选对象,当 数据量较大 时,会导致查询效率低下 。 现在使用关联子查询检索 某个职位的员工薪金是否 超出了平均水平,所使用的 查询 语句如下: SQL> select ename,job,sal 2 from emp t 3 where sal>(select avg(sal)

S Q L 语句基础 4 5 6

from emp where t .job=job) order by job;

ENAME

JOB

SAL

FOX

CLERK

1100

TURNER

SALESMAN

1500

已选择6 行。

在上面的查询语句中,外层查询使用关联子查询计算每个职位的平均工资。而关联 子查询必须知道每个员工的职位,以便外层查询寻找该员工的工资是否高于所在部门的 平均值。如果薪金高于平均工资,则该员工的信息会显示出来。在执行语句的过程中, 必 须 遍 历 E M P表中的每条员工记录,因此如果E M P 中有许多记录,则该语句的执行速 度将会异常缓慢。

步操作数据 SQ L 语句除了可以查询数据外,还可以完成插入、更新和删除数据等操作。在 Oracle 1 1 g 中创建表后,只有在表中插入数据之后,该表才有意义。如果表中的数据不合适, 还可以对不合适的数据进行更新。如果某些数据已经不再需要,则可以删除这些数据。 在操作数据的过程中,O racle是通过事务来进行管理的。

. - - 5 . 5 . 1 插 入 数 据 萨) 插入数据就是将数据放置到已经创建的表中,O racle数据库是通过INSERT语句来 实现插入数据的。一般情况下,使 用 一 次 INSERT语句可以插入一行数据。 与 SELECT语句相比,INSERT语句的使用方式要简单得多。在 INSERT语句的使 用方式中,最常用的形式是在INSERT IN T O 子句中指定添加数据的列,并 在 VALUES 子句中为各个列提供一个值。 下面语句将向SCOTT模 式 中 的 E M P表添加一条记录。 SQL> insert into e m p (empno,ename r job z mgr r hiredate z sal z comm,deptno) 2 values(7995,,A T G , r , CLERK*,7782,to_date(, 2007-9-23 , , y yyyy-mm-dd , ), 1300 z null z 10); 已 创 建 1 行。

向表中所有列添加数据时,可 以 省 略 INSERT IN T O 子句后的列清单,使用这种方 法时,必须根据表中定义的列的顺序为所有的列提供数据,用户可以使用D E SC 命令查 看表中定义的列的顺序。下 面 的 INSERT语 句 在 向 E M P表添加记录时省略了列清单。 SQL> desc emp SQL> insert into emp 2 values(799βr , LI', ,CLERK , ,7782,to_date('2006-5-12 f , , yyyy-mm-dd , ),

107

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 1200,null,10);

已 创 建 1 行。

* :

使用这种方法插入数据时有一个大隐患,如果为表指定的数 值位置不对,并且指定的数

据类型之间可以转化,则执行该语句时系统不会返回任何错 误信息,但是这会为该表添加一 条错误的记录. 由于这种错误难以发现,所以在添加记录时最好在 INSERT IN T O 子句中指定 列清单,以明确接收数据的列。

在插入操作过程中,用户也可以根据实际情况只为部 分列提供数据,而省略某些列 的数据。注意这些被省略的列必须允许为空值、有默 认值或系统可以自动成生值等。例 如 ,在 E M P 表中,除 EM PN O列不允许为空值外,其他列都可以为空值。 如果某个列不允许N U L L值存在,而用户没有为该列提供数据,则会因为违 反相应 的约束而插入失败。事实上,在定义表的时候为了数 据的完整性,经常会为表添加许多 约束。例如,在 E M P表中为了保证表中每条记录的唯一性,在 表 的 EM PNO列上定义了 主键约束。如果用户试图为表的EM PN O列添加一个重复值,则将因为违反主键约束而 失败。 SQL> insert into e m p (empno,ename,job) 2 values(7782,,KING','CLERK , ); insert into e m p (empno r ename λ job) *

第 1 行出现错误: ORA-OOOOl: 违反唯一约束条件 (SCOTT. PK_EMP)

关于为表定义完整性约束的内容将在后面的章节中介 绍,这里需要记住的是在向表 添加记录时,添加的数据必须符合为表定义的所有完 整性约束。 IN SE R T语句还有一种用法,可以实现一次向表中添加一组 数据,即 使 用 SELECT 语 句 替 换 VALUES子句,这 样 由 SEL EC T语句提供添加的数值。例如,下面的示例从 E M P表提取属于某一部门的雇员信息保存到另外一个表 中。 SQL> create table accounting_employees( 2 empno number(4), 3 ename varchar2(10), 4 job varchar2(20)z 5 hiredate date, 6 sal number(βz 2));

表已创建。 SQL> 2 3 4

insert into accounting_employees select empno z ename,job,hiredate,sal from emp where deptno=10;

已创建 5 行。

从上面语句的执行结果可以看出,通 过 使 用 INSERT和 SELECT语句的组合一次性

第 5 S Q L 语句基础 为新创建的表添加了 5 行数据。



在 使 用 INSERT和 SELECT语句的组合成批添加数据时,INSERT IN T O 子句后所指定的

列 名 可 以 与 SELECT子句指定的列名不相同,但是其数据类型必须相匹配,即 SELECT语句 返回的数据必须满足表的约束。

φ -∙ 5 . 5 . 2 更新数据匕 如果表中的数据不合适,那么就需要对其进行修改或更新。在 S Q L 中,用户可以使 用 UPDATE语句完成数据的更新操作。 在更新数据时,既可以一次更新一列,也可以一次更新多列。如 果 在 UPDATE语句 中使用了 W H E R E 条件表达式,那么只有符合条件的记录才会被更新;如果没有使用 W HERE条件表达式,那么表示更新表中所有行的数据。 在更新表中的数据时,这些更新操作不能违反表的完整性约束。例如,在 E M P 表 中,主 键 列 EM PN O 的数据不允许重复,因此如果更新的数据与现存数据相同,则会因 为违反主键约束而失败。具体示例如下: SQL> update emp 2 set empno=7876 3 where ename= , CLARK , ; update emp 第 1 行出现错误: ORA-OOOOl: 违 反 唯 一 约 束 条 件 (SCOTT. PK_EMP)

因此,在使用没有条件表达式的更新操作时一定要谨慎.

φ - 5 . 5 . 3 删除数据 如果表中的数据不再需要,那么就可以将其删除。在删除表中的数据时,最常用的 SQ L 语 句 是 DELETE语句。 在删除操作中,既可以一次删除一行数据,也可以一次删除多行数据,还可以删除 表中的所有数据。在 DELETE语句中,如果没有使用W HERE条件表达式,那 么 将 会 删 \ 除表中的所有数据。例如,下面的语句将删除E M P表 中 的 ENAM E列 为 A T G 的记录行。 SQL> delete from emp 2 where ename= ,A T G , ; 已 删 除 1 行。

在 O racle系统中,除了 DELETE语句外,还可 以 使 用 TRUNCATE TABLE语句删

--------------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 除表中的所有数据。相比之下,使 用 TRUNCATE语句删除数据时,通 常 要 比 DELETE 语句快许多。这是因为使用TRUNCATE TABLE语句删除数据时,不会产生任何回退信 息 ,因 此执行TRUNCATE操作也不能撤销。例如,下面的 语句将删除ACCOUNTING. EMPLOYEES表中的所有记录。 SQL> truncate table accounting_employees; 表被截断。

在 使 用 TRUNCATE语句删除数据时,还可以使用关键字REUSE S T O R A G E ,表示 删除记录后仍然保存记录占用的空间;与此相反,也可以使用DROP STORAGE关键字, 表 示 删 除 记录后立即回收记录占用的空间,默 认 在 TRUNCATE T A B L E 语句中使用 DROP S T O R A G E 关 键 字 。使 用 关 键 字 REUSE ST O R A G E 保留删 除 记 录 的 空 间 的 TRUNCATE语句如下: SQL> truncate table accounting_employees reuse storage; 表被截断。

O racle 事务处理 110

在 O racle系统中使用INSERT、UPDATE和 DELETE语句操作数据时,数据库中的 数据并不会立即改变,用户还可以通过控制事务确 认是否提交先前的操作。

φ - 5.6.1

事务的基本概念

事务是数据库系统工作的一个逻辑单元,它由一个或多个SQ L 语句组成。对于数据 库而言,事务是不可分割的工作单元,一个事务中 的所有SQ L 语句要么全部执行,要么 全部不执行。也就是说,当事务被提交后,该事务 的操作才真正被保存到数据库中。如 果某个事务被回退了,那么该事务的所有操作都被 取消。事务的回退和提交可以由用户 显式执行,也可以隐式地执行。 一般情况下,用户或应用程序需要显式地执行C O M M IT 语句提交事务,但是用户 也可以不使用COM M IT语句而隐式地提交事务。例如,在事务的结尾处 使用D D L 语句 时,O racle默认为提交当前的事务,并且开始一个新的事 务。只有当事务被提交后,其 他用户才能够看到对数据库的修改结果。下 面 将 启 动 两 个 SQ L*Plus会 话 来 演 示 Oracle 的事务处理特性。 ( 1 ) 启 动 S Q L * P lu s,使 用 SC O TT身份连接到数据库,并 且 向 E M P 表添加一些数 据 ,具体如下: SQL> insert into e m p (empnof ename f job,sal) 2 values (8000r ' ⅛ J ≡ ∖ 'MANAGER 1 z , 2300 , );

已创建1 行。 (2 ) 在该会话中执行如下的查询时,用户可以在看到先 前插入的数据。 SQL> select empno z ename z job,sal

S Q L 语句基础 2 3

from emp where empno=8000;

EMPNO 8000

ENAME 刘丽

JOB

SAL

MANAGER

2300

( 3 ) 现 在 打 开 另 一 个 S Q L * P lu s,并 且 保 持 第 一 个 S Q L *Plus不 关 闭 。在第二个 SQL*Plus中执行相同SELECT语句以查看先前插入的数据。 SQL> select empno z ename,job,sal 2 from emp 3 where empno=8000; 未选定行

在这里可以发现,由于第一个会话没有提交事务,所以在第二个会话中看不到第一 个会话添加的数据。 ( 4 ) 在 第 一 个 SQL*Plus中 使 用 COMMIT语句提交事务。 SQL> commit; 提交完成。

( 5 ) 现在,如果用户再次在第二个SQ L*Plus中运行上面的SELECT语 句 ,就会看 到在第一个SQL*Plus中所提交的数据。

. - 5 6 2 事务控制 O ra c le 中的事务是隐式自动开始的,它不需要用户显式地使用语句开始事务处理。 当发生如下情况时,Oracle认为一个事务结束。 □ 执 行 COMMIT语句提交事务。 □ 执 行 ROLLBACK语句撤销事务。 □ 执 行 一 条 数 据 定 义 语 句 (例 如 CREATE、D R O P或 ALTER语句等)。如果该语 句执行成功,那么表示系统自动执行COMMIT命令;如果这种操作失败,那么 表示系统自动执行ROLLBACK命令。 □ 执行一个数据控制命令(例 如 GRANT, REVOKE等 ) , 这种操作表示自动执行 COMMIT 命令。 □ 断开数据库的连接。如 果 使 用 E X IT 命 令 正 常 退 出 S Q L * P lu s,则系统自动执 行 COMMIT命令;如 果 退 出 SQL*Plus出现异常,则系统自动执行ROLLBACK 命令。 下面主要介绍通过COM M IT和 ROLLBACK语句来控制事务。 1 . 提交事务 提交事务也就意味着该事务对数据库进行的全部操作将永久地记录在数据库中。在 使 用 COM MIT语句提交事务时,Oracle会执行如下操作。 □ 在回退段内记录事务已经提交,并且生成一个唯一的系统变改号(S C N ) , 以唯 一标识这个事务。

--------------------- Oracle 1 1 g 中文版数据库管理 、应用与开发标准 教程 □ □ □

启 动 LG W R后台进程,将 S G A 区的重做日志缓 存中的数据和该 事务的S C N 写 入联机重做日志 文件中。 Oracle服务器进程 释放事务处理所 使用的资源。 通知用户事务已 经成功提交。

需要注意,Oracle 提交事务的性能 不会因为事务所 包含的SQL语句过多而受到影响, 因 为 O racle采 用 了 一 种 称 为 “快 速 提 交 (Fast Commit) w 的机制。当用户提 交事务时, O racle并不会将与 该事务相关的“脏数据块”立即 写入数据文件,只是将相应的重做日 志信息保存到重 做日志文件,这样 即使发生错误丢 失了内存中的数 据,系统还可以根 据 重做日志文件中 的信息对其恢复 。因此,只要事务 的重做日志信息被 完全写入到联机重 做日志文件中, 即可以认为该事务 已经成功提交。 2 . 回退事务 回退一个事务也就 意味着在该事务中 对数据库进行的全 部操作将被取消,O racle利 用 回 退 段 (或 撤 销 表 空 间 )来 存 储 修 改 前 的 数 据 ,通过重做日志来 记录对数据所做的 修 改。如果要回退 整个事务,Orac le将会执行如下操 作。 使用回退段中的 数据撤销事务中 所有SQ L 语句对数据库所 做的修改。 O racle服务进程释 放事务所使用的 资源。



□ 通知用户事务回 退成功。

112

O racle不仅允许回 退整个未提交的 事务,还允许回退 事务的一部分,这是通过一种 称 为 “保存点”的机制 实现的。在事务的 执行过程中,用户 可以通过建立保存 点将一个 较长的事务分割 为几部分。这样用 户就可以有选择 性地回退到某个保 存点,该保存点之 后的操作都将被 取消。 下面的示例将向 SCOTT模式中的 EM P表添加两行记录 ,并且在执行第一 条INSERT 语句后建立一个 保存点,在 第 二 条 INSERT语句后查 询当前事务对数 据库所做的操作 。 随后回退事务到 保存点,以撤销 第二条INSERT语 句所执行的操作 。具体如下: SQL> insert into employees (employee_idf last_name z email, hire_date job_id) z 2 v a l u e s (1000, , a t g , r , saveθgmail.com *,t o _ d at e ( , 2000-11-25 , , yyyy-mm r - d d , ), , IT- P R O G , );

已 创 建 1 行。 SQL> savepoint s i ;

保存点已创建。 SQL> insert into employees(emplo yee_id z last_name,email ,hire_date job_id) r 2 v a l u e s (1001 z , p e r t y ∖ ,ρerΘgmail.com* z t o _ d a t e ( , 2001-05-20 , , yyyy-mm r - d d , ) λ , IT- PROG');

已 创 建 1 行。 SQL> select employee_id z last_name 2 from employees 3 4

where employee_id>90 0 order by employee_id desc;

第 5 S Q L 语 句 基 础 ---------------EMPLOYEE] D 1001 1000

LAS T_NAME perty atg

SQL> rollback to savepoint si;

回退已完成。 SQL> commit;

提交完成。 SQL> 2 3 4

select employee_id z last_name from employees where employee_id>900 order by employee_id desc;

EMPLOYEE] D 1000

LAST_NAME atg

5⑦ 实验指导 1 . 查 询 HR.EM PLOYEES表的信息 在 SQL*Plus环境下,执行如下的查询。 (1 ) 查 询 HR.EMPLOYEES表中每个雇员的所有记录。输入并执行如下SQ L 语句: select * from h r .employees;

查询结果应该包括客户信息的所有列,并且包括该表的所有记录行。 ( 2 ) 查 询 EMPLOYEES表中每个雇员的姓名、职位和工薪。 select first_name f last_name,job_id,salary from h r .employees;

( 3 ) 在 SELECT语句中使用连接查询DEPARTMENTS和 EMPLOYEES表 ,从中检 索属于某一部门的信息。 select t l .first_name z t l .last_name z t l .job_id, t l .salary, t2 .department— name from employees t l r departments t2 where t l .department_id=t2.department_id and t2 .department_name = , Sales , ;

(4 ) 使用子查询查询属于某一部门的员工信息。 select t l .f irst_name, t l .last_name z tl .job_id z t l .salary from employees tl where t l .department_id in(select department_id from departments where department_name = , S a l e s , );

( 5 ) 统计某一部门的雇员的最高和最低工薪。

113

Oracle 1 1 g 中文版数据库管理、应用 与开发标准教程 select t2.department_name r m a x (tl.salary) z min(tl.salary) from employees t l z departments t2 where t l .department_id=t2 .department_id group by t2.department_name;

2 . 维 护 HR.EMPLO丫E E S 表中的数据 在 SQL*Plus环境下,运行 如下的函数。 ( 1 ) 向 EMPLOYEES表添加一组 数据。输入并执行如下S Q L 语句: insert into employees(employee_id ,last_name z email,hire_date r job_id,salary) v a l u e s (300z , L I L I , r , liliΘgmail.com' r sysdate z , SH C L E R K , ,1250);

通 过 SELECT查询语句,查看 是否在EMPLOYEES表中 添加了相应的记录。 ( 2 )使 用 UPDATE语句更新该记录 的SALARY歹∣ J , 为部门编号5 0 的员工上调工薪 20%o 输入并执行如下S Q L 语句: update employees set salary=salary*l. 2 where department_id=50;

( 3 )删除上述记录。输入并 执行如下S Q L 语句: delete employees where employee_id=300;

( 4 )创 建 EMPLOYEES表的一个副 本,并向其中添加数据。 create table employees_copy as select * from employees;

( 5 ) 使 用 TRUNCATE语 句 清 除 EMPLOYEES_COPY表 中的数据。 truncate table create table employees_copy;

蓼思考与练习 一 、填空题

足连接条件的数据都出现在 结果中,那么这种连

1 . 在检索数据时,如果使用



号,则表示检索所有的列。 2

关键

关 键 字表示降序

排列。 3

. 如果定义与组有关的搜索条 件,可以把 子 句 添 加 到 SELECT语句中。

4

. 当 进 行 模 糊 查 询 时 ,应使用关键字 和通配符

5

或百分号“% ” 。

. W H ERE子 句 可以接收FR O M 子句输出

的 数 据 , 而 H A V IN G 子 句 则 可 以 接 收 来 自 、FR O M 或 6



。 函 数 返 回 某 个 字 符 的 ASCII

7 .

. 在 ORDER B Y 子句中,

字表示升序排列,



子句的输出。

. 在连接操作中,如果左表和右 表中不满

值 , 函 数 返 回 某 个 A SCII值对应的字符。 8 . 在 SELECT、UPDATE 或 DELETE 语句 中嵌套了一个或多个SELEC T语句时,被嵌套的 SELECT语











9 . 子查询语句必须使用 括起来, 否则无法判断子查询语句的 开始和结束。在子查 询语句中,不能使用

子句。

10 . 在单行子查询中,由于内查询 只返回单 行单列值,因此可以把其作为

来对待。

11 . 多 行 比 较 运 算 符 包 括 、 和 。

S Q L 语句基础 12 . 如果需要向表中插入一批已经存在的数 据,可以在 INSERT 语句中使用 语句。 13 . 如果要创建一个 U PD A TE 语句来修改 E M P 表中的数据,将所有员工的工薪上 调 10%, 则应该使用的 S Q L 语 句 是 。 二、选择题 1 . 下列哪个子句在 SELECT 语句中用于排 序结果集? ( ) B.

HAVING 子句 WHERE 子句

C.

FR O M 子句

D.

ORDER BY 子句

A.

2

. 为 了 去 除 结 果 集 中 重 复 的 行 ,可在

SELECT 语句使用下列哪个关键字? ( A. ALL B. DISTINCT C. SPOOL



A. AVG( *)

C. COUNT( *) D. MAX( *) . 当 COL_NAM E 取 达式 COL_NAME an y 表示大于最大值

D . 都不对

C . 限定返回的行的判断条件

14

15

) B. WHERE

C. HAVING

D. ORDER BY

7 . 下列哪个子句可以实现对一个结果集的 分组和汇总? ( ) B. ORDER BY

D. GROUP BY . 查 询 一 个 表 的 总 记 录 数 ,可以采用

B. UNION

C. SET

6 . 下列哪个子句是 SELECT 语句中的必选 A. FROM

. 下列哪一个是交集运算符? ( ) A. INTERSECT

D . 对结果集进行排序

C. WHERE

D. 2

A . 子查询只允许在SELECT 语句中使用

B . 组的筛选条件

8

B. 11

C. 8

的? (

D . 对结果集进行排序

A. HAVING

A. 12

值时,表

所有英文单词转换为首字母大写的形式?(



C . 限定返回的行的判断条件

项? (

D. 2

B . 子查询没有必要使用括号括起来

B . 组的筛选条件

HAVING 子句的作用是什么? ( A . 查询结果的分组条件

B. 11

C. 8

11 . 下面哪一个函数 表示把字符串 X 中的

C. UPDATE

5.

A. 12

10 . 当 COL_NAME 取 达式 COL_NAME>AN Y( 5,10,13) 为假。

B. WHERE

D. INSERT GROUP B Y 子句作用是什么? ( A . 查询结果的分组条件

值时,表

9

C. upper。函数

3 . 下列哪个关键字或子句用来限定查询结 果集中的行? ( )

4.

B. SUM( *)

A. initcap( ) 函数

D. HAVING

A. SELECT

__________统计函数。

D. MINUS . 下列哪一个是并操作运算符? ( ) A. INTERSECT B. UNION C. UNION ALL

D. MINUS

三、简答题 1 . SELECT 语句的基本作用是什么? 2

.比较内连接和外 连接。

3

. 简述正规表达式。

4

. 比较子查询和连接查询。

第6章

PL/ SQL 编程 基础

在实际情 况中,信 息的存储 和查询只 是数据库 系统应用 的一部分 ,即使是 最简单的 数据处理 程序也不 可能只使 用SQ L语句来 完成。例 如 ,在某公 司的工资 管理系统 中,需 要根据每 位员工职 位和工作 表现附加 一定的补 助。因此,在实际的 应用中, 仅 仅 使 用 SQL 语句是远 远不够的 ,这就是 为什么 O racle数 据库提供 了自己的 编程语言 PL∕SQL o 本章将介 绍一些P L/SQL程 序设计的 基础知识 ,包 括 PL/SQ L和 SQL、S QL*Plu s的 差异,P L/SQ L的基本 结构,各 种类型变 量的使用 ,流程控 制和PL /SQ L游标的 应用。最 后 介 绍 PL/SQL 程序的异 常处理机 制。 本章学习 要点: >

PL/SQ L和 S Q L 的区别 PL/SQ L程序的结构

A

>

在 PL/SQ L程序中 应用各种 变量

A PL/SQ L程序的 异常处理

>

在 PL/SQ L程序中 使用条件 语句

>

#

>

在 PL/SQ L程序中 使用循环 语句 游标的使用

PL/SQL 概述

由 于 S Q L 只是一种 声明式语 言,它没 有流程控 制,也不 存在变量 ,只有表 和列,所 以不能将 某个SQ L 语句的执 行结果传 递给另一 个语句。为了实现 该目的, 用户不得 不使 用一条更 复杂的语 句。而 且 S Q L 语句中没 有可以控 制程序流 程的I F 或 LO O P语句。 PL/SQL 是过程化 的结构查 询语言(Procedu ral Language/Structured Query Langua ge), 它 可 以 弥 补 S Q L 语句的不 足。在 PL /SQ L中可以 通过I F 和 L O O P语句控 制程序的 执行 流程,并 且可以定 义变量, 以便在语 句之间传 递数据信 息。PL /SQ L是 O ra c le的专用语 言 ,它 是 对 标 准 S Q L 语言的扩 展,并 且 S Q L 语句可 以嵌套 在PL/S Q L程序代 码中,将 S Q L 的数据处 理能力和 PL/SQ L的过程 处理能力 结合在一 起。 Oracle数据库内置了 PL/SQ L处理引 擎, 常用的开 发工具是 O racle附 带的SQL*Plus0 实际上,SQL*P lus只 是 用 于 将 S Q L 语 句 或 PL /SQ L程序发 送到数据 库,并将 处理后的 结果显示 在屏幕上 的工具,用户也可 以选择其 他工具运 算S Q L 和 PL/SQ L程序。 PL/SQ L程序的 基本结构 称为块,每一个块都包含了 PL/SQ L语 句 和 S Q L 语句。典 型 的 PL/SQ L块的结 构如下: [declare declareation_statements] begin executable_statements [exception exception_handing_statements] end;

P L /S Q L 程序块中 的每一条 语句都必 须以分号 结束,S Q L 语句可以 是多行的

,但分

P L /SQ L 编 程 基 础 ------------

号表示该语句的结束。一 行 中 可 以 有 多 条 S Q L 语句,但是它们之间必须以分号分隔。 PL/SQL 程序的注释由-表示。

从上面的语法规则中可以发现,一 个 PL/SQ L 程 序 块 分 为 3 部分:声明部分、执行 部分和异常处理部分。声明部分是可选的,它 由 关 键 字 DECLARE 开始,至!J B E G IN 关 键字结束。在这部分可以声明一些 PL /SQ L 变量、常量、游标和异常等。当基本块结束 后 ,声明部分的所有内容均不复存在。在某个基本块中声明的内容只能在该块中使用, 其他基本块不能使用。 执行部分以关键字 BEG IN 开始,可以以两种不同的方式结束。如果存在异常处理, 则 以 关 键 字 EXCEPTION 结束。如果没有使用异常处理,则 以 关 键 字 E N D 结束。在执 行部分包含多个 PL/SQL 语 句 和 SQ L 语句。 在 PL /SQ L 语句的执行过程中, 由于各种原因会产生一些错误,这些错误的发生会 导致程序被迫中断运行。这 样 PL/SQ L 程序开发人员就必须设法向用户发出一些有用的 出错信息,或者在错误发生后采取某些措施进行纠正并继续运行程序。另外,所有相关 数据库操作可能需要回退到异常产生之前的状态,这 就 需 要 在 PL /SQ L 程序中提供异常 处理能力。 P L /SQ L 的异常处理部分以关键字 EXCEPTION 开始,它的结束就是整个基本块的

结束。每个异常均由 W H EN 语句开头,接着就是这种异常出现时相应的处理动作。 为了更好地理解 PL/SQ L 程序,下面将通过一个具体的实例介绍 P L /SQ L 的结构特 点 ,使 用 户 对 PL/SQL 程序的特点有一个感性的认识。 SQL> set serveroutput on SQL> declare 2 a number:=3; 3 b number:=4; 4 c number; 5 begin 6 c : = (a*b)∕(a+b); 7 dbms_output.put_line(c); 8 exception 9 when zero_divide then 10 dbms_output .put_line (,除数不能为 0 !, ); 11 end; 12 ∕ 1.71428571428571428571428571428571428571 P L / S Q L 过程已成功完成。

在上面的程序中,为了在服务器端显示执行结果,使用了 SET SERVEROUTPUT ON 命令。在 DECLARE 关键字表示的声明块中声明了 3 个 变 量 A 、B 和 C , 其数据类型为 N U M B E R , 并且分别为变量 A 和 B 赋初始值为 3 和 4 。 接 下 来 以 BEG IN 关键字标识可执行块的开始,在可执行块中包含了两条 PL/SQL 语 句 。第 一 条 语 句 计 算 A *B ∕(A +B ) 的值,并 将 计 算 值 赋 予 变 量 C ;随 后 则 使 用 DBMS_ OUTPUT.PUT_LINE(C);语句显示计算结果。EXCEPTIO N 关键字表示异常处理块的开

始 。在这里捕获的异常是 ZERO D I V I D E , 表示出现了除数为 0 的错误。出现错误时显

117

Oracle 11g中文版数据库管理、应用与开发标准教程 示 的 错 误 信 息 为 “除数不能为0 ! ”。

号变量与数据类型 变量本质上是一种用名称进行标记的容器,它们可以包含或保存不同类型的数据。 根据不同的数据类型,变量可以存储不同类型的数据,并且彼此可以通过变量名进行 区分。

PL/SQL 变 量 的 声 明 :

.--6 .2 .1

可以使用下面两种语法声明PL/SQL变量。 variable_name data_type [ [NOT NULL]:=default_value_expression]; variab1e_name data_type [ [NOT NULL] DEFAULT default_value_expression];

变 量 名 VARIABLE_NAME可以是任何合法的PL/SQL标识符,合法的PL/SQL标识 符必须满足如下条件。 □ 长度不能超过3 0 个字符,并且中间不能有空格。 □ 由字母、0 到 9 的数字、下 划 线 美 元 符 号 “ $”以 及 符 号 “ 优组成.

118

□ 必须以字母开头。 □ 不能使用PL/SQL或 S Q L 的关键字。例如,BEGIN、E N D 不能作为变量名,因 为 它 在 PL/SQL程序中有特殊的意义,分别表示块的开始和结束。 可 以 在 SQL*Plus中使用如下命令获得S Q L 和 PL/SQ L的关键字。 help reserved words

变量类型D A T A JY P E 必须是合法的S Q L 或 PL/SQ L数据类型,变量的类型决定了 其中存储的数据类型。如果变量只能存储一个单独的值,则该变量称为标量变量。如果 变 量 可 以 存 储 多 个 值 (如表中一行记录),则该变量称为复合类型的变量。 标量变量所使用的数据类型包括字符、数字、 日期和布尔类型等。标量变量所使用 数据类型见表6-1 o 表 6-1

.基本数据类型

类型

说明

Boolean

布尔值,包 括 true> false和 null

Binaryinteger

-2 247 483 6 4 8 和 2 247 483 6 4 7 之间的带符号的整数

P lsinteger

类 似 于 binary in te g e r ,但是计算速度更快

Number

数字型

Int

整数型

P lsinteger

整数型,产生溢出时出现错误

Binaryinteger

整数型,表示带符号的整数

Char

定长字符型,最 大 2 5 5 个字符

Varchar2

变长字符型,最 大 40 0 0个字节

Date

日期型

Long

变长字符型,最 长 2GB

第 6 PL/SQL编程基础 NOT N U L L 表示变量必须是非空的,需要指定初始值。当变量被创建后,可以以表

达式的方式对其赋初始值。在声明变量时,还 可 以 使 用 DEFAULT 关键字指定变量的默 认值,这样如果未向变量赋值时,变量的值就是设置的默认值。 下面介绍几种常用的数据类型,这些常用的数据类型包括 NUMBER 、VARCHAR2. DATE 和 BOOLEAN 等 。 VARCHAR2 是一种变长的数据类型。在 PL /SQ L 中,该类型的最大长度为 32767 。

使 用 VARCHAR2 类型变量的语法形式如下: char_variable varchar2(max_length);

其中,MAX_LENGTH 参数是正整数,表示该变量最大可以容纳的字符数。 NUM BER 数据类型表示所有的数字数据, 声明 NUM BER 数据类型变量的格式如下: number_variable number(length,decimal_places);

其中,LENGTH 参数的取值范围为 1〜 38, DECIMAL_PLACES 参数用于指定数字 小数点后面的位数。 DATE 数据类型用于存储日期数据和时间数据,声明该类型变量的格式如下所示: date_variable date;

B O O L E A N 数据类型用于声明布尔值,该类型 的 变 量 只 能 存 储 TRUE 、F A L S E 或 NULL

下面的代码在程序块的声明部分声明了 4 种类型的变量: DECLARE out_date DATE; 一定义存储日期和时间值的变量 out_text varchar2 (50); 一定义存储字符串值的变量 out_num binary二Integer; 一定义存储数字值的变量 out_boolean boolean; 一定义存储布尔类型值的变量 BEGIN --- PL∕SQL 程序的执行部----END;

这些标量变量只可以在该程序块中使用,并 且 在 B E G IN 部分开始执行前,每一个 变量都包含一个 N U L L 值 。

电- 6 2 2

%TYPE 变量

在声明变量时,除 了可以使用 O racle 规定的数据类型外,还可以使用%T Y P E 关键 字定义变量类型。% T Y PE 关键字的含义是声明一个与指定列名称相同的数据类型。例 如 ,下面的语句声明了一个与 E M P 表 中 E N A M E 列完全相同的数据类型。 declare var_name emp.ename%type;

如 果 ENAM E 列的数据类型为 V A R CH AR2(40), 那 么 变 量 VAR_NAM E 的数据类型 就是 VARCHAR2(40)0

119

Oracle 1 1 g 中文版数据 库管理、应 用与开发标 准教程 下面的示例 演示了如何 使用%TY PE类型的变 量从数据库 中检索数据 。 SQL> set serveroutput on SQL> declare 2 var_name emp.ename%type; 3 var_no emp.emρno%type; 4 var_sal emp.sal%type; 5 begin 6 select empno,ename,sal 7 into var_no z var_name,var_sal 8 from emp 9 where empno= , 7369 , ; 10 dbms_outp ut.put_line (var_no ∣∣ , 11 end; 12 ∕ 7369 SMITH 800

,

∣∣var_name ∣∣ ,

,

I I var_sal);

P L / S Q L 过程已成功完 成。

120

在上面的P L/SQL程序中,主要使用了 SELECT语 句 从 E M P 中检索数据 。 该 SELECT 语 句 与 前 面 使 用 的 S Q L 查询语句非 常相似,唯 一的不同在 于它多了一 个IN T O 子句。 IN T O 子 句 跟 在 SELECT子 句后,表示 从数据库检 索的数值将 保存在那个 变量中。

需要注意,因 为定义的变量 只可以存储一 个单独的值,所 以 使 用 WHERE 子句限定的返 回结果集中只 包含一行数据 。如果返回的 结果集中包含 多行数据,则 由于实际返回 的行数超 出请求行数而 产生错误.

使用%T Y P E 定义变量有 两个好处:首先,用户 不必查看表 中各个列的 数据类型, 就可以确保 所定义的变 量能够存储 检索的数据 ;其次,如 果对表的结 构进行修改 (例如, 改变某一个 列的数据类 型),用户不必 考虑对所定 义的变量进 行更改,而%TY PE类型的 变量会自动 调整。使用 %T Y P E 类型的变量 也有一个缺 点,在程序 的执行过程 中,系统 必须查看数 据字典以确 定变量的数 据类型,因 此它会对程 序的性能产 生影响。

对 于 刚 接 触 PL/SQL 程序的用户而 言,经常犯的 一个错误是遗 漏赋值符号:= 中的冒号, I 这 也 是 PL/SQL 程序与其他程 序中赋值符号 的区别。

. - 6 2 3 复合变量匕 很多结构化 程序设计语 言都提供了 记录类型的 数据类型,在 P L /S Q L 中,也支持将 多个基本数 据类型捆绑 在一起的记 录数据类型 ,即复合变 量。相对于 标量变量,复合变 量一次可以 存储多个数 值。 对于复合变 量,用户可 以根据需要 定义其结构 ,也可以使 用由系统自 动决定的变 量 的结构。下面列出了 PL/SQ L提供的两 种常用的复 合类型。 □ 自定义记录 类型在记录 类型的复合 变量中可以 存储多个标 量值,它的 结构通

6 PL /SQ L 编程基础 常与数据表中的行相似。 %ROWTYPE类 型 该 类 型 的 复 合 变 量 可 以 根 据 指 定 的 表 结 构 ,由系统决定其



结构. 1 . 自定义记录类型 使用自定义记录数据类型的变量可以存储由多个列值组成 的一行数据。当使用记录 类型的变量时,首先需要定义记录的结构,然后才可以声 明记录类型的变量。定义记录 数据类型时必须使用T Y PE 语句,在这个语句中指出将在记录中包含的字段及其数据 类 型 。使 用 T Y PE 语句定义记录数据类型的语法形式如下: type record_name is record.( fieldl_name data_type [not null] fieldn_name data_type [not null]

[:=default_value], [:=default_value]);

在上面的语法中,RECORD_NAM E为自定义的记录数据类型名,如数值数据类型 的名称为NUMBER» FILED 1_NAME为记录数据类型中的字段名,DATA T Y PE 为该字 段的数据类型,从这里可以看出,字段的声明与标量变量 的声明类似。 下面的程序代码定义了名为EMPLOYEE_TYPE的记录类 型,该记录类型由整数型 的 NO_NUMBER、字 符 型 的 NAME STRING和整 数 型 的 SAL NUM BER基本类型变量 组成,EMPLOYEE是该类型的变量,引用记录型变量的 方法是“记录变量名.字段名 SQL> set serveroutρu on SQL> declare 2

type employee_type is record( number,

3

no_number

4

name_string varchar2(20),

5

sal_number number);

6

employee employee_type;

7

begin

8

select empno z ename z sal

9

into employee

10

from emp

11

where emρno= , 7369 , ;

12

dbms_output.put(employee.no_number);

13

dbms_output.p u t (,

14

∣ employee.sal_number); dbms_output.put_line(, ' ∣

15

end;

16



,

∣ employee.name_string); ∣

7369 SMITH 800 P L / S Q L 过程已成功完成。

程序的执行部分是从SCOTT.EMP数据表中提取EM PN O列 为 7 3 6 9 的记录,并将数 据存放在复合变量EM PLO YEE中,然后输出复合变量的各个字段的值,实际上就是数 据表中相应记录的值。

121

Oracle 11g中文版 数据库管理 、应用与开 发标准教程

SELECT 语句检索的列 以固定的顺序 赋予记录变量 中各个字段. 即查询的第一 个列值赋

/

予记录变量的 第一个字段,第二个列值赋 予记录变量的 第二个字段。因此,SELECT语句查询 的列值数量和 顺序必须与定 义记录类型中 定义的字段数 量和顺序相匹 配。

如果两个记 录变量的数 据类型相同 ,那么可以 将记录变量 的值直接赋 予另一个记 录 变量。如果 记录变量数 据类型不同 ,那么无论 记录变量类 型的结构是 否相同,都不可以 直接将一个 记录变量赋 予另一个记 录变量。 2. %ROWTYPE 类型 与%TY PE类型和自 定义类型的 变量相比,%ROW TYPE类型 的变量结合 了这两者的 优点,它可 以根据数据 表中行的结 构定义数据 类型,用于 存储从数据 表中检索到 的一行 数据。例如 ,下面的示 例使用%R OWTYPE类 型的变量存 储查询的数 据。 SQL> set serveroutput on SQL> declare 2 3 4

122

5 6 7 8 9 10 11

row_emp1oyee emp%rowtype; begin select * into row_employee from emp where empno= *7499'; dbms_outp ut.p u t (row_empl oyee.emρno ∣∣, , ); dbms_outp ut.put(ro w_employe e.ename ∣∣, , ); dbms_outp ut.p u t (row_emplo yee.job ∣∣, , ); dbms_outp ut.put_li ne(row_em ployee.sa l);

12

end;

13



7499 ALLEN SALESMAN 1600 P L / S Q L 过程已成功完 成。

上面的程序 定义了一个 %ROWTY PE类型的变 量,该变量 的结构与E M P 表的结构完 全相同。因 此,可以将 检索到的一 行数据保存 到该类型的 变量中,并 且可以根据 表中列 的名称引用 对应的数值 。

④条件语句 P L /S Q L 与其他编程 语言一样,也具有条件 判断语句。条件判断语 句的主要作 用是 根据条件的 变化选择执 行不同的代 码。

6.3.1

IF∙∙∙THEN 条件语句

PL/SQL为 了控制程序 的执行方向 ,引进了 I F 语句。 最 简 单 的 I F 语句 就 是 IF -T H E N 语句,其语 法形式如下 :

P L /SQ L 编程基础 if then pl/sql_statement; end if;

在该语句中,如果 判断条件EXPRE SSION1为 T R U E ,则 会 执 行 I F 下 面 的 PL/SQL 语句。如果判断 条件EXPRESSIO N1为 F A L S E ,则 跳 过 I F 下面的语句直接 执行END IF 后面的语句。 例如,下面的示 例使用IF…TH EN 语句判断两个数的 大小。 SQL> set serveroutput on SQL> declare 2 numberl integer:=90; 3 number2 integer:=60; 4 begin 5 if numberl>=number2 then 6 dbms_output.put_line(numberl ∣∣,>= , ∣∣number2); 7 end if; 8 end; 9 ∕ 90>=60 PL/SQL过程已成功完成。

在上面的程序中, 由 于 变 量 N U M BER 1的 值 大 于 N U M B ER 2的值,判断条件 将返 回 T R U E ,因此将执行I F 内 的 PL/SQL语句: dbms_output.put_line(numberl ∣∣,>= , ∣I∏umber2);

・一 6.3.2

IF…THEN… E LS E 条件语句

I F 语句的另一种形 式就是与ELSE语 句结合使用,形 成 IF…THEN…E L SE语句。该 语句的语法形式如 下: if then pl/sql_statementl; else pl/sql_statement2; end if;

在 IF∙∙∙THEN…E L SE 语句中,如果判断 条件EXPRESSIO N1为 T R U E ,则首先执行 I F 下 面 的 PL/SQ L语句,当语句执 行完后将直接跳 到END I F 语句后,而不会执 行ELSE 下 面 的 PL/SQ L语句。如果判断 条件EXPRESSIO N1为 F A L S E ,则 会 执 行 E L SE 下面的 PL/SQL 语句。 . 例如,下面的示例 将判断两个整数变 量的大小,并输出 不同的结果。 SQL> set serveroutput on SQL> declare 2 numberl integer:=80; 3 number2 integer:=90;

123

Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程 4 begin 5 if numberl>=number2 then 6 dbms_output.put_line(numberl ∣∣, > = , ∣Inumber2); 7 else 8 dbms_output\put_line(numberl ∣∣,< , ∣Inumber2); 9 end if; 10 end; 11 ∕ 80 then pl/sql_statementl; elsif < expression2> then pl/sql_stat ement2; else pl/sql_statement3; end if;

在该语句中由 于使用ELSIF 语句,语句中 的判断条件将 依次被评估,直到一个判断 条 件 为 T R U E 时执行该语句 下的代码;如 果所有的ELS EIF判断条件 都为F A L S E ,则执 行 E L S E 下 面 的 PL/SQ L语句。 例如,下面的 示例将判断某 一年是否为闰 年,闰年的判 断条件为年号 能被4 整除但 不 能 被 100整除或者 能被4 0 0 整除。 SQL> set serveroutput on SQL> declare 2 year_date number; 3 leap Boolean; 4 begin 5 year_date:=2010; 6 if mod(year_da te,4)0 then 7 leap:=false; 8 elsif mod(year_da te,100)0 then 9 leap:=true; 10 elsif mod (Year_date, 40∙0) 0 then 11 leap:=false; 12 else 13 leap:=true; 14 end if; 15 if leap then 16 dbms_output .put_l ine (year_date ∣∣ , 是闰年

PL/SQL编程基础 17 e ls e 18 dbm s_output .p u t _ l i n e ( y e a r _ d a te 19 end i f ; 20 end; 21 ∕ 201 0 是平年

∣ ∣ '是平年’);

P L / S Q L 过程已成功完成。

蹲 ---------------------'W y ]

注 意 关 键 字 E L SIF 不 能 写 成 ELSEIF.

φ - 6.3.4

CASE条 件 语 句 ,

从 Oracle 9 i 后 ,PL/SQL也可以像其他编程语言一样使用CASE语 句 ,CASE语句 的执行方式与IF 语句相似。通常情况下,CASE语句从关键字CASE开始,后面跟着一 个选择器,它通常是一个变量。接下来是WHEN子句,它将根据选择器的值执行不同的 PL/SQL 语句。 CASE语句有两种形式。 第一种形式是获取一个选择器的值, 然后将其与每个WHEN 子句进行比较。其语法形式如下: c a s e < s e le c t o r > when < e x p r e s s io n l> th en p l/ s q l_ s t a t e m e n t l; when < ex p re ssio n 2 > th en p l/ s q l_ s t a t e m e n t 2 ; when < e x p re ssio n N > th en p l/ s q l_ s t a t e m e n t n; [ e l s e p l ∕ s q l_ s t a te m e n t n + 1 ;] end;

另一种形式是不使用选择器,而是 判 断 每 个 W H EN子句中的条件。这 种 C A SE 语 句的语法结构如下: ca se when e x p r e s s io n 1 th en p l ∕ s q l _ s t a t e m e n t l ; when e x p r e s s io n 2 th en p l/ s q l_ s t a t e m e n t 2 ; when e x p r e s s io n N th en p l/ s q l_ s t a t e m e n t n; [ e l s e p l/ s q l_ s t a t e m e n t n + 1 ;] end;

虽 然 CASE语句的作用与IF∙∙∙ELSIF∙∙∙ELSE∙∙∙END IF 语句相同,都可以实现多项 选择,但 是 CASE语句可以以一种更简洁的表示法实现该功能。当 执 行 CASE语句时, 系统将根据选择器的值查找与其相匹配的WHEN常量,当找到一个匹配的W HEN常量 时,就会执行与该WHEN常量相关的子句。如果没有与选择器相匹配的WHEN常量, 那么就执行ELSE子句。 例如,下面的示例演示了 CASE语句的使用。

Oracle 1 1g中文版 数据库管 理、应用 与开发标 准教程 SQL> set serveroutput on SQL> declare 2 i number:=0; 3 begin 4 while i set serveroutput on SQL> declare 2 4

cursor emp_cursor( department in number default 20) is select empno z ename z job,sal from emρ

5

where deptno=departme nt;

6 7

type employee is record( id emp.empno%type,

8

name e mp.ename%type,

9

job emp.job%type,

3

10

sal emp.sal%type);

11

emp_row employee; begin

12 13 14 15 16 17 18

open emp_cursor( 30); fetch emp_cursor into emp_row; while emp_cursor%found loop dbms_output ・put ('员工编号 , ∣∣ emp_row. id); dbms_output.put (' 姓 名 , ∣∣ emp_row.name); dbms_output.put (, 职 位 , ∣∣ emp_row. job);

20

dbms_output .put_line (, 薪 金 , ∣∣ emp_row. sal); fetch emp_cursor into emp_row;

21

end loop;

19

133

Oracle 1 1 g 中文版数据库管理、应用与 开发标准教程 22

close emp_cursor;

23

end;

24



员 工 编 号 7499 姓 名 A L L E N 职 位 SALESMAN薪 金 1600 员 工 编 号 7521 姓 名 W A R D 职 位 SALESMAN薪 金 1250 员 工 编 号 7654 姓 名 M A R T I N 职 位 SALESMAN薪 金 1250 员工编号 7698 姓名 BLAKE 职位 MANAGER 薪金 2850 员 工 编 号 7 8 4 4 姓 名 T U R N E R 职 位 SALESMAN薪 金 1500 员 工 编 号 7 9 0 0 姓 名 J A M E S 职 位 C L E R K 薪 金 950 P L / S Q L 过程已成功完成。

这个示例不仅声明了一个游 标,还定义了一个用于存储 数据的记录类型变量。循环 控制语句非常适用于对结果 集进行逐行处理。 4 . 关闭游标 使用完游标后,用户必须显 式关闭游标,释 放 SELECT语句的查询结果。关闭游标 所 使 用 的 CLOSE语句形式如下: close cursor_name;

例如,在上面的程序中显式 关闭了游标EMP_CURSOR 。 close emp_cursor;

如果试图从一个关闭的游标 中提取数据,则会产生一个 O racle错 误 。但 是 ,如果使 用完游标后未关闭它,则当 游标数据达到系统定义的最 大值时也会产生错误。

. - 6 5 3 游 标 FOR 循环 从上面的示例中可以发现,游标通常与循环联合使用。实际上,P L /S Q L 还提供了 一种将两者综合在一起的语 句,即 游 标 F O R 循环语句。游 标 F O R 循环是显式游标的一 种快捷使用方式,它 使 用 F O R 循环依次读取结果集中的数 据。当 F O R 循环开始时,游 标 会 自 动 打 开 (不 需 要 使 用 O P E N 方法),每循环一次系统自动读取 游标当前行的数据 (不需要使用FETCH) , 当 退 出 F O R 循环时,游 标 被 自 动 关 闭 (不需要使用CLOSE) 。 FO R 循环的语法如下: for cursor_record in cursor_name loop statements; end loop;

这 个 F O R 循环将不断地将数据行读入 变量CURSOR_RECORD中 , 在循环中也可以 存 取 CURSOR RECORD中的字段。 例 如 ,下面的示例使用游标F O R 循环实现查询E M P 表中的数据。 SQL> set serveroutput on SQL> declare 2

cursor emp cursor is

PL/SQL编程基础 3

select ♦ from emp

4

where deptno=10;

5

begin

6

for r in emp_cursor loop

7

dbms_output.p u t (r .empno ∣ ∣

,

8

dbms_output.p u t (r .ename ∣ ∣

, ,

9

dbms_output.p u t (r .job ∣I

10

, 1

'); );

);

dbms_output.put_line(r .sal);

11

end loop;

12

end;

13



7782 CLARK MANAGER 2450 7839 KING PRESIDENT 5000 7934 MILLER CLERK 1300 P L / S Q L 过程已成功完成。

在 使 用 游 标 F O R 循环时,一 定 不 要 使 用 O P E N 语 句 、FETCH 语 句 和 C LO SE 语 句 ,否 则将产生错误。

135

卷 )异常处理 在 编 写 PL /SQ L程序时,不可避免地会出现一些错误。O racle系统使用异常来处理 这些错误,这些异常都可以包括在PL/SQ L程 序 的 EXCEPTION块 中 。O racle系统提供 了许多内置的异常,用户也可以根据自己的 需要定义异常。 Oracle系统的异常可以分为3 类 。 □ 预定义异常

O racle为用户提供了大量的、在 PL/SQ L中使用的预定义异常,以

便检查用户代码失败的一般原因。它 们都定义在O racle的 核 心 PL/SQ L库中, 用户可以在自己的PL/SQL异常处理部分使 用名称对其进行标识。 对这种异常情 况的处理,用户无需在程序中定义,它 们 由 O ra c le 自动引发。 □ 非 预 定 义 异 常 数 据 库 本 身 不 知 道 、不能控制的错误。例 如,操作系统崩溃; O racle服务器错误;网络或者机器I/O 错误等.对这种异常情况的处理,需要用 户在程序中定义,然 后 由 O ra c le 自动引发。 □ 用户定义异常

如果程序设计人员认为某种情况违反了业务 逻辑,则可明确定

义并引发的异常。

φ--∙ 6 . 6 . 1 预定义异常■ 一 、 当 PL/SQ L程序违反了 O racle的规定或超出了系统规定的限制时,就 会隐式地引发 一个预定义异常错误。如 前 面 已 经 提 到 过 的 异 常 ZERO D IV ID E 就是系统预定义的,

--------------------- Oracle 1 1 g 中文版数据 库管理、应用 与开发标准教 程 Oracle P L /S Q L 自身能发现和 引发的异常较 少。表 6 -2 列出了这些 异常的详细 信息。 表 6-2 一 系统定义的异常 系统定义异常

136

说明

ACCESS_INT O_NULL

企图为某个未 初始化对象的 属性赋值

CASE_NOT_FOUND

在 C A S E 语 句中 未包 含 相应 的 W H E N 子 句 ,并且没有设 置 E L S E 子句

COLLECTION _IS_NULL

集合元素未初 始化

CURSOR_ALREADY_OPEN

企图打开一个 已经打开的游 标。游标在重 新打开之前,必须关闭

DUP_VAL_ON_INDEX

企图在一个唯 一性索引的列 中存储冗余值

INVALID_CURSOR

执行一个非法 的游标操作,例如关闭一个 未打开的游标

INVALID_NUMBER

企图将一个字 符串转换成一 个无效的数字

LOGIN_DENIED

企图使用无效 的用户名和密 码连接数据库

NO_DATA_FOUND

SELECT IN T O 语句没有返回 数据,或者企 图访问嵌套表 中已经 被删除的元素 或未初始化的 元素

NOT_LOGGED_ON

企图在没有连 接数据库的情 况下访问数据 库中的内容

PROGRAM_E RROR

P L /S Q L 内部问题,可 能需要重装数 据字典和P L /S Q L 系统包

ROWTYPE_MISMATCH

主 游 标 变 量 与 P L /S Q L 游标变量的返 回类型不兼容

SELFJS_NUL L

使用对象类型 时,在 N U L L 对象上调用对 象方法

STORAGE_ERROR

PL/SQL程序使 用完了内存,或内存遭到了 破坏 元 素 下 标超 过 嵌套 表或 V A RRA Y的最大值

SUBSCRIPT_BEYOND_COU NT SYS_INVALID _ROWID

企图使用非法 索引号引用嵌 套表或VARR AY中的元素 字 符 串 向 R 0 W ID 转换时的错误 ,因为该字符 串不是一个有 效的

TIMEOUT_ON _RESOURCE

O ra c le 在等待资源时 超时

TOO_MANY_ROWS

执 行 SELECT IN T O 语句时,结果 集超过一行

VALUE_ERROR

赋值时,变量 长度不足以容 纳实际数据

ZERO_DIVIDE

除数为0

SUBSCRIPT_O UTSIDE_LIM IT

ROWID 值

对于系统预 定义异常,用 户无需在程 序中定义,它 们 将 由 O ra c le自动引发。例如, 如果用户试 图使用完全 相同的主键 值向同一个 表中插入两 条记录,则系 统会产生违反 主 键的异常,O racle称这种 异常为DUP _VAL_ON_ INDEX异常 。在知道了可能 出现的异常 后 ,就可以在程 序的异常处 理部分捕获 它,并且根据 自己的需求 进行处理。 SQL> set serveroutput on SQL> begin 2 3 4 5

insert into emp(empno,ename,job,sal,deptno) values (7369f ,A T G ∖ , CLERK , ,1500 r 20); exception

7

when dup_val_on_index then dbms_outpu t.put_line (,捕获 DUP_VAL_ON_INDEX 异 常 , ) ; dbms_outpu t.put_line (, 该主键值已经 存在 , ) ;

8

end;

6

9 ∕ 捕获 DUP_VAL_ON_INDEX 异常



6 PL /SQ L 编 程 基 础 -------------- 该主键值已经存在 P L / S Q L 过程已成功完成。

在该程序中,试图使用经存 在的主键值向E M P 表添加新记录,这会因为违反 主键 约束而产生错误。由于在程序 的异常处理部分对其进行了捕 获,所以当该错误发生时并 不会影响到程序的执行。 当出现错误时,PL /SQ L有两种方法向用户报告信息 ,一 种 是 用 SQ LC O D E函数, 它可以返回出错码。一般出错 码为负数,它 等 同 于 O R A 错误中的出错码。而 如 果 ORA 中的错误在程序结束之前得不 到处理,它将会显示出来。另 一种方法是使用SQLERRM 函数返回出错信息。也可以同 时使用这两个命令进行异常处 理。 这两个函数可以在任何异常处 理程序中使用,但 是 当 在 OTHERS子句中使用时,它 们就变得非常重要。OTHER S子句通常是异常处理中最后 的处理程序,用来捕获前面未 捕获的异常。所以,在程序的 异常处理中使用OTHERS子 句时,在其 中 使 用 SQLCODE 和 SQLERRM 函数可以获得错误的信息。 例如,在 下 面 的 程 序 中 SEL EC T语句将引发一个异常,该 异 常 将 被 O T H ER S子句 捕获。为了获取异常的错误信息, 将 在 OTHERS子句中使用SQLCO DE函数和SQLERRM

137 SQL> set serveroutput on SQL> declare 2 emp_row e m p % rowtype; 3 begin 4 select * 5 6 7 8 9 10

into emp_row from emp where deptno=10; exception when others then dbms_output . ρ u j l i n e。异常错误(,∣∣SQLCODE ∣∣'), ); 11 dbms_output.put_line( S Q L E R R M ); 12 end; 13 ∕ 异常错误( -1422) O R A - 0 1 4 2 2 : 实际返回的行数超出请求的行数 P L / S Q L 过程已成功完成。

从上面的程序可以看出,由 于 WHEN O THER S子句捕获的异常是未知的, 因此为 了获取异常的信息, 就可以 在 WHEN OTHERS子句中使用SQLCO DE函 数 和 SQLERRM 函数,以查看异常的错误码或 错误的描述信息。

注 意 ----------------------------------------------------------% ■精.邛O T H E R S 子句必须放在异常处理的最后,而其他异常处理可以按任意次序排列。

--------------------- Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程

r

θ .6 ∙2 非 预 定 义 异 常 、 在一个异常产生 、被捕获并处理 之前,它必须被 定义。O racle定义了几千 个异常,

绝大多数只有错 误编号和相关描 述, 仅仅命名了 2 1 个最常用的异常 ,即系统预定义异 常。 这些异常的名称 被储存在STANDARD、UTL_F ILE、DBMS_S QL这几个系统 包中。 除此之外的绝大 多数异常都未命 名,这些异常就 是非预定义异常 ,它们需要程序员 对其进行命名。 当然,只使用错 误码也可以完成 异常的处理,但 是这种异常处理 会使代 码非常生涩。例 如: exception when others then if sqlcode=-1843 then end if;

138

为非预定义异常 命名时,需要使 用语句PRAGM A EXCEPTION_I NIT为错误号关 联 一个名称,随后 就可以像对待系 统预定义异常一 样进行处理。E X C EPT IO N JN IT是编译 时运行的一个函 数,它只能出现 在代码的声明部 分,而异常名字 必须在此之前被 定义。 例如,下面的示 例在程序块中为 异常-1834关联 了一个名称。 declare invalid_company_id exception; pragma exception_ini t(invalid_id A -1834);

下面通过一个完 整的示例演示如 何在程序中处理 O racle错 误 ORA-2292。 SQL> set serveroutput on SQL> declare 2 3

fk_delete_exception exception; pragma exception_init(fk_delete_e xception z -2292);

4

begin

5

delete dept

6

where dname= , SALES , ;

7

exception

8

when fk_delete_exception then dbms_output.put_line (, 该项目存在于另一 个表中 !') ;

9 10

end;

11 / 该项目存在于另一 个表中! P L / S Q L 过程已成功完成。

在上面的程序中 ,由于该名称的 部门信息仍然存 在于E M P 表 中 ,当 使 用 DELETE 语句 删除 D E PT 表中的数据时,将触发外键错误 -2292。因此,将 该错误与定义的 异常相 关联后,当错误-2292发生时将 引发定义的异常 FK_DELETE_E XCEPTION。这 样,在异 常处理部分就可 以像对系统预定 义异常一样进行 处理。

PL/SQL编程基础

c C C

φ - 6.6.3

m

L- ∣-*-ι *∖∕ JLX- P∑3

r 用户 ;义 的 异 吊 二 B

E

系统预定义异常和非预定义异常都是由O racle判断的错误,在实际的应用中,程序 开发人员可以根据具体的业务逻辑规则自 定义一个异常。这样,当用户操作违反业 务逻 辑规则时,就引发一个自定义异常,从而 中断程序的正常执行并转到自定义的异常 处理 部分。 用户自定义的异常是通过显式使用R A ISE语句来引发的。当引发一个异常时,控制 就 转 到 EXCEPTION异常处理部分执行异常处理 语句。 自定义异常的处理步骤如下。 ( 1 ) 定义异常处理。定义异常处理的语法如下 : d e c la r e 异常名 e x c e p t io n ;

( 2 ) 触发异常处理。触发异常处理的语法如下 : r a i s e 异常名;

( 3 ) 处理异常。触 发异常处理后,在程序块中可以像对系统 预定义异常一样进行 处理。 下 面 的 PL/SQ L程序包含了完整的异常处理定义、触发 、处理的过程。在程序中定 义 了 名 为 SALARY_ERROR的异常,在 SCOTT.EMP数 据表中查找EM PNO=7356的记 录 ,将其值放入变量VAR_SAL中。如 果 VAR_SAL的值 小 于 8 0 0 , 则说明该员工的薪水 有问题,将激活异常处理,显示提示信息 。 SQL> SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

s e t s e r v e r o u tp u t on d e c la r e s a la r y _ e r r o r e x c e p t io n ; v a r _ s a l s c o t t . emp. sal% ty p e; b e g in s e le c t s a l in t o v a r _ s a l from s c o t t . emp where empno=7369; i f v a r_sa l< = 8 0 0 then r a is e s a la r y _ e r r o r ; end i f ; e x c e p tio n when s a la r y _ e r r o r then dbm s_output . p u t _ l i n e (, 薪金超过范围'); end; ∕

薪金超过范围

P L / S Q L 过程已成功完成。

上面的程序是一个生成自定义异常的示例 ,当然也可以使用R A ISE生成系统处理预 定义异常。例如:

139

Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 SQL> set serveroutput on SQL> declare 2 var_comm number; 3 begin 4 select comm 5 into var_comm 6 from emp 7 where ename= , TURNER , ; 8 if var_comm=0 then 9 raise zero_divide; 10 end if; 11 exception 12 when zero_divide then 13 dbms_output.put_line (, 补贴费为 0 ! , ); 14 end; 15 ∕ 补 贴 费 为 0! P L / S Q L 过程已成功完成。

140

u

实验指导

1 . 各种类型的变量 在 PL /SQ L程序中,为了 处理数据库中存 储的数据,用户 可以根据实际情 况使用系 统预定义的标量 变量或者自定义 的复合变量。 ( 1 ) 使用标量变量。 标量变量是最简 单的变量,它只 能存储单个值,它的数据类型也 是系统预定义的 。 连 接 到 H R 模式,在 SQL*PIus中输入 如下语句: set serveroutput on declare var_sal

number:=2200;

begin update employees set salary=var_sal where employee_id= , 203 , ; end;

( 2 ) 使用%T Y PE类型的变量。 在 PL/SQL程序中 使用%T Y PE类型的变量后 ,如果用户随后修 改数据表中该列 的结 构 ,则该类型的变 量也随之改变。在 SQL*Plus中输入 如下语句: declare var_first_name employees.first_name%type; var_last_name employees.last_name%type; begin select first_name,last_name

第 6 PL /SQ L 编 程 基 础 --------------- into var_first_name,var_last_name from employees where employee_id=199; dbms_output.put_line(var_first_name ∣∣, end;

,

∣∣var_last_n ame);

( 3 ) 自定义记录 变量。 使用自定义 记录变量时 ,首先需要 用户自己定 义记录变量 的类型,然后才可以声明 记录类型的 变量。在 SQL*Plus中 输入如下代 码以显示员 工的基本信 息。 declare type emp_record is record( id employees.employee_i d%type f name varchar2(50)r job employees.job_id%typ e, sal number ); emp_one emp_record; begin select employee_i d,last_nam e,job_id z salary into emp_one from employees where employee_i d= , 199'; dbms_outpu t.put_line (emp_one.id ∣∣, , ∣ ∣ emp_one.na me ∣∣, jo b ∣∣, , ∣∣ emp_one.sa l); end;

141 ,

∣∣emp_one.

( 4 ) 使用%ROW TYPE变量。 %ROWTYP E类型的变量 可以存储数 据表的一个 完整行。 在 SQL*Plus中输入如下代 码以在%RO W TYPE类型的 变量中存储 某员工的记 录。 declare var_emp employees%rowtype; begin select * into var_emp from employees where employee_id=199; dbms_outpu t.put_line (var_emp.e mployee_id ); dbms_outpu t.put_line (var_emp.las t_name); dbms_outpu t.put_line (var_emp.j ob_id); dbms_outpu t.put_line (var_emp.s alary); end;

2 .使 用 游 标 在程序中访 问数据库表 最通用的方 法是嵌入S Q L 语句,由 于 S Q L 语句一般以 集合 的形式返回 结果,而程 序设计语言 并不能处理 集合形式的 数据。因此 ,这需要使 用游标 架 起 这两 者之 间的 “桥梁”。 (1) 使用隐式游 标访问数据 表。

Oracle 1 1g中文版数据库管理、应用与 开发标准教程 在程序中访问数据库最简单的 方法是使用FOR CU RSO R,这种方式使用的游标是隐 式游标。隐式游标不需要用户 显式定义、打开等操作就可以 浏览数据库中的表。使用如 下语句浏览H R 模 式 中 的 EMPLOYEES表 。 set serveroutput on begin for emp_one in (select employee- id z last_name z job_id,salary from employees) loop dbms_output.put(emp_one.employee_id ∣∣, , ); dbms_output.p u t (emp_one.last_name ∣∣' , ); dbms_output.put(emp_one.j ob_id ∣∣, , ); dbms_output.put(emp_one.s alary ∣∣, , ); dbms_output.put_line(nul l); dbms output.put line (* ********************* , ) ; end loop; end;

(2 ) 使用显式游标。

142

declare cursor emp_cur is select * from employees; emp_one employees%rowtype; begin open emp_cur; loop fetch emp_cur into emp_one; exit when emp_cur%notfound; dbms_output.put(emp_one.employee_id ∣∣, , ); dbms_output ・ p u t (emp_one.last_name ∣∣, '); dbms_output.p u t (emp one.job_id ∣∣, , ); dbms_output.put(emp_one.salary ∣∣, , ); dbms_output.put_line(nul l); dbms_output.put_line (, ********************* *) ; end loop; close emp_cur; end;

(3 ) 使 用 R E F 游标。 R E F 游 标 是 动 态 的 ,可 以 在 程 序 运 行 时 指 定 游 标 所 使 用 的 S E L E C T 语 句 。在 SQL*Plus中输入并执行如下 S Q L 语句: declare type emp_record is ref cursor; v_rc emp_record; emp_one employees%rowtype; begin open v_rc for select * from employees; loop fetch v_rc into emp_one;



6 PL/SQL 编程基础 exit when v_rc%notfound; dbms_output.put(emp_one.employee_id ∣∣, , ); dbms_output.put(emp_one.last_name ∣∣, , ); dbms_output .put(emp_one.job_id ∣∣, 1 ); dbms_output.put(emp_one.salary ∣∣, , ); dbms_output.put_line(null); dbms_,output.put_line (, ********************** ) ; end loop; close v_rc; end;

6 .8 ) 思考与练习 一、填空题 1 . PL/SQL程序块主要包括3 个主要部分: 声明部分、执行部分和 部分。 2 .使用显式游标主要包括4 个步骤:声明 游标、 、提取数据、 o 3 . 在 PL/SQL中,如 果 SELECT语句没有 返回任何记录,则会引发 异常。 4 . 查看操作在数据表中所影响的行数,可 通过游标的 属性实现。 5 . 分析下面的程序块,DBMS_OUTPUT将 显示什么结果? declare var_a char( 1)r= ,N , ; begin declare var_a char( 2); begin var_a: = , Y , ; end; dbms_output.put_line( var_a); end;

6 . 下列程序计算由0 到 9 之间的任意3 个 不相同的数字组成的三位数共有多少种不同的组 合方式。完成下列程序使其能够正确运行。 declare counter number:=0; begin for i in 1 ..9 loop for j in 0 ..9 loop if then for k in 0 ..9 loop if then counter:=counter+l; end if;

end loop; end if; end loop; end loop; dbms_output.put_line ( counter); end;

二、选择题 1 . 以下定义的哪个变量是非法的? ( ) A. var ab number; B . var ab number not null:= , 0 , ; C. var ab number default :=1; D . var ab number:=3; 2 . 下列只能存储一个值的变量是哪种变 量? ( ) A . 游标 B . 标量变量 C . 游标变量 D . 记录变量 3 . 声明%TYPE类型的变量时,服务器将会 做什么操作? ( ) A . 为该变量检索数据表中列的数据 类型 B . 复制一个变量 C . 检索数据库中的数据 D . 为该变量检索列的数据类型和值 4 . 下列哪个语句允许检查UPDATE语句所 影响的行数? ( ) A. SQL%FOUND B. SQL%ROWCOUNT C. SQL%COUNTD D. SQL%NOTFOUND 5 . 对于游标FO R循环,以下哪种说法是不 正确的? ( ) A . 循环隐含使用FETCH获取数据 B . 循环隐含使用OPEN打开记录集 C . 终止循环操作也就关闭了游标

143

Oracle 1 1g中文版数据库管理 、应用与开发标准教 程 D . 游 标 FO R 循环不需要定义游标 6 . 如 果 PL/SQL 程序块的可执行部分引 发 了 一 个 错 误 ,则程序的执行顺序 将 发 生 什么 变 化? (



A B C D

. 程 序 将 转 到 EXCEPTION部分运行 . 程序将中止运行 . 程序仍然正常运行 . 以上都不对

三、简答题

1 2 3 4 5

. 简述标量变量和复合变 量之间的区别。 . 使用显式游标需要哪几 个步骤? , 简述如何处理用户自定 义异常。 . 描述游标的各个属性。 . 说 明 使用游标 FO R 循环如何对游标进行

处理。

6

. 如何处理非预定义异常 ?

第7章

存储过 程、触 发器和 程序包

P L /S Q L 程序块可以是 一个命名的程 序块,也可以 是一个匿名的 程序块。上一章所 创 建 的 PL /SQ L 程序块都是匿 名的,这些匿 名的程序块没 有被存储,在 每次执行后都 不 可被重用。因 此,每次运行 匿名程序块时 ,系统都需要 重新编译后再 执行。 很多时候都需 要保存PL /SQ L程序块,以 便随后可以重 用。这也意味 着程序块需要 一个名称,这 样才可以调用 或者引用它。命 名 的 PL /SQ L程序块可被 独立编译并存 储在 数据库中,任 何与数据库相 连接的应用程 序都可以访问 这些存储的P L /S Q L 程序块。 O racle提供了 4 种类型的可存 储程序:过程 、 函数、触发器 和程序包。 本章学习要点 : > 创 建 O racle存储过程

> 系统级触发器 的特点

> 调用存储过程

> 用户事件触发 器的特点

> 理解存储过程 中各种形式的 参数 > PL/SQ L程序中的函数应用

> 程序包规范和 主体 > 程序包中的私 有过程和公有 过程 > 程序包中的初 始化代码

> 触发器的应用

> 理解程序包中 函数或过程的 重载

> 语句级触发器 的特点

> 了 解 O racle提供的常 见系统程

> 为过程添加局 部变量和子过 程

> 行级触发器的 特点 > INSTEAD O F 触发器的特点

序句

勺存储过程 存储过程是一 种命名的PL /SQ L 程序块,它可 以接收零个或 多个作为输入 、输出或 者既作输入又 作输出的参数 。过程被存储 在数据库中,并且存储过程 没有返回值,存储 过 程 不 能 被 S Q L 语句直接使用 ,只 能 通 过 EX ECU T命 令 或 PL/SQ L程序块内部 调用。 由于存储过程 是已经编译好 的代码,所以 在调用的时候 不必再次进行 编译,从而提 高程 序的运行效率 。

r - 7 .1 .1 创 建 存 储 过 程 ; 创建存储过程 之前,先来看 一下创建存储 过程的语法结 构。定义存储 过程的语法 如下: create procedure procedure_name [(parameter[,parameter,.・・])] is [local declarations] begin execute statements [exception

Oracle 11g中文版数据库管 理、应用与开发标准 教程 exception handlers ] end [procedure _name]

从存储过程的语法可 以看出,创建存储过 程与创建匿名程序块 非常类似。存储过程 也 包 括 3 部分:声明部分、执 行部分和异常处理部 分。执行部分和异常 处理部分与匿名 程序块相同,不同之 处是存储过程不能使 用DECLARE关键字 表示声明部分。存储过程 使 用 PROCEDURE关键字 表示创建存储过程,并为存储过程指定名 称和参数。在指定参 数的类型时,也不能 指定参数类型的长度 。I S 关键字后声明的变量 为过程体内的局部变 量 ,它们只能在存储过 程内部使用。 根据上面的语法规则 来创建一个最简单的 存储过程。代码如下 : SQL> create procedure sample_proc is 2 begin 3

null;

4

end sample_proc;

5



过程已创建。

对于这个简单的存储 过程,在成功编译后 ,用户就可以调用和 运行它。虽然它的过 程体内只有一个不处 理任何命令的N U L L语句,但它是一个正 确的存储过程。 当用户需要在某个用 户模式中重新定义存 储过程时,由于该存 储过程已经被存储在 数据库中,所以重新 定义存储过程的操作 将失败。下面将重新 定义前面的存储过程 ,使 它 打 印 Hello W orld字符。 SQL> create procedure sample_proc is 2 begin 3

dbms_output.put_l ine(,Hello World*);

4

end sample_proc;

5



create procedure sample_proc is * 第 1 行出现错误: ORA-00955:名称已由 现有对象使用

为了重新定义存储过 程,可 以 在 CREATE PROCEDURE语句中 使用OR REPLACE 选项,使新版本覆盖 旧版本。 SQL> create or replace procedure sample_proc is 2 begin 3 4

dbms_output.put_l ine(,Hello World*); end sample proc;

5



过程已创建。

创建存储过程后,用 户就可以调用该存储 过程。用 户 可 以 在 PL /SQ L 程序块中调用



7 存储过程、触发器 和程序包



存储过程,也 可以 在直接在SQ L*Plus中 使 用 EXECUTE语句调 用存储过程。例如 ,下 面的代码将在一 个匿名块中调用 存储过程SAMPLE_PROCo SQL> set serverout on SQL> begin 2 sample_proc; 3 end; 4 ∕ Hello World P L / S Q L 过程已成功完成。

在 该 匿 名 程 序 块 中 ,可 以 直 接 在 B E G IN -E N D 部 分 使 用 过 程 名 调 用 存 储 过 程 SAM PLE_PROC»在 SQL*Plus中使 用 EXECUTE语句直 接调用存储过程 的形式如下: SQL> execute sample_proc; Hello World P L / S Q L 过程已成功完成。

也可以采用简写形 式: SQL>exec sample_proc;

如果在创建存储过 程时出现了错误 ,则 可 以 使 用 SHOW E R R O R S命令显示创建时 所产生的错误。例 如,修改存储过 程SA M PLE_PR O C ,省略输出语句的 引号,则在编译 时会出现如下错误 : SQL> create or replace procedure sample_proc is 2 begin 3 dbms_output.put_line(Hello World); 4 end sample_proc; 5 ∕

警告:创建的过程带有编译错误。

为了查看错误的详 细信息,可以随 后输入SHOW ERROR命令以显 示错误信息。 SQL> show error PROCEDURE SAMPLE_PROC 出现错误: LINE/COL ERROR 3/30

PLS-00103: 出 现 符 号 "WORLD”在需要下列之一时: . ( ) , * 0 % & = - + at in is mod remainder not rem => or != or ~= >= create or replace procedure add_employee( 2 id_param in number, 3

148

4

name_param in varchar2 r job_param in varchar2 z

5

hire_param in date,

6

salary_param in number) is

7

begin

8

insert into scott.emρ(emρnoz ename z job f hiredate,sal) values(id_param,name_param,j ob_param z hire_param,sal ary_param);

9 10

end add_emp1oyee;

11



过程已创建。

在为存储过程定 义参数时,参数的 数据类型不能包 括大小和精度信 息。在调用该存 储过程时,用户需要传递一 系列参数,以便过程的执行 部分使用这些参 数向SCOTT.EMP 表添加一条记录 。在调用存储过 程时有3 种向其传递参数 的方法:名称表 示法、位置表 示法和混合表示 法。 □ 名称表示法 名称表示法是指 为各个参数传递 参数值时指定传 入数值的参数名 。使用名称表示法 传递参数的语法 形式如下: prcedure_name( param_name=>va lue[,param_nam e=>value]);

例 如 ,下面的示例使 有名称表示法传 递参数以调用存 储过程ADD_EM PLOYEE« SQL> alter session set nls_date_format = 会话已更改。

, yyyy-mm-dd , ;

SQL> begin 2 add_employee(i d_param=>8000 f name_param = > ,A T G , , 3 job_param = > , CLERK , ,hire_param = > , 1997-12-20 1 ,

第 7 存储过程、触发器和程序包 4 5 6

salary_param =>1500); end; ∕

P L / S Q L 过程已成功完 成。

通过名称传 递法传递参 数的好处:规定了各个 值被赋予哪 个参数。 由于明确指 定了向各个 参数传递的 值,因此在 调用过程时 就不需要再 考虑创建过 程 时定义的参 数顺序。在 使用名称表 示法时,参 数命名的合 理性可以方 便用户阅读 、查阅 以及调试代 码。 下面使用打 乱次序的参 数调用过程 ,查看它是 否能够正常 运行。 SQL> exec add_employee(name_param = > ,L I , ,job_param = > ,CLERK , , hire_param = > , 1999-10-2 0 , r id_param=>8120,salary_param =>1500); SQL> select empno,ena me z job,hired ate sal z 2 from emp 3 where empno>8000;

□ 位置表示法 当参数比较 多时,通过 名称表示法 调用过程时 可能会非常 长。为了克 服名称表示 法 的弊端,可 以采用位置 表示法。采 用位置表示 法传递参数 时,用户提 供的参数值 顺序必 须与过程中 定义的参数 顺序相同。 例如,下面 的程序使用 位置表示法 传递参数调 用 ADD_EMP LOYEE 过程。 SQL> exec add_employee (8021,' 刘 丽 一 SALESMAN I

, 1995-10-1

7 'z 2000);

P L / S Q L 过程已成功完 成。 J LA⅜Γ⅝'

注 意 ---------------------------------------------------------"*,⅛,i

在使用位置表 示法传递参数 调用过程时,用户需要确定 过程中定义的 参数的次序,如果 传 递 参 数 的次序 与定 义时 的次 序不相 同,则调 用过 程 可 能 会 失 败 ,也可能得到 难以预料的 结果 。

前面说过,存储过程会 被保存在数 据库中,这 也就意味着 可以像使用 DESCRIB E 命 令列出表的 结构一样使 用 DESCRIB E 命令列出关 于存储过程 的详细信息 。在调用存储 过 程时,可 以 使 用 DESCRIB E 命令来查看 过程定义的 参数次序。 □ 混合表示法 从上面的示 例可以看出 ,位置表示 法和名称表 示法各有自 己的优缺点 ,为了弥补这 两者的不足 ,还可以采 用混合表示 法发挥两者 的优点。下 面的示例采 用混合表示 法调用 存储过程 ADD_EMPLOYEEo SQL> exec add_employee (8022, job_param => , clerk , , salary_param=>3000) P L / S Q L 过程已成功完 成。

, ,hire_par

am = > , 1996-11-17 , ,

149

Oracle 11g中文版数据库管理、应用与开发标准 教程 在上面的程序中,两个参数采用了位置表 示法传递值,随后则切换为名称表示法 传递参数。当切换为名称表示法传递参数 后,后续的参数也必须使用名称表示法。这就 是说,当 ADD_EMPLOYEE过程的第三个参数采 用名称表示法传入值时,其 第 4 、5 个 参数也必须使用名称表示法。 2. O U T 参数 O U T 类型的参数由存储过程传入值,然后由用 户接收参数值。下 面 通 过 SCOTT.EMP 表创建一个搜索过程,该过程将根据提供 的EM PNO列的值检索雇员的ENAM E和 SAL。 SQL> create or replace procedure search_employee( 2 empno_param in number, 3

name_param out emp.ename%type,

4

salary_param out emp.sal%type)

5

begin

6

select ename r sal

7

into name_param,salary_param

8

from scott.emp

9

150

where empno=empno_param;

10

exception

11

when no_data_found then

12

is

name_param:= ,NULL , ;

13

salary_param:= -1;

14

dbms_output ∙ p u j l i n e 「未找至∣ J指定编号的员工信息!,) ;

15

end search_employee;

16



过程已创建。

因 为 过 程 要 通 过 O U T 参数返回值,所以在调用它时必须提供能 够接收返回值的变 量 。因 此 ,在 编 写 P L /S Q L 匿 名 程 序 块 时 需 要 定 义 两 个 变 量 接 收 返 回 值 ,而在使用 SQL*Plus调用过程时,需 要 使 用 VARIABLE命令绑定参数值。 下 面 的 语 句 在 S Q L * P lu s中 使 用 VA RIABLE命 令 绑 定 参 数 值 ,并调用存储过程 SEARCH_EMPLOYEE。 SQL> variable name varchar2 (10); SQL> variable sal number; SQL> exec search_employee(7499,:name,:sal); P L / S Q L 过程已成功完成。

为了查看执行结果,可 以 在 SQL*Plus中 使 用 PR IN T命令显示变量值。 SQL> print name NAME ALLEN



7 存储过程、触发器 和程序包 SQL> print sal SAL 1600

也可以通过如下SE LECT语句检索绑定 的变量值。 SQL> select :name,:sal 2 from dual; :NAME

:SAL

ALLEN

1600

在匿名程序块中调 用存储过程SEARCH EM PLOYEE的形式如下: SQL> set serverout on SQL> declare 2 name emp.ename%type; 3 sal emp.sal%type; 4 begin 5 search_employee(7499,name,sal); β dbms_output.p u t (, :, II name); 7 dbms_output.put_ line(, 薪 金 :, ∣∣ sal); 8 end; 9 姓名: A L L E N 薪 金 :1600 P L / S Q L 过程已成功完成。

需要注意,在调 用 具有 O U T 参数的过程时,必 须 为 O U T 参数提供变量,即 使 OUT 参数在过程中没有 设置返回值,调用 时也必须为其提供 接收变量,否则调 用过程将会因 为返回值无法保存 而出现错误。如果 用户使用常量或表 达式调用这种类型 的过程时,系 统将出现如下错误 。 SQL> set serverout on SQL> declare 2

name emp.ename%type;

3

begin

4

search_employee(74 99 z name z 1200);

5

end;

6



search_employee(7499,name,1200); * 第 4 行 出现错误: ORA-06550:第 4 行 ,第 29 歹h PLS-00363:表 达 式 , 1200 , 不能用作赋值目标 ORA-06550:第 4 行 ,第 3 歹U: PL/SQL: Statement ignored

151

--------------------- Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程 3.

IN O UT 参数

对 于 I N 参数而言,它可以接收一 个值,但是不能在过 程中修改这个 值。而 对 于 OUT 参数而言,它 在调用过程时 为空,在过程 的执行中将为 这参数指定一 个值,并在执行结 束后返回。而 IN O U T 类型的参数同 时具有I N 参 数 和 O U T 参数的特性,在调用过程时 既可以向该类 型的参数传入 值,也可以从 该参数接收值 ;而在过程的 执行中既可以 读取 又写入该类型 参数。 使用这种类型 参数的一个典 型示例就是交 换两个数的位 置。下面的程 序实现了交换 两个数据的位 置。 SQL> create or replace procedure swap( 2 numl_param in out number, 3 num2_param in out number) is 4 var_temp number; 5 begin 6 var_temp:=numl_param; 7 numl_param:=num2_param; 8 num2_param:= var_temp; 9 end swap; 10 ∕

152

过程已创建。

在 上 面 的 SW AP过程中为了 完成了交换两 个数的位置, 需要同时向它传入两个参数, 在交换完成后 还需要同时返 回两个参数,所以将它们定 义为IN O U T 类型的参数。下面 将编写匿名程 序块来调用SW A P过程完成数据 之间的交换。 SQL> set serverout on SQL> declare 2 var_max number:=23; 3 var_min number:=45; 4 begin 5 if var_max < var_min then 6 swap(var_max z var_min); 7 end if; 8 dbms_output.put_line(var_max ∣ ∣ 9 end; 10 ∕ 45>23

,> ,

∣ ∣ var_min);

P L / S Q L 过程已成功完成 。

上面的程序在 初始化变量V AR M A X 和 VAR M Π M 时 设 置 V A R _ M A X 的值小于 " ∖ R _M IN 。在 调 用 SW A P过程交换两个 数后,使得 变 量 V A R _ M A X 的值大于VAR _M IN 的值。 这 种 IN O U T 参数虽然非常 灵活,但是也 带来了一些问 题,用户对数 据的控制比较 困难,当出现 问题时,程序 将变得很难维 护和调试。因 此,一 般 不 推 荐 使 用 IN OUT 参数。



7 存储过程、触发器和程序包

φ - ι7 .1 .3 默 认 值 ) 存储过程的参数 也可以是默认值 ,这样当调用该 过程时,如果未 向参数传入值,则 该参数将使用定 义的默认值。例 如,下面修 改 ADD_EMPLOY EE 存储过程,为其中的参 数提供默认值。 SQL> create or replace procedure add_emp1oyee ( 2 id_param in number, 3 name_param in varchar2 z 4 job_param in varchar2 default , SALESMAN* r 5 hire_param in date default sysdate r 6 salary_param in number default 1000) is 7 begin 8 insert into scott.e m p (empno,ename,job,hiredate,sal) 9 values(id_para m f name_param r job_param,hire _param z salary_param); 10 end add_emp1oyee; 11 ∕ 过程已创建。

修改 ADD EMPLOYEE 过程后,为 JOB PARAM, HIRE PARAM 和 SALARY_ P A R A M 参数设置了默认 值。这样在调用 该存储过程时,用户就不必再为 这些参数提供 值 。例如: SQL> begin 2 add_emp1oyee (8124, '苏 姗 ’) ; 3 end; 4 ∕ P L / S Q L 过程已成功完成。 SQL> select empno,ename,job,hiredate, sal 2 from scott.emp 3 where emρno=8124; EMPNO — 8124

ENAME 苏姗

JOB SALESMAN

HIREDATE —

SAL — ——.

30-4 月 -08

1000

只 有 IN 参数才具有默认值 ,OUT和 IN O U T参数都不具有默认 值.

在为参数定义默 认值时,一般建 议将没有默认值 的参数放在参数 列表的开始位置 , 其 后 是 O U T 类型的参数,然 后 是 IN O U T 类型的参数,最后才是具有默 认值的 I N 参数。 采用这种方法定 义参数后,可以 让调用者在执行 存储过程时使用 位置表示法传递 参数。 考虑如下存储过 程:

153

---------------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 create or replace procedure insert_into_emp( job_param in varchar2 default , salesman , , id_param in number, hire_param in date default sysdate, name_param in varchar2 z salary_param in number default , 1000 , )

在上面的程序中,必须提供的参数是 I D 和 N A M E , 但是由于它们分别是第二个和 第四个参数,所以为调用这个过程,即使用户想要使用默认值,也需要使用名称表示法。 因此,设置良好的参数次序可以方便用户调用存储过程。

t - - 7.1.4

过程中的事务处理

\

当 在 SQL*Plus 中进行操作时, 用户可以使用 COMMIT 语句将事务中的所有操作"保 存 ”到数据库中。如果用户需要撤销所有的操作,则 可 以 使 用 ROLLBACK 语句回退事 务中未提交的操作,使数据库返回到事务处理开始前的状态。在 P L /SQ L 过程中,不仅 可 以 包 括 插 入 和 更 新 这 类 的 D M L 操 作 ,还 可 以 包 括 事 务 处 理 语 句 C O M M IT 和 ROLLBACKo

154

O racle 支持事务的嵌套,即在事务处理中进行事务处理。在嵌套的事务处理过程中,

子事务可以独立于父事务处理进行提交和回滚。对于过程而言,每个过程就相当于一个 子事务,用户可以在自己事务处理的任何地方调用该过程,并且无论父事务是提交还是 回滚,用户都可以确保过程中的子事务被执行。 下面通过一个示例演示过程中的事务处理。 ( 1 ) 以用 户 SCOTT 身份连接到数据库,并建立两个表 TEM P 和 LOG_TABLEo SQL> create table temp(n number);

表已创建。 SQL> create table log_table( 2 username varchar2(20), 3 message varchar2(4000));

表已创建。

( 2 ) 建立一个存储过程 INSERT_INTO_LOG,用 于 向 表 LOG_TABLE 添加记录。 SQL> create or replace procedure insert_into_log(msg_param varchar2) is 2 pragma autonomous_transaction; 3 begin 4 insert into log_table(usernamef message) 5 values(user,msg_param); 6 commit; 7 end insert_into_log; 8 ∕

过程已创建。



7 存储过程、触 发器和程序包 其中,PRAGMA AUTONOMO US_TRANSA CTION 语句表示自动 开始一个自治 事 务 ,实际上该语 句也可以省略 。 ( 3 ) 在匿名程序块 中调用 INSERT_INTO _LOG 过 程 向 L O G J A B L E 表中添加数据 ,

并 使 用 INSERT 语 句 向 表 TEM P 添加数据。 SQL> begin 2 insert_into_log (,添 加 数 据 到 TEMP表 之前调用 , ); 3 insert into temp 4 values(1); 5 insert_into_log (,添 加 数 据 到 TEMP表 之 后调用 , ) ; 6 7 8

rollback; end; ∕

P L / S Q L 过程已成功完成 。

由 于在 INSERT_INT O_LOG 过程中使用 COMMIT 语句提交了过 程中的事务, 因此 当匿名程序块 中的父事务回 滚时,存储过 程已经向 LOG√ΓABLE 表提交了添加 的数据。 这里需要注意 ,如果在中间 使用 INSERT 语句添加数据 ,那 么 该 INSERT 语句是否会随 子过程中事务 的提交而被提 交呢?下面对 表中的数据进 行分析。 SQL> select * from temp; 未选定行 SQL> select * from log_table; USERNAME

SCOTT SCOTT

MESSAGE

添 加 数 据 到 TE MP 表之前调用 添 加 数 据 到 TEM P 表之后调用

从结果中可以 看出,在 TEM P 表中并没有记 录,这 说 明 INSERT 语句被撤销了 。而 在 表 LOGJTABLE 中则包含了两 条记录,这说 明过程中的子 事务已经被提 交,即过程中 的子事务与父 事务可以互相 不干涉地运行 。

函数与过程非 常类似,它也 是一种存储在 数据库中的命 名程序块,并且函数也可以 接收零个或多 个输入参数。 函数与过程之 间的主要区别 在于,函数必 须有返回值,并且 可以作为一个 表达式的一部 分,函数不能 作为一个完整 的语句使用。函数返回值的数据 类型在创建函 数时定义,定 义函数的基本 语法如下: create [or replace] function function_name (parameter [ parameter]) z returne data_type is [local declarations]

Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 begin execute statements [exception exception handlers] end [function_name]

存储过程和函数 之间的主要区别 有两处:第一处是 在函数头部必须 使用RETURN子 句指定函数返回 的数据类型;另 一处是在函数体 内,在函数体内 的任何地方都可 以使用 RETURN语句返 回结果值,返回 值的数据类型必 须与函数头部声 明的相同。 例 如 ,下面创建了一 个用于求平均数 的函数。 SQL> create or replace function average(numl number,num2 number) 2 return number is 3

res number;

4

begin

5

res:=(numl+num2)/2;

6

return(res);

7

end average;

8



函数已创建。

调用函数与过程 不相同,调用函 数时必须使用一 个变量来保存返 回的结果值,这样 函数就组成了表 达式的一部分。这也意味着函数 不能像过程那样 独立地调用,它 只能作 为表达式的一部 分来调用。例如 ,在下面的匿名 程序块中调用函 数A V E R A G E ,以获取 两个数的平均值 。 SQL> set serveroutput on SQL> declare 2 avg_number number; 3

begin

4

avg_number:=a verage(45,59);

5

dbms_output.p ut_line(avg_n umber);

6 7 52

end; ∕

P L / S Q L 过程已成功完成。

理 论 上 ,在 函 数 中 也 可 以 使 用 O U T 类 型 的 参 数 ,但 是 如 果在 函 数中 同 时 使用 RETURN返 回 值 和 O U T 参数很容易产生 混淆。所以 ,在创建函数时 应该使用RETURN 语句返回一个单 独的值,而 将 O U T 参数用于过程中 。

哈 触发器 触发器是关系数 据库系统提供的 一项技术,触发 器类似于过程和 函数,它们都包 括 声明部分,执行 逻辑处理部分和 异常处理部分,并且都被存储在 数据库中。



7

存储过程、触 发器和程序包 --------

r - 7 . 3 . 1 触发器概述 触发器是与一 个表或数据库 事件联系在一 起的,当特定 事件出现时将 自动执行触发 器的代码块。触发器与过程 的区别在于:过程是由用户 或应用程序显 式调用的,而触发 器是不能被直 接调用的。 触发器能够执 行的功能包括 以下几个方面 。 □ 自动生成数据。 □ 强制复杂的完 整性约束条件 。 □ 自定义复杂的 安全权限。 □ 提供审计和日 志记录。 □ 启用复杂的业 务逻辑。 与过程和函数 不同,在创建 触发器时还需 要指定触发器 的执行时间和 触发事件。创 建触发器的语 法规则如下: create [ or replace ] trigger trigger_name [before ∣ after ∣ instead of] trigger_event [for each row[when tigger_condi tion]] begin trigger_body end trigger_name;

创建触发器的 主要参数包括 以下几个。 □

BEFORE | AFTER ∣ INSTEAD O F 用于指定触发 器的触发时间 。BEFORE指定在 触发事件之前 执行;AFTER 指定在触发事 件执行之后执 行;INSTEAD O F 指定 触发器为替代 触发器。



TR IG G ER EV EN T指定引起触发 器运行的触发 事件。



TABLE_NAM E指定与触发器 相关的表名称 。



FOR EACH R O W 指定触发器为 行级触发器,表示该触发器 对影响到的每 一行数 据都触发执行 一次。如果未 指定该条件,则表示创建语 句级触发器,这时无论 影响到多少行 ,触发器都只 会执行一次。

TRIGGER CONDITION指 定触发器应该 满足的条件。 O racle对触发器 的功能进行了 扩展,不仅对 表或视图的D M L 操作会引起触 发器的 □

运行,而 且 对 O racle系统的操 作也会引发触 发器的运行。根据触发器的 触发事件和触 发 器的执行情况 ,可 以 将 Oracle所支持 的触发器分为 如下几种类型 。 □

行级触发器

行级触发器对 D M L语句影响的每 一行执行一次 。



语 句 级 触 发 器 语句级触发器 对每个D M L 语句执行一次 。



I N S T E A D O F 触发器 此触发器是定 义在视图上的 ,而不是定义 在表上。它是 用来替换所使 用实际语句的 触发器。



系统事件触发器

系统事件触发 器就是在O racle数据库系 统的事件中进 行触发

的触发器,如 上面曾说过的 O racle系统的启 动与关闭等。

157

--------------- Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程 □ 用户事件触发器 用户事件触发 器是指与数据 库定义语句D D L 或用户的登录/ 注销等事件相 关的触发器,如用户连接到 数据库、修改 表结构等。 ∙1 T ∕ .θ .z

1口 口J 狼 胭 瓦 希 --、

如果在创建触 发器时未使用 FOR EACH R O W 子句,则创建 的触发器为语 句级触发 器 。语句级触发 器在被触发后 只执行一次,而不管这一操 作会影响到数 据库中多少行 记录。 下面是一个简 单的语句级触 发器,该触发 器将记录用户 对SCOTT.EM P表的操作。 ( 1 ) 以 SC O T T身份连接到 数据库,建立 一个日志信息 表EM P_LOG用于存储用户 对表的操作。 SQL> connect scott/tiger 已连接。 SQL> create table emp_log( 2 who varchar2(30)z 3 when date);

158

表已创建。

( 2 ) 在 E M P 表上创建语句 级触发器, 将 用 户 对 E M P表进行的操 作记录到EM P_LOG 表中。 SQL> create or replace trigger emp_op 2 before insert or update or delete 3 on emp 4 begin 5 insert into emp_log(who,when) 6 values(user ,sysdate); 7 end emp_op; 8 ∕ 触发器已创建

( 3 ) 更 新 E M P表 ,增 加 员 工 10%的薪金,确认触发器是 否能够正常运 行。 SQL> update emp 2 set sal=sal*l.1; 已更新15行。 SQL> select * from emp_log; WHO

WHEN

SCOTT

01-5 月 -08

从上面的查询 结果可以看出 ,触发器准确记 录了用户在何 时对表进行了 操作。另外, 还有一点需要 注意,上 面 的 UPDATE语句 更新了多行数 据,而触发器 仅向表EMP_LOG 中添加了一行 记录,这就是 语句级触发器 的特点。

存储过程、触发器 和程序包 在 上 面 的 E M P J D P 触发器中使用了多 个触发事件,这就 需要考虑一个问题 ,如何确 定是哪个语句导致 了触发器的激活?为了确定触发事件 可以使用条件谓词 ,条件谓词由 一个关键字 IF 和 谓 词 INSERTING> U P D A T I N G 和 D E L E T I N G 构成。如果值为真 ,那么 就是相应类型的语 句触发了触发器。 begin if inserting then - Insert语句触发 elsif updating then - update 语句触发 elsif deleting then 一 delete 语句触发 end if; end;

此外,还 可 以 在 U P D A T E 触发器中使用条件 谓词,判断特定列 是否被更新。例如, 如果要记录用户对 J O B 列的更新,可以使 用如下形式的语句 : if updating(job) then --do something end if;

条件谓词的使用可 以让触发器的编写 者更加有力地控制 触发器的执行。Oracle允许 使用条件谓词在多 个事件上建立触发 器,并且只需要建 立一个触发器就可 以控制用户的 所有操作。但 是 ,这并不是一个好 的建议,因为当需 要修改触发器时, 由于触发器需要 执行多个任务,可 能会造成混淆。然 而,这里需要记录 用户对表的所有操 作,所以将多 个事件合并到一个 触发器中。 下面将修改触发器 E M P _ O P 和日志信息表 E M P _ L O G , 以便能够记录操作 的类型。

(1) 修 改 E M P J O G 表 ,为其添加 A C T I O N 歹∣J,以便能够存储用户 对表进行的操作。 SQL> alter table emp_log 2 add (action varchar2(50)); 表已更改。

SQL> desc emp_log 名称



是否为空?

WHO WHEN ACTION

类型

VARCHAR2(30) DATE VARCHAR2(50)

( 2 ) 修改触发器以便记 录语句的类型。 SQL> create or replace trigger emp_op 2 before insert or update or delete 3 on emp 4 declare 5 var_action varchar2(50); 6 begin

159

--------------- Oracle 1 1 g 中文版数据 库管理、应 用与开发标 准教程 7 8 9 10 11 12 13 14 15 16 17

if inserting then var_action :=•INSERT ,; elsif updating then var_acti on:= ,UPDATE , ; elsif deleting then var_acti on:= , DELETE , ; end if; insert into emp_log(who,when,action) values(u ser,sysd ate z var_acti on); end emp_op; ∕

触发器已创 建

( 3 ) 更新某雇员 信息,测试 触发器的执 行情况。 SQL> update emp 2 set sal=sal * 1 .2 3 where empno=7369; 已 更 新 1 行。

160

SQL> select * from emp_log; WHO

WHEN

ACTION

SCOTT

02-5 月 -08

UPDATE

(4 ) 在 E M P 表中删除一 行记录,查 看触发器的 运行情况。 SQL> delete emp 2 where empno=8124; 已 删 除 1 行。 SQL> select ♦ from emp_log; WHO SCOTT SCOTT

WHEN 02-5 月 -08 02-5 月 -08

ACTION UPDATE DELETE

从查询结果 可以看出,触发器成功 地使用谓词 判断出了触 发事件,并将其记录到了 日志记录 表EM P_LOG中 。 如果仔细观 察上面创建 的触发器,可以发现在 触发器中指定了 BEFORE 关键字,即 语句执行前 被触发,这 使得它非常 适合于强化 安全、启用 业务规则、进行日志操 作等。 虽然也可 以使用A FTER关键 字,但是最好 不要用AF TER语句触 发器进行安 全检查。因 为这种触 发器会在 O racle执行 操作后再触 发,如果随 后的安全检 查失败,则可能还需要 撤销改变,这将导致数 据进行不必 要的回退工 作。因此,可以根据自 己的实际需 要指定 语 句 触 发器 是之前触 发(BEFORE)还 是 之 后 触 发 ( AFTER) 。

存储过程、触发器和 程序包

φ--7.3.3

行 级 触 发 器 -、

在创建触发器时,如果使用了 FOR EACH R O W 选项,则创建的触发 器为行级触发 器 。对于行级触发器而 言,当 一 个 D M L 语句操作影响到数据 库中的多行数据时,行级 触发器会针对于每一 行执行一次。 行级触发器有一个很 重要的特点,那就是 当创建BEFORE行 级触发器时,可以在触 发器中引用受到影响 的行值,甚至可以在 触发器中设置它们。 下面将在表上创建一 个行级触发器,并 使 用 一 种 数 据 库 对 象 (序 列 )生 成 主 键 值 。 这是非常常见的FO R EACH R O W 触发器的用途。 ( 1 ) 创建一个测试表F 0 0 以及随同使用的序列 , 序列的作用是自动生 成一组排序数。 SQL> --创建一个表 SQL> create table foo(sid number,sname varchar2(20)); 表已创建。 SQL> 一创建序列 SQL> create sequence seq_foo; 序列已创建。

(2 ) 创建生成主键的行级 触发器。 SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14

create or replace trigger foo_trigger before insert or update of sid on foo for each row一行级触发器 begin if inserting then select seq_foo.nextval into :new.sid from dual; else raise_application_error ( -20020z , 不允许更新工D 值 !, ); end if; end; ∕

触发器已创建

(3 )尝 试 向 表 F O O 添加两行数据,以测 试触发器是否能够成 功运行。 SQL> insert into foo( sidz sname) 2 values ( 1,, 董鹏'); 已 创 建 1 行。 SQL> SQL> insert into foo( sname) 2 values (,文廊 , ); 已 创 建 1 行。

161

Oracle 1 1g中文版数 据库管理、应用与开发 标准教程 SQL> select ♦ from foo; SID SNAME

董鹏 刘丽

1 2

从查询结果 中可以看出 ,无 论 是 否 为 S I D 列提供值,S I D 列 都 会 使 用 SEQ_FOO. NEXTVAL 的值,这是因为在表中引用了:NE W.SID值 。 在行级触发 器中,可以 访问受到影 响的行值,这主要通过 引用列名称 的相关性标 识 符来实现。通过引用具 有相关性标 识符的列,可以获取语 句执行前执 行后的值。前映像 的默认相关 性标识符为 :O L D ,后映像的相关性标识符为:NEW 。在引用受影 响的行值时 , 需要注意以 下几点。 □ 在 INSERT触 发器中,由 于不存储先 前的数据,所以不能使 用前映像: O L D ,只 能使用后映像:NEW。 □ 与此相反,在 DELETE触发器中没有后映像:N E W 的值。 □ 对 于 UPDATE触 发器而言,同时具有各个列的前映像值:N E W 和后映像值 :OLD。 在定义触发 器时,可以 使 用 REFEREN CING子句 改变列的相 关名称。例 如,下面的 示 例 将 使 用 REFEREN CIN G子 句 指 定 相 关 性 标 识 符 的 名 称 重 新 定 义 触 发 器 F 0 0 _

162

TRIGGERo SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

create or replace trigger foo_trigger before insert or update of sid on foo referencing new as new_value old as old_value for each row一行级触发器 begin if inserting then select seq_foo.nextval into :new_valu e.sid from dual; else raise_application_error ( -20020, ,不允许更新工D 值 !'); end if; end; ∕

触发器已创建

通常不是必须重命名:N E W 和:OLD, O racle提供这 个功能是为 了避免混淆 相似的命 名对象。因 此,如果没 有必要,应 该尽量避免 改变相关名 称。

7.3.4

instead of 触发器

INSTEAD O F 触发器也称 替代触发器 ,定 义 INSTEAD O F 触发器后,用户对表的 D M L 操作将不再 被执行,而 是执行触发 器主体中的 操作。通常 情况下,INSTEAD OF 触发器是定 义在视图上 的,而不是定义 在表上,它是用来替 换所使用实 际语句的触 发器。

第 7

存储过程、触 发器和程序包 -------因为一个视图 通常由多个基 表连接而成,这 种 视 图 不 允 许 进 行 INSERT> UPDATE 和 DELETE 这 样 的 D M L 操作。当为视 图编写 INSTEAD O F 触发器后,用户对视图的 D M L 操作就不会被 执行,而 是 执 行 触 发 器 中 的 P L /S Q L 语 句 块 ,这样就可以 通过在 INSTEAD O F 触发器中编写 适当的代码对 构成视图的各 个表进行操作 。 替代触发器与 其他触发器类 似,只是在触 发器定义的头 部使用 INSTEAD O F 子句。 下面通过一个 示例来演示 INSTEAD O F 触发器的应用 。 ( 1 ) 创建一个视图 ,显示雇员的 基本信息和所 在部门的名称 。 SQL> connect system/admin 已连接。 SQL> grant create view to scott; 授权成功。 SQL> connect scott/tiger 已连接。 SQL> create view emp_dep_view 2 as select empno,ename ,job,sal z dname 3 from emp,dept 4 where em p .deρtno=dept.deptno; 视图已创建。

(2 ) 如果试图向表 中添加记录,则由于视图引 用了两个基表 ,添加记录将 失败。 SQL> insert into emp_dep_vie w(empnof ename z job,sal,dname) 2 values (8000, , ≡ ≡ ' f 'MANAGER 1 z 1500, , SALES , ); insert into emp_dep_vie w(empno,ename,job,sal,dname) * 第 1 行出现错误: ORA-01776:无 法通过联接视图 修改多个基表

(3 ) 为 视 图 EMP_DEP_V IEW 创 建 一 个 INSTEAD O F 触发器,以便使用自定义的 操 作覆盖系统预 定义的操作。 SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

create or replace trigger insert_emp_deb_trigger instead of insert on emp_dep_view for each row declare var_deptno emp.deptno% type; begin insert into e m p (empno,ename z job,sal) values(:new .empno z :new.ename z :new.job,:ne w.sal); select deptno into var_deptno from dept where dname=:new.dname; update emp

163

Oracle 11g中文版数 据库管理、应 用与开发标准 教程 17 18 19 20

set deptno=var_deptno where empno=:new.empno; end insert_emp_deb_trigger; ∕

触发器已创建

( 4 ) 使用同样的语 句测试触发器 ,并查看触发 器的运行情况 。 SQL> insert into emp_dep_view(empno,ename,job,sal,dname) 2 values (8125, , ≡ B ' z 'MANAGER ,,1500, , SALES , ); 已 创 建 1 行。 SQL> select empno z ename,job z sal z dname 2 from emp_dep_view 3 where dname= , SALES , ; EMPNO 7499

164

ENAME ALLEN

JOB SALESMAN

SAL 1600

DNAME SALES

已选择7 行。

视 图 EMP_DEP_V IEW显示了雇 员的基本信息 和所在部门的 名称,向该视图添加数 据 ,本意是将雇员 的基本信息添 加到EMPLO YEES表,并使 用部门名称对 应的部门号添 加 到 E M P表 的 D E PT歹 !] 。当直接通过视 图添加数据时 ,系统无法预知 用户添加数据 的本 意,所以需要 使用INSTEAD O F 触发器替换系 统预定义的操 作。

注 M ----------------------------------------------------------------------------------在 创 建 INSTEAD O F 触发器时,没 有 BEFORE和 A FT E R 关键字规定触发 时间。实际上, I INSTEAD O F 是等同于使用A FTER关键字的 行级触发器, 它会为每个受到 影响的行触发一 次.

用户事件触发 器是建立在模 式级操作上的 触发器。激活 该类型触发器 的用户事件包 括 :CREATE、ALTER、DROP> ANALYZE、ASSOCIATE STATISTICS, DISASSOCIA TE、 STATISTICS> COMMENT. GRANT. REVOKE. RENAME. TRUNCATE> LOGOFF, SUSPEND 和 LOGON» 下面的示例将 创建一个用户 模式级触发器 ,以记录用户 删除的数据库 对象。 (1) 以 SCOTT身份连 接到数据库,并建立一个日 志信息表。 SQL> create table droped_obje cts( 2 object_name varchar2(30)z 3 object_type varchar2(30)z 4 dropped_on date); 表已创建。

存储过程、触 发器和程序包 -----------( 2 ) 创建用户事件 触发器,以便 记录用户删除 的数据库对象 。 SQL> create or replace trigger 1og_drop_trigger 2 before drop on scott.schema 3 begin 4 insert into droped_objects values( 5 o ra_di ct_ob j_n ame λ 6 ora_dict_obj_type, 7 sysdate); 8 end; 9 ∕ 触发器已创建

在编写用户事 件触发器时,经常会需要使 用一些事件属 性函数,例如 ,上面示例中 的 ORA_DICT_O BJ_NAME和 ORA_DICT_O BJ_TYPE函数 。常用的事件 属性函数如表 7 -1 所示。 密

表 7 - 1 事件属性函数

I 事件属性函数 ORA_CLIENT_IP_ADDRESS

说明 返 回 客户端的I P 地址

ORA_DATABASE_NAME

返回当前数据库名

ORA_DES_ENCRYPTED_PASSW ORD

返 回 D E S 加密后的用户口 令

ORA_DICT_OB J_NAME

返 回 D D L 操作所对应的数 据库对象名

ORA_DICT_OB J_NAME_LIST(N AME_LIST

返回在事件中被 修改的对象名列 表

OUT ORA_NAME_LIST_T) ORA_DICT_OB J_OWNER

返 回 D D L 操作所对应的对 象的所有者名

ORA_DICT_OB J_OWNER_LIST (OWNER_LIST OUT ORA_NAME_LIST_T)

返回在事件中被 修改的对象的所 有者列表

ORA_DICT_OB J_TYPE

返 回 D D L 操作所对应的数 据库对象的类型

ORA_GRANTEE (USER_LIST OUT ORA_NAME_LIST_T)

返回授权事件的 授权者

ORA_INSTANC E_NUM

返回例程号

ORA_IS_ALTER _COLUMN(COL UMN_NAME

检测特定列是否 被修改

IN VARCHAR2) ORA_IS_CREATING_NESTED_TABLE

检测是否正在建 立嵌套表

ORAJS_DROP_ COLUMN(COL UMN_NAME

检测特定列是否 被删除

IN VARCHAR2) ORA_IS_SERVERERROR(ERRO R_NUMBER)

检测是否返回了 特定的O racle错误

ORA_LOGIN_U SER

返回登录用户名

ORA_SYSEVEN T

返回触发器的系 统事件名

(3 ) 删 除 SCOTT模式下 的一些表或视 图,测试触发 器的运行情况 。 SQL> drop table foo; 表已删除。 SQL> drop view emp_dep_view ; 视图已删除。

165

Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程

SQL> select * from droped_objects; OBJECT_NAME FOO EMP_DEP_VIEW

OBJECT_TYPE TABLE VIEW

DROPPED_ON 02-5 月 -08 02-5 月 -08

f ) 程序包 程序包其实就是 被组合在一起的 相关对象的集合 ,当程序包中任 何函数或存储过 程 被调用时,程序 包就被加载到内 存中,这样程序 包中任何函数或 存储过程的子程 序的访 问速度将大大加 快。例如,在 PL/SQ L程序中,为了输 出运行结果,在 程序的代码中使 用 DBMS_OUTPT .PUT_LINE语 句 。事实上,这 是 调 用 程 序 包 DBM S_OU TPU T中的 PUT_LINE过程 。DBMSJDUTPU T程序包的主要功 能就是在PL/SQ L程序中进行输入 和 输出。 程序包由两个部 分组成:规范和 包主体。在规范 中描述程序包所 使用的变量、常 量、 游标和子程序,程序包主体则完 全定义子程序和 游标。

166 f r - 7 . 4 . 1 程序包规范 对于程序包,规 范就像说明书,它说明了在程序 包中哪些过程或 函数可以使用、如 何使用。程序包 规范是必需的,并且必须在程序 包主体之前创建 。 创建程序包规范 的语法形式如下 : create [or replace] package package_name is [public_variable_declarations...] [public_type_declarations...] [public_exception_declarations...] [public_cursor_declarations...] [function_declarations...] [procedure_specifications...] end [package_name]

从上面的语法规 则可以看出,在 程序包规范中可 以包含过程、函 数、变量、异常 、 游标和类型的声 明。过程和函数 的声明只包含其 头部信息,而不 包含过程和函数 体,过 程和函数体被包 含在程序包主体 中。 下面的示例定义 了一个程序包SC OTT_EMP_PKG ,并在程序包规范 中定义了一个过 程 UPDATE SAL 和一个函数 SELECT NAME() = SQL> create or replace package scott_emp_pkg is 2 procedure update_sal(deptno_param number,sal_param number);--过程 3 function select_name (empno_param number) return varchar2;一 函数 4 end scott_emp_pkg; 5 ∕



7 存储过程、触发器和 程序包---------------程序包已创建。

在上面的程序包规范 中没有提供任何实际 的代码,只是简单定 义了过程和函数的名 称和参数,而过程和函数体被排 除在外。在程序包规范中仅显 示了程序包包含哪些 内容, 而具体的实现则包含 在程序包的主体部分 。

需要注意规范中声明的 各项目(过程、函 数 和 变 量 等 )顺 序 。如果各项目之间是无关 的, 那么项目之间的顺序是 无关紧要的。但如果一 个项目被另一个项目引 用,那么必须在程序包 规范中先声明被引用的项 目.

调用程序包内的过程 与调用独立的过程相 似,唯一的不同之处 在于调用程序包内的 过程时,还需要引用 程序包名加以限定。如 果 现 在 试 图 调 用 SCOTT_EMP_PKG 包内的 过程,则会导致如下 错误: SQL> declare 2 var dno number; 3 var_eno number; 4 var_sal number; 5 var name varchar2(20);

167 7 8

var_dno:=10; var_sal:=100;

9 scott_emp_pkg.upd ate_sal(var_dno r var_sal); 10 var_eno:=7782; 11 var_name:=scott_e mp_pkg.select_nam e(var_eno); 12 dbms_output.put_l ine(var_name); 13 end; 14 ∕ declare * 第 1 行出现错误: ORA-04067:未执行, package body ',SCOTT.SCOTT_EMP_PKG n 不存在 ORA-06508: P L / S Q L :无 法 找 到 正 在 调 用 : π SCOTT .SCOTT_EMP_PKG n 的程序单元 ORA-06512:在 line 9

该错误是因为程序包 主体不存在,这些过 程还没有实现,系统 无法确定应该执行的 操作。因此,接下来 的任务就是创建程序 包的主体。 φ--- 7.4.2 程 序 包 主 体 ,、 __ ____ _ __ _ ______ ____ ) 程序包主体包含了在 规范中声明的过程和 函数的实现代码,程 序包主体的名称必须 与规范的名称相同,这个相同的名称将规 范与主体结合在一起 组成程序包。另外,程序 包主体中定义的过程 和函数的名称、参数 和返回值等必须与规 范中声明的完全匹配 。创 建程序包主体使用 CREATE PACKAGE B O D Y 语句的形式如下: create [or replace] package body package_name is [pragma serially_reusable ;]

Oracle 1 1 g 中文版数据 库管理、应 用与开发标 准教程 [collection_type_definition ...] [record_type_definition ...] [subtype_definition ...] [collection_declaration ...] [constant_declaration ...] [exception_declaration ...] [object_declaration ...] [record_declaration ...] [variable_declaration ...] [cursor_body ...] [function_spec ...] [procedure_spec ...] [call_spec ...] [begin sequence_o f_statemen ts] end [package_name]

包主体中的 内容是私有 的,它实现 了包规范部 分定义的细 节内容,并 且对调用者是 不可见的。在包主体中 有一个比较 特殊的部分 ,即 BEG IN 表示的是一 个可选的初 始化部 分 ,它用于初 始化包中的 变量等。

168

在了解了创 建程序包主 体的语法后 ,下 面 将 为 SCOTT_EM P_PKG包创 建主体,实 现 过 程 UPDATE_SAL()和 函 数 SELECT_N AME()。代 码如下: SQL> create or replace package body scott_emp_pkg is 2 procedure update_sal(deptno_param number,sal_param number) is 3 begin 4 update emp 5 set sal=sal+sal_param 6 where deptno=deptno_param; 7 end update_sal; 8 9 function select_name(empno_param number) return varchar2 is 10 e_ename varchar2(20); 11 begin 12 select ename 13 into e_ename 14 from emp 15 where empno=empno_param; 16 return e_ename; 17 exception 18 when no_data_found then 19 dbms_outp ut.put_line (,无效的工作编号, ) ; 20 end select_name; 21 end scott_emp_pkg; 22 ∕

程序包体已创建。

为程序包创 建主体后,就可以像普 通的过程和 函数一样调 用了。 SQL> set serveroutput on

存储过程、触 发器和程序包 SQL> declare 2 var_dno number; 3 var_eno number; 4 var_sal number; 5 var_name varchar2(20); 6 begin 7 var_dno:=10; 8 var_sal:=100; 9 scott_emp_pkg.update_sal(var_dno, var_sal); 10 var_eno:=7782; 11 var_name:= scott_emp_ pkg.select_ name(var_e no); 12 dbms_output.put_line (var_name) ; 13 end; 14 ∕ CLARK P L / S Q L 过程已成功完 成。

φ - ' 7.4.3

重载 ~,

PL/SQL允许 两个或多个包 级子程序拥有 相同的名称,这 就 是 PL/SQL程序 的重载。 在通常情况 下,程序包中 的过程和函数 必须具有唯一 的名称,用于 唯一表示一个 过程或 函数。PL /SQ L允许重载,也就是说程序 包中的过程和 函数可以具有 相同的名称,但它 们的特性要有 所区别。也就 是说,过程和 函数的名称可 以相同,但是 同名过程和函 数的 参数数量、次 序和参数类型 存在区别。 下面是一个错 误的重载示例 ,因为两个过 程都只包含了 一个NUMB ER参数。 procedure f oo(paraml number); procedure f oo(param2 number);

下面的过程声 明也是非法的 ,因为从参数 的传入模式不 能区别两个过 程。 procedure f oo(paraml in number); procedure f oo(param2 out number);

以下声明的过 程是合法的。 procedure foo(paraml number); procedure foo(paraml varchar2); procedure foo(paraml number, p_paraml number); procedure foo(paraml number); function foo return number; function foo(paraml number) return varchar2;

如果过程或函 数的参数类型 不相同,但数 据类 型 属于 同一 家 族时 ,也不能对它 们进行 重载.

169

Oracle 11g中文版数据库管理、应用与开发标 准教程 例如,下面对过程的重载也是非法的,因 为 NUM BER和 INTEGER属于同一家族的 数据类型。 procedure f oo(paraml number); procedure f oo(param2 integer);

对 过 程 和 函 数 重 载 后 ,可 以 使 调 用 者 在 调 用 时 更 加 方 便 。例 如 ,O ra c le 提供的 TO_CHAR()函数就是一个重载函数。 function function function function

to_char (right date) return varchar2; to_char (left number) return varchar2; to_char(left date, right varchar2) return varchar2; to char (left number, right varchar2) return varchar2;

在 调 用 重 载 函 数 时 ,P L /S Q L 会 按 照 参 数 的 个 数 和 类 型 来 解 析 对 函 数 的 调 用 。 T O _C H A R 函数是系统自带的重载函数,用户也 可以根据需要自定义重载函数。以下示 例 将 重 载 A D D 函数,实现对各种数据类型的数据相 加。 (1) 建立程序包规范,声明重载的函数。

170

SQL> create or replace package utilities is 2 function a d d (numl number,num2 number) return number; 3 function a d d (strl varchar2 z str2 varchar2) return varchar2; 4 function a d d (datel date,afterdate number) return Date; 5 end utilities; 6 ∕ 程序包已创建。 _________________________________________________________________________________ 注意上面重载的函数,其参数和返回值的数 据类型都是不相同的。

(2 ) 为程序包创建主体,实现各个重载的 函数。 SQL> create or replace package body utilities is 2 function a d d (numl in number,num2 in number) return number is 3 result number; 4 begin 5 result:=numl+num2; 6 return result; 7 end add; 8 function a d d (strl varchar2 f str2 varchar2) return varchar2 is 9 result varchar2 (2000); 10 begin 11 result:=strl ∣ ∣ str2; 12 return result; 13 end add; 14 function a d d (datel date,afterDate number) return Date is 15 result date; 16 begin ,17 result:=datel+afterDate;

7 存储过程、触发器 和程序包------------- 18 19 20 21

return result; end add; end utilities; ∕

程序包体已创建。

上面在重载A D D 函数时,分别实现了 数字、字符串和日期 类型的值的加法运算 。 (3 ) 测试已经创建的程序 包,查看其中重载的 函数是否可以根据传 入的参数选择不 同的函数进行运算。 SQL> set serverout on SQL> begin 2 dbms_output.put_line(utilities .a d d (12,24)); 3 dbms_output.put_ line(utilities.a d d (,Hello , , , World*)); 4 dbms_output.put_ line(utilities.add(sysdate, 5)); 5 end; 6 ∕ 36 Hello World 06-5 月 -08 P L / S Q L 过程已成功完成。

从结果可以看出,重载函数后用户只 需要在调用函数时 传入不同类型的参 数值, P L /S Q L 引擎会根据参数的数 据类型决定选取哪个 函数运行。这不仅方 便了用户调用函 数 ,同时也解决了开发 者对相同功能的函数 和过程的命名困扰。

会实验指导 1 . 创建过程 本 练 习将 在 H R 模式中创建过程,并 使用过程访问其中的 数据表。 ( 1 ) 创建用于从EMPLO YEES表中查询信息 的过程。 创 建 过 程 PR IN TEM PLO YEES,该过程将显 示EMPLOYEES表 中所有员工的信息。 输入并执行如下语句 : create or replace procedure printemployees is begin for emp_cur in (select * from employees) loop dbms_output.put( emp_cur.employee _id| ∣, , ); dbms_output.put( emp_cur.last_nam e ∣∣, , ); dbms_output.put( emp_cur.job_id ∣∣, , ); dbms_output.put( emp_cur.salary ∣∣, , ); dbms_output.put_ line(null); dbms output .put line (,********************* ») ; end loop; end printemployees;

171

--------------------- Oracle 11g中文版数据 库管理、应用与 开发标准教程 ( 2 ) 调用该过程。 exec printemployee s;

( 3 ) 创建一个过程,在该过程连接查 询EMPLOYEES和 DEPARTMENT表 ,并按部 门分类显示员工 的信息。另外,该过程还需要输 入一个部门参数 。 create or replace procedure catalog_employee(catalog in varchar2) is begin for emp_one in (select * from employees where department_id=(select department_id from departments where department_na me=catalog)) loop

172

dbms_output.pu t(emp_one.employee_id ∣∣, , ); d.bms_output.put (emp_one.last_name ∣∣, , ); dbms_output.p u t (emp_one ,job_id ∣∣, , ); dbms_output.p ut(emp_one.sa lary ∣∣, , ); dbms_output.p ut_line(null) ; dbms_output.put_line (, ********************** ) ; end loop; end catalog_emplo yee;

(4 ) 运 行 CAIALOG_EMP LOYEE过程时,需要为它传入一 个参数,以指定查询特 定部门的员工信 息。 SQL> declare 2

dept_name varchar2(20): = , Shipping , ;

3

begin

4

catalog_employ ee(dept_name) ;

5

end;

6



2 . 创建触发器 本练习将创建几 种常用的触发器 。

(1) 创建一个触发器 ,无论用户插入 新记录,还 是 修 改 E M P 表 的 JO B歹∣ J , 触发器 都会将用户指定 的JOB列的值转 换成大写。 create or replace trigger modify_j ob_trigger before insert or update of job on emp for each row begin if inserting then :new.job:=uppe r(:new.job); else :new.job:=uppe r(:new.job); end if; end;

存储过程、触发器 和程序包 ( 2 ) 向 E M P表中插入数据, 以确认触发器是否 能够正常运行。 insert into e m p (empnoz ename r job,sal) values(8120 z ,LILI', , clerk , z 1250) select * from emp where empno=8120;

( 3 ) 创建一个触发器, 当 修 改 D E PT表 中 的 DEPTNO字段时,使 E M P表中的对应 值也做相应修改。 create or replace trigger modify_deptno_trigger before update on dept for each row begin update emp set deptno=:new.deptno where deptno=:old.dept no; end;

(4 ) 修 改 D E PT 表 中 的 DEPTNO字段,确 认触发器是否正常 运行。 update dept set deρtno=70 where dname= , SALES , ;

173

思考与练习 一、填空题 1 . 在下面程序的空白处填写适当的代码,

使该函数可以获取指定编号的员工薪金。 CREATE OR REPLACE FUNCTION get_sal (P_ID varchar2) is v_price number; begin select sal from emp where empno= returen v_sal; exception when no_data_found then dbms_output.put_line (,无法 找到濠编号的员工!'7; when others then dbms_outptu.put_l i ne 「发生

其他相误!,);

end get_sal;

2 . 假设有一个程序包,其中包含了两个重 载的函数 M A X 0 写出下面程序调用M A X 函数后 的运行结果。

程序包主体: create or replace package body test is function max(x in number,y in number) return number is result number; begin if x>y then result:=x; else result:=y; end if; return (result); end max; function max(x in number,y in number,z in number) return number is result number; begin

Oracle 11g中文版数据 库管理、应用与 开发标准教程 程 。下列哪一个是对该 过程的合法调用? (

result:=test. max(xr y); result:=test.max(result,z); return(result ); end max; end test;

174

C.

TEST.USERPKG(IO); TEST(10).USERPK G;

A. RETURN

B. CALL

C. SET

D. EXEC

)

CREATE OR REPLACE FUNCTION Calc_Sum (p_x number,p_y number) return number is sum number; begin sum := p_x+p_y; return sum; end;

)

. 下面哪个不是过程 中参数的有效模式 ?

) A. IN

B. IN OUT

C. OUT IN

D. OUT

3 . 如 果 存在 一 个 名为 T E S T 的过程,它包 含 3 个参数:第 一 个参数为P _ N U M 1 ,第二个参 数 为 P _ N U M 2 ,第三个参数为P_N UM3。3 个参 数 的 模 式 都 是 INo P _ N U M 1 参数的数据类型为 NUMBER , P _ N U M 2 参 数 的 数 据 类 型 是

A.

TEST( 1010,P- NUM3=> ,abc',P- NUM 2=> ,bcd')i

B.

D . 上述都对 4

. 函 数 头 部 的 R E T U R N 语句的作用是什

么? (

) A . 声明返回的数据类 型 B . 声明返回值的大小 和数据类型 C . 调用函数 D . 函数头部不能使用 RETURN语句

5 . 如果在程序包的主 体中包括了一个过 程, 但没有在程序包规 范中声明这个过程 ,那么它将 被







A . 非法的



9 (

. 下列哪一个动作不会激发触发器? A . 更新数据

B . 查询数据

C . 删除数据

D . 插入数据

10 . 在 使 用 CREATE TRIGGER语句创建 行 级 触 发 器 时 ,哪 一 个 语 句 用 来 引 用 旧 数 据 ? (

) A. FOR EACH

B. ON C. REFERENCING D. OLD 1 1 . 在创建触发器时,哪一个语句决定触 发 器是针对每一行执 行一次,还是针对 每一个语句 执行一次? ( ) A. FOR EACH B. ON C. REFERENCING D. NEW 12 . 替代触发器一般被 附加到哪一类数据 库 对象上? ( )

B . 公有的

A .表

D . 私有的 . 如果创建了一个名 为USER_PKG的程序

包 ,并在该程序包中 包含了一个名为T E S T 的过

Sum:=Calc_Sum(23,12);

)

C . 受限的

6

D.

D . 参数的数量和数据 类型不相同时

TEST(P_NUMl=> 1010, P_NUM2=>

'abc','bcd, )i C. TEST(P_NUMl=> 1010,, abc'; bcd');

EXECUTE Calc_Sum(45); EXECUTE Calc_Sum(23,12);

B . 参数的数量或数据 类型不相同时 C . 参数的数据类型和 名称不相同时

) A.

B. C.

A . 参数的名称或数量 不相同时

VARCHAR2o 下列哪一个是该过 程的有效调用? (

Calc Sum;

8 . 当满足下列哪种条 件时,允许两个过 程 具有相同的名称? ( )

VARCHAR2 , P _ N U M 3 参 数 的 数 据 类 型 是



USER_PKG.TEST (10);

调用? (

二 、选择题 1 . 下列哪个语句可以 在SQL*Plus直接调用

2

B.

)

7 . 对于下面的函数,下列哪项可以成功 地

begin dbms_output.put_line(test.max (10,32,14)); end;

(

test(10);

D.

调用程序块:

一个过程? (

A.

C . 视图 13 (

)

B . 序列

D .簇 . 条 件谓 词 在 触发 器 中 的 作 用 是 什 么 ?



7 存储过程、触发器和程序包-------------- A . 指定对不同事件执行不同的操作 B . 在 UPDATE 中引用新值和旧值 C . 向触发器添加 WHEN 子句 D . 在执行触发器前必须满足谓词条件 14 . 可以使用哪个子句来更改相关性标识符 的名称?

1 . 简述过程和函数的区别。 2 . 简述调用过程时传递参数值的 3 种方法。 3 4

. 举例说明什么是重载。 . 当调用过程时,什么样的参数可以返回

5

. 简述如何在程序包中声明私有成员和公

值?

A. REFENCING B. WHEN C. INSEAT-OF D. RENAME 15 . 如果希望执行某个操作时,该操作本身 并不执行,而是去执行另外的一些操作,那么可 以使用什么方式完成这种操作? (

A. B. C. D.

三 、简答题

BEFORE 触发器 AFTER 触发器 INSTEAD OF 触发器 UNDO 触发器



有成员。

6

. 有 1 0 0 个人围一圈,顺序排号。从 第 1

个人开始报数,凡 报 到 3 的人退出圈,问最后留 下的是原来的第几号?试编写一个函数计算。

7 . 简 述 Oracle 数据库中触发器的类型及其 触发条件。 8 9

. 描述触发器相关性标识符的作用。 . 简述替代触发器的作用。

175

第8章 管 理 表 表是最重要的数据 库对象之一,同时 也是最常用的模式 对象。由于表是存储数据的 主要手段,因此对 表的管理非常重要 。另外,通过对表 定义约束,可以用 最简单的方式 实现一些基本的应 用逻辑,同时也是 对表中数据的有效 性和完整性维护。在 Oracle 11g 系统中,表有多种类型。本章讲述最基本的 堆表,并对堆表和 约束的操作进行详 细介绍。 本章学习要点: >

定义表结构

> 数据的完整性约束

>

O racle表的特性

>

修改表

> 设置各个完整性约 束的状态 > 在表中使用大对象 类型

B

创建表

数据库中的数据是 以表的形式存储的 。数据库中的每一个 表都被一个模式( 或用户) 所拥有,因此表是 一种典型的模式对 象。在创建表时,O racle将在一个指定 的表空间中 为其分配存储空间 。

φ - 8.1.1

表结构:

表是最常见的一种 组织数据的方式,一张表一般都具有 多个列,或者称为 字段。每 个字段都具有特定 的属性,包括字段 名、字段数据类型 、字段长度、约束 、默认值等, 这些属性在创建表 时被确定。从用户角度来看,数据库中数据的逻 辑结构是一张二维 表, 在表中通过行和列 来组织数据。在表 中每一行存放一条 信息,通常称表中 的一行为一条 记录。 Oracle提供了 5 种内置字段数据类 型:数值类型、字 符类型、 日期类型、L O B 类型 与 ROW ID 类 型 。除了这些类型之 外,用户还可以定 义自己的数据类型 。常用字段数据 类型的使用方法如 下。 □ 字符数据类型 字符数据类型用于 声明包含字母、数 字数据的字段。字 符数据类型包括两 种:定长 字符串和变长字符 串。 C H A R数据类型用于存 储固定长度的字符 串。一旦定义了 C H A R 列,该列就会一直 保持声明时所规定 的长度大小。当为 该字段赋予长度较 短的数值后,其余 长度就会用空 格填充;如果字段 保存的字符长度大 于规定的长度,则 O racle会产生错误信 息。CHAR 列 的 长度范围为1〜 2 0 0 0 个字节,CH AR类型列的语法如 下: column_name

V

CHAR[(size)]

ARCHAR2数据类 型与C H A R类型相似,都用 于存储字符串数据 。但 VARCHAR2



8 ⅛

管 理 表 --------------- 类型的字段用于存 储变长,而非固定 长度的字符串。将 字 段 定 义 为 VARCHAR2数据类 型时,该字段的长 度将根据实际字符 数据的长度自动调 整;即如果该列的 字符串长度小 于定义时的长度,系统不会使用空格 填充。因此,在大多数情况下,都会 使 用VARCHAR2 类 型 替 换 C H A R 数据类型。 □ 数值数据类型 数值数据类型的字 段用于存储带符号 的整数或浮点数。O ra c le中 的 N U M BER数据 类 型 具 有精 度 PRECISION和 范 围 SCALEo 精 度 PRECISION指定 所有数字位的个数 , 范 围 S C A L E 指定小数的位数,这两个参数都是可 选的。如果插入字 段的数据超过指定 的位数,O racle将自动进行 四舍五入。例如,字段的数据类型 为N U M B E R ",1 ) , 如果插 入 的 数 据 为 123456 7 .8 9,则实际上字段中 保存的数据为1234567.9。 □ 日期时间数据类型 O racle提供的日期 时间数据类型DA TE可以存储日期 和时间的组合数据 。以 DATE 数 据 类 型 存 储 日 期 时 间 数 据 比 使 用 字 符 数 据 类 型 进 行 存 储 更 简 单 ,并且可以借助 于 O racle提供的日期时 间函数处理这类数 据。 在 O racle中,可以使用 不同的方法建立日 期值。其中,最常 用的获取日期值的 方法 是 通 过 SYSDATE函数,调用该函数可以获 取当前系统的日期 值。除此之外,还可以使 用 TO_DATE函数将 数值或字符串转换 为DATE类 型 。O racle默认的日期和 时间格式由 初始化参数NLS_ DATE_FORMAT 指定,一 般 为 DD-MON-YY。 □

L O B 数据类型

L O B 数据类型用于大型 的、未被结构化的 数据,例如,二进 制文件、图片文件和其 他类型的外部文件 。L O B 类型的数据可以直 接存储在数据库内 部,也可以将数据 存储在 外部文件中,而将 指向数据的指针存 储在数据库中。L O B 数 据 类 型 分 为 BLOB、CLOB 和 B FILE数据类型。 B L O B类型用于存储二 进制对象。典 型 的 B L O B 可以包括图像、音 频文件、视频文 件等。在 BL O B类型的字段中能 够存储最大为12 8兆兆字节的二进 制对象。 C L O B 类型用于存储字符 格式的大型对象;C L O B 类型的字段能够 存储最大为128 兆字节的字符对象 ;O racle把数据转换 成Unicode格式的 编码并将它存储在 数据库中。 B FILE类型用于存 储二进制格式的文 件;在 B FILE类型的字段 中可以将最大为 128 兆字节的二进制文 件作为操作系统文 件存储在数据库外 部,文件的大小不 能超过操作系 统的限制;B FILE类型的字段 中仅保存二进制文 件的指针,并 且 B FILE字段是只读 的, 不能通过数据库对 其中的数据进行修 改。 □

RO W ID数据类型

RO W ID数据类型被称 为“伪列类型”,用 于 在 O racle内部保存表中 每条记录的物理 地址。在 O racle内部是通过 RO W ID来定位所需记 录的。由 于 R O W ID 实际上保存的是 记录的物理地址,通 过 R O W ID 来访问记录可以获 得最快的访问速度 。为了便于使用, O ra c le 自动为每一个表建 立一个名称为R O W ID 的字段,可以对这 个字段进行查询、更 新和删除等操作,甚 至 利 用 RO W ID来访问表中的 记录以获得最快的 操作速度。 由 于 ROW ID字段是隐含的 ,用户检索表时不会 看到该字段。因此 ,在 使 用 ROWID 字段时必须显式指 定名称。

177

Oracle 11g中文版数 据库管理、应 用与开发标准 教程

φ- 8 .1 .2 创 建 表 ) 创建表时需要 使用CREATE TABLE语句。如果在用户自 己的模式中创 建一个新表, 用 户必 须具 有 CREATE TA B LE系统权限。如果要在其他 用户模式中创 建表,则必须具 有 CREATE ANY TABLE的系统 权限。此外,用户还必须在 指定的表空间 中具有一定的 配额存储空间 。 应该说,使 用 CREATE TABLE语句创 建表并不困难 ,困难在于如 何合理地确定 创 建哪些表,这 些表应该包含 哪些列以及各 列应该使用什 么样的数据类 型等。在实际应用 中,应该在用 户需求调研和 分析的基础上 ,借 助 于 E R 图等有效的工 具和手段,确认应 该创建哪些表 和准备如何创 建这些表。 例如,下面创 建一个存储公 司员工信息的 EM PLOYEE表 ,该表包括了 员工代号、 员工姓名、性 别、雇佣时间 、职位和电子 邮件等信息。 SQL> create table employees( 2 empno number(10) not null, 3 ename varchar2(20)λ 4 sex char (2), 5 salary number(8r 2), 6 hiredate date default sysdate z 7 job varchar2(10), 8 email varchar2(50)r 9 deptno number(3) not null); 表已创建。

建立表后,可 以 通 过 DESCRIBE命 令查看表的描 述。 SQL> desc employees 名称 是否为空?

EMPNO ENAME SEX SALARY HIREDATE JOB EMAIL DEPTNO

NOT NULL

类型

NUMBER(10) VARCHAR2(20) CHAR(2) NUMBER(8z 2) DATE VARCHAR2(10) VARCHAR2(50) NOT NULL NUMBER(3)

如果要在其他 模式中创建表 ,则必须在表 名前加上模式 名。例如,下 面的语句将在 H R 模式中 创建 EMPLOYEES 表 。 SQL> create table h r .employees(...);

注 意 ------------------------------------------------------注意在创建表时 ,表的各列之间 需要使用逗号隔 开。

第 8 管 理 表 --------------- — 除了上面的CREATE TABLE语句外,还可 以 在 CREATE TABLE语句中使用 嵌套子 查询,基于已经存 在的表或视图来创 建新表,而不需要 为新表定义字段。在子查询中也 可以引用一个或多 个表(或视图),查询结果集中包 含的字段即为新表 中定义的字段,并 且查询到的记录也 都被添加到新表中 。 下面的示例将使用 CREATE TABLE AS SELECT语句创建 一个表E M P _C O P Y ,但 是不在表中插入任 何数据行。为了完 成这项工作,可以 使用如下语句: SQL> create table emp_copy 2 as select * 3 4

from scott.emp where empno is null;

表已创建。

当使用CREATE TABLE AS SELECT语句创建 表时,Oracle将从指 定的SCOTT.EMP 表中复制列来建立 表。创建表后,O racle就会 使 用从 SELECT语句中返 回的行来填充新 表 。为了确保没有数据 可以从查询中返回 ,这里使用了 W HERE子句。由于 没有EMPNO 列为空的行,所以 不会有任何数据返 回。

在通过查询创建表时 ,还可以修改表中各 个列的名称,但是不 能修改列的数据类型 。新 表中所有列的数据类 型都必须与查询语句 的各个列一致。

8 1 3 表特性) 在 O racle中创建表时,表的特性将决定系 统如何创建表、如 何在磁盘上存储表 、以 及表创建后使用时 的最终执行方式等 。 1 . 存储参数 当用户在O racle中 建 立 模 式 对 象 ( 如 表 )时,O racle允许用户规定 该对象如何使用 磁盘上的存储空间 。如果仅为表指定 了表空间,而没有 设置存储参数,它 将自动采用所 属表空间的默认存 储参数设置。然而 表空间的默认存储 参数不一定对表空 间中的每一个 表都适合,因此, 当表所需的存储参 数与表空间的默认 存储参数不同时,需要在创建表 时显式指定存储参 数以替换表空间的 默认存储参数。 在创建表时,可以 通过使用STORA GE子句来设置存储 参数,这样可以控 制表中盘 区的分配管理方式 。对于本地化管理 的表空间而言(这 是 Oracle 11g所支持的唯一 表空 间管理方式,关于表空间的管理 方式将在后面的章 节中详细介绍),如果指定盘区的管 理 方 式 为 AUTOALLOCATE (自动化管理),则 可 以 在 STORAGE子 句 中 指 定 INITIAL, N E X T 和 MINEXTENTS 3 个存储参数,Oracle将 根 据 这 3 个存储参数设置为 表分配的数 据段初始化盘区大 小,以后盘区的分 配将由O racle自动管理。如 果指定的盘区管理 方式 为 UNIFORM (统一化管理) ,这时不能为表指 定任何STORAGE 子句,盘区的大小 将是 统一大小。

179

Oracle 1 1 g 中文版数据 库管理、应 用与开发标 准教程 参 数 N E X T用于指定 为存储表中 的数据分配 的第二个盘 区大小。该 参数在字典 管理 的表空间中 起作用,而 在本地化管 理的表空间 中不再起做 用,因为随后分配的盘 区将由 O ra c le 自动决定其大小。参 数 MINEXTE NTS用于指 定允许为表 中的数据所 分配的最小 盘区数目, 同样在本地 化管理的表 空间中该参 数也不再起 作用。因此 ,在存储参 数中, 主要是 设置 IN ITIA L参数。该 参数用于为 表指定分配 的第一个盘 区大小,以 K B 或 MB 为单位。当 为已知数量 的数据建立 表时,可 以 将 INITIAL设 置为一个可 以容纳所有 数据 的数值,这 样可以将表 中所有数据 存储在一个 盘区从而避 免产生碎片 。 例如,下面的语句 将重新建立 EMPLOYE ES表 ,并 通 过 STORAGE 子句为其指定存 储 参 数 INITIAL» SQL> create table employees( 2 emρno number(10) not null, 3 ename varchar2(20)z 4 sex char(2), 5 salary number(8,2), 6 hiredate date default sysdatez 7 job varchar2(10), 8 email varchar2(50)z 9 deptno number(3) not null) 10 tablespace example 11 storage(initial 128k); 表已创建。

通 过 查 询 USER_TAB LES可以获 取创建的表 信息如下: SQL> select table_name,tablespace_name initial_extent z 2 from user_tables; TABLE_NAME

TABLESPACE_NAME

DEPT

USERS

EMPLOYEES

EXAMPLE

INITIAL_EXTENT 65536 131072

已 选 择 10 行 。

2 . 数据块管理参数 在前面介绍 O racle的逻辑 存储结构时 ,曾经介绍过 数据块是O racle中最小的存储单 元 。对于一般不 带有L O B 类型数据的 表而言,一 个数据块可 存放表的多 行记录。用户可 以设置的数 据块管理参 数主要分为 两类。 □ □

PCTFREE

P C T U S E D 这两个参数 用于控制数 据块中空闲 空间的使用 方法。

该参数用于 控制访问数 据块的事务 数量,同时 该参数也会 影响到 数据块头部 空间的使用 情况。 INITRANS

对于本地化 管理的表空 间而言,如 果 使 用 SEGMENT SPACE MANAGEM ENT子句 设置段的管 理方式为AUTO ( 自动),则 O racle会对数 据块的空闲 空间进行自 动管理。



8 管 理 表 --------------- 对于这种情况,不 需要用户设置数据 块管理参数PCTF REE和 PCTUSEDo 如果表空间的段 管理方式为SEGM ENT SPACE MANAGEMENT MANUAL (手动管 理 ),则用户可以通过 设置PCTFREE与 PCTUSED参数对 数据块中的空闲空 间手工管理。 其 中 ,P C T F R E E 用 于 指 定 数 据 块 中 必 须 保 留 的 最 小 空 闲 空 间 比 例 , 当数据块达到 P C T FR E E 参数的限制后,该数据块将被标 记为不可用,默 认 值 为 10。伊收口,如果在 CREATE TABLE语句中指 定PCTFREE为 2 0 , 则说明对于该表的 数据段,系统将会保留 20%的空闲空间,这些空闲空间将用 于保存更新记录时 增加的数据。很显 然,PCTFREE 参数值越小,为现 存行更新所预留的 空间越少。PCTFREE参数值 设置得太高,则浪费磁 盘空间;如 果 PC TFR E E设置得太低,则 可能会导致由于一 个数据块无法容纳 一行记录 而产生迁移记录和 链接记录。 而 参 数 PCTUSED设置数 据块是否可用的界 限,换言之,为了 使数据块能够被再 次 使用,已经占用的 存储空间必须低于 PCTUSED设置的 比例。

注 ⅛ 1--------------- - ------------------------------------------为 表 设 置 PCTFREE 与 PCTU SED 参数时,PCTFREE 与 PC T U SE D 两个参数值的和必须 | 等 于 或 小 于 100 。一般而言,两 个 参 数 的 和 与 1与 相 差 越 大 ,存 储 效 率 就 越 高 。

设 置 数 据块 的 PC TFREE和 PC TUSED时,用户 需要根据数据库的 具体应用情况来 决定。下面是设 置PCTUSED和 PCTFREE参数的 几种示例情况。 □

在实际的应用中 使用UPDATE操 作较多,并且更新 操作会增加记录的 大小时, 可 以 将 PCTFREE值设置 得大一点,这样当记录变大时 ,记录仍然能够保存 在原 数据块中;而 将 PC T U SE D 值设置得比较小,这样在频繁地进行 更新操作时, 能够减少由于数据 块在可用与不可用 状态之间反复切换 而造成的系统开销 。推

荐设置 PCTFREE 为 2 0 , 而 PCTUSED 为 40. □ 当在实际的应用中 使用INSERT和 DELETE操作较多 ,并 且 UPDATE操作不会 增加记录的大小时 ,可 以 将 PCTFREE参数设 置得比较小,因为大部分更新操作 不会增加记录的大 小;而 PC T U SE D 参数设置得比较大 ,以便尽快重新利 用被 DELETE操作释放 的存储空间。推荐 设置参数PCTFR EE为 5 , 而 PCTUSED 为 60。 在 CREATE TABLE 语句中,可以通过 PCTFREE 和 PCTUSED 子句来设置相应的 参 数 。例如,下面的语 句将重新创建EM PLOYEES表 ,并 设 置 PCTFREE和 PCTUSED参 数 分 别 为 2 0 和 40。 SQL> create table employees( 2 emρno number(10) not null, 3 ename varchar2(20)r 4 sex char (2), 5 salary number(8z 2), 6 hiredate date default sysdate, 7 job varchar2(10)z 8 email varchar2(50), 9 deptno number(3) not null) 10 tablespace example 11 storage(initial 128k)

181

Oracle 11g中文版数据库管理、应用与开发标准教程 12 13

pctfree 20 pctused 40;

表已创建。

通 过 查 看 USER_TABLES数据字典视图,可以了解表的PCTFREE和 PCTUSED参 数 。例如: SQL> column table_name format a20 SQL> select table_name,tablespace_name z pct_free f pct_used 2 from user_tables 3 where table_name= ,EMPLOYEES , ; TABLE_NAME EMPLOYEES

TABLE S PACE_NAME EXAMPLE

PCT_FREE

PCT_USED

20

数据块管理的另一类参数是IN ITRA N S参数,该参数用于指定一个数据块所允许 的并发事务数目。当一个事务访问表中的一个数据块时,该事务会在数据块的头部保存 一个条目,以标识该事务正在使用这个数据块。当该事务结束时,它所对应的条目将被 删除。 在创建表时,O racle会在表的每个数据块头部分配可以存储INITRANS个事务条目 的空间,这部分空间是永久的,只能用于存储事务条目。当数据块的头部空间已经存储 了 INITRANS个事务条目后,如果还有其他事务要访问这个数据块,O racle将在数据块 的空闲空间中为事务分配空间,这部分空间是动态的,当事务结束后,这部分存储空间 将被回收以存储其他数据。能够访问一个数据块的事务总数是由M A X TRA N S参数决 定的。 注 意 ----------------------------------------------------------------------需要注意,在 Oracle 1 1 g 中,对于单个数据块,O racle默 认 最 大 支 持 2 5 5 个并发事务, I MAXTRANS参数已经被废弃。

例如,下面的语句将重新创建EMPLOYEES表 ,并指定在数据块头部存放2 0 个事 务条目。 SQL> create table employees( 2 empno number(10) not null, 3 ename varchar2 (20)λ 4 sex char (2), 5 salary number(8,2), 6 hiredate date default sysdate, 7 job varchar2(10), 8 email varchar2 (50)z 9 deptno number(3) not null) 10 tablespace example 11 storage(initial 128k) 12 pctfree 20 13 pctused 40

第 8 管 理 表 --------------- 14

initrans 20;

表已创建。 通过查看数据字典USER TABLES中 的 INI TR A N S和 MAX TR A N S歹11,可以了解 INITRANS 和 MAXTRANS 参数如下: SQL> select table_name r ini_trans,max_trans 2 from user_tables 3 where table_name= ,EMPLOYEES , ; TABLE_NAME

INI_TRANS

EMPLOYEES

20

MAX_TRANS 255

由于每个表的应用特性不 同,所以应当为各个表分 别设置不同的INITRAN S参数。 在 设 置 INITRANS参数时,如果 设 置 的 INITRANS参数值较大,则事务条目将占用过多 的存储空间,从而减少了 用来存储实际数据的存储 空间。只有当一个表有较 多的事务同 时访问时,才应当为其设 置较高的INITRANS参数 值。 3 . 指定重做日志 重做日志记录了数据库中 数据的所有改变,这样如 果发生故障导致数据不能 从内存 保存到数据文件中时,就可以从重做日志中获取 被操作的数据。这样可以防止数据丢失, 从而提高表中数据的可靠 性。 当 使 用 CREATE TABLE语句创建表时,如果使用了 NOLOGGING子句,则对该表 的操作不会保存到日志中 ,所以这种表被称为非日 志记录表。在非日志记录 表上进行操 作 (如 INSERT、UPDATE> DELETE等 )时,系统就不会产生重 做日志记录。在创建表 时,默认情况下使用LO GGING子句,这样对表 的所有操作都将记录到重 做日志中。 在决定是否使用NOLOG GING子句时,用户必须综合考虑所获取 的收益和风险。使 用 NOLOGGING子句时,可以节省重做日志文件的 存储空间,并减少创建表所需要的时 间。但如果没有在重做日 志文件中记录对表的操作 ,可能会无法用数据库恢 复操作来恢 复丢失的数据。 例 如 ,下 面 通 过 在 CREATE T A L B E 语 句 中 使 用 N O L O G G IN G 子 句 ,使得对 EMPLOYEES表的操作不 会被记录到重做日志文件 中。 SQL> create table employees( 2 empno number(10) not null, 3 ename varchar2(20), 4 sex char(2), 5 salary number(8r 2), 6 hiredate date default sysdate z 7 job varchar2(10)r 8 email varchar2(50), 9 deptno number(3) not null) tablespace example

10

11

storage(initial 128k)

12

ρctfree 20

183

Oracle 11g中文版数据库管理、应 用与开发标准教程 13 14 15

pctused 40 initrans 20 nologging;

4 . 指定缓存 当 在 O racle中执行全表搜索时,读入缓存中的数据块将会 存储在L R U 列表的最近 最少使用的一端。这意味 着如果进行查询操作,并 且必须向缓存中存储数据 时,就会将 刚读入的数据块换出缓存 。 在建立表时,可 以 使 用 C A C H E子句改变这种行为,使 得 当 在使 用 C A C H E子句建 立的表中执行全表搜索时 ,将读入的数据块放置到L R U 中最近最常用使用的一端 。 这样, 数据库缓存在利用L R U 算法对缓存块进行换入、换出调度时,就不会将属于这个表的数 据块立即换出,从而提高 了针对该表而进行的查询 的执行效率。 在创建表时默认使用NOC ACHE子句。对于比较小且又经常查询 的表,用户可以在 创建表时指定CACHE子 句,以便利用系统缓冲提 高对该表的查询执行效率 。 例如,下面的查询语句将 检索USERJTABLE数 据 字 典 的 C A C H E 歹!),以查看表是 否启用了缓存功能。

184

SQL> select table_name,cache 2 from user_tables 3 where table_name= , EMPLOYEES , ; TABLE_NAME

CACHE

EMPLOYEES

N

修改表 在创建表后,如果发现对 表的定义有不满意的地方 ,还可以对表进行修改。这些修 改操作包括增加或删除表 中的字段、改变表的存储 参数设置以及对表进行增 加、删除和 重命名等操作。普通用户 只能对自己模式中的表进 行修改,如果要对任何模式 中的表进 行修改操作,用户必须具 有ALTER ANY TABLE系统权限。

在创建表后,可能会需要 根据应用需求的变化向表 中增加或删除列。 使 用 ALTER TABLE…A D D 语句能够向表中添加新的 字段。例 如 ,利用下面的语句 在 EMPLOYEES表中增加一 个名为A G E 的新字段。 SQL> alter table employees add(age number(2));

表已更改。 SQL> desc employees

名称 EMPNO ENAME

是否为空?

类型 NUMBER(10) VARCHAR2(20)



8 管 理 表 --------------- — SEX SALARY HIREDATE JOB EMAIL DEPTNO AGE

CHAR(2) NUMBER(8z 2) DATE V7kRCHAR2 (10) VARCHAR2(50) NOT NULL NUMBER (3) NUMBER(2)

NOT NULL

与此相反,使 用 ALTER T A B L E -D R O P 语句可以删除表中不 再需要的字段。但是 不能删除表中所有的 字段,也不能删除SY S模式中任何表中的 字段。如果仅需要删 除一 个 字 段 , 则 必 须 在 字 段 名 前 指 定 C O L U M N 关 键 字 。例 如 , 下 面 的 语 句 将 删 除 EMPLOYEES表 中 的 A G E 字 段 。 SQL> alter table employees drop column age; 表已更改。 SQL> desc employees 名称 是否为空? EMPNO ENAME SEX SALARY HIREDATE JOB EMAIL DEPTNO

类型

NOT NULL

NUMBER(10) VARCHAR2(20) CHAR(2) NUMBER(8,2) DATE VARCHAR2(10) VARCHAR2(50) NUMBER(3)

NOT NULL

如果要在一条语句中 删除多个列,则需要 将删除的字段名放在 括号中,各字段之间 用逗号隔开,且不能 使用关键字COLUM N。例如,下面的语 句将删除EMPLOYE ES表 的 SE X 和 EM AIL列 。 SQL> alter table employees 2 drop (sex,email); 表已更改。 SQL> desc employees 名称 是否为空? EMPNO ENAME SALARY HIREDATE JOB DEPTNO

NOT NULL

NOT NULL

类型 NUMBER(10) VARCHAR2(20) NUMBER(8z 2) DATE VARCHAR2(10) NUMBER(3)

如果在上述语句中使 用关键字C O L U M N ,将会产生如下错误: SQL> alter table employees drop column (hiredatef job); alter table employees drop column (hiredate,job)

185

Oracle 1 1 g 中文版数据库管理、应用与开发标 准教程

第 1 行出现错误: O R A - 0 0 9 0 4 : :标 识 符 无 效

在删除字段时,系统将删除表中每条记 录的相应字段值,同时释放所占用的存 储空间, 并且不会影响到表中其他列的数据。如 果要删除一个大型表中的字段,由于需 要对每条记录 进行处理,删除操作可能会执行很长时 间。

φ- 8 . 2 . 2 更 新 字 段 1 除了在表中增加和删除字段外,还 可以根据实际情况更新字段的有关 属性,包括更 新字段的数据类型的长度、数字列 的精度、列的数据类型和列的默认 值等。使 用 ALTER T A B L E -M O D IFY 语句更新字段属性的语法形式如下 : alter table table_name modify column_name type;

在表中更新列时,应该注意以下两 点。 □ 一般情况下,把某种数据类型改变 为兼容的数据类型时,只能把数据 的长度从 低向高改变,不能从高向低改变。 □ 当表中没有数据时,可以把数据的 长度从高向低改变,也可以把某种 数据类型 改变为另外一种数据类型。 例 如 ,下 面 的 ALTER TABLE-∙-MODIFY语句 将 更 新 EMPLOYEES表 中 的 JO B 字 段 ,修改其数据类型为VARCHAR2(20)° SQL> alter table employees 2 modify job number(20); 表已更改。 SQL> desc employees 名称 是否为空? EMPNO ENAME HIREDATE JOB DEPTNO

NOT NULL

NOT NULL

类型 NUMBER(10) VARCHAR2(20) DATE NUMBER(20) NUMBER(3)

修改某个字段的默认值只对今后的 插入操作起作用,对于先前已经插 入的数据并不 起作用。

φ -- 8.2.3

重命名表卜;

在创建表后,如果想要修改表的名 称,则可以使用ALTER TABLE…RENAM E语句

管理表 对其进行重命名。 践 吁

__________________________________________________________ 用户只可以对自己模式中的表进行重命名•

使 用 ALTER T A B L E -R E N A M E重命名表的方法如下: SQL> alter table employees 2 rename t o 员工信息;

表已更改。

对表进行重命名非常容易 ,但是影响却非常大。在 对表的名称进行修改时,要格外 小心。虽 然 O racle可以自动更新数据字 典中的外键、约束定义以 及表关系,但是它不能 更新数据库中的存储过程 、客户应用,以及依赖于 该对象的其他对象。

8 . 2 . 4 改变表的存储表空 间和存储参数 在创建表时,通过一些相 应的参数可以规定表的存 储位置、存储参数等。在 表创建 后 ,如果发现这些参数设置 不合适,还可以对其进行 修改。 使 用 ALTER T A B L E -M O V E 语句可以将一个非分区表 移动到一个新的表空间。例 如 ,下面的语句将EMPLO YEES表 移 到 U SE R 表空间。 SQL> alter table employees 2 move tablespace users;

表已更改。 SQL> select tablespace_name z table_name 2 from user_tables 3 where table_name= ,EMPLOYEES , ; TABLESPACE_NAME

TABLE_NAME

USERS

EMPLOYEES

由于表空间对应的数据文 件不同,所以在移动表空 间时会将数据在物理上移 动到另 一个数据文件。 除此之外,还可以修改表的数据块 参数PCTFREE和 PCTUSED。改变这两个参数值 后 ,表中所有的数据块都 将受到影响,而不论数 据块是否已经被使用。例 如 ,下面的 ALTER TABLE语句将重新设置 EMPLOYEES表 的 PCTFREE与 PCTUSED参数。 SQL> select tablespace_name,table_name 2 from user_tables 3 where table_name= ,EMPLOYEES , ; TABLESPACE_NAME

TABLE_NAME

Oracle 11g中文版数据库 管理、应用与开发 标准教程 USERS

EMPLOYEES

SQL> alter table employees 2 pctfree 30 3 pctused 50; 表已更改。 SQL> select table_name r pct_free 2 from user_tables 3 where table_name= ,EMPLOYEES , ; TABLE_NAME

PCT_FREE

EMPLOYEES

30

当不再需要某个 表时,就可以删除 该表的定义。需 要注意,一般情况 下用户只能删

188

除自己模式中的 表,如果要删除其 他模式中的表,则必须具有DROP ANY TABLE系统 权限。删除表所 使用的DROP TABLE语句如下 : SQL> drop table employees; 表已删除。

删除表与删除表 中所有数据不同 ,当用户使用DE LETE语句进行删 除操作时,删除 的仅是表中的数 据,该表仍然存在 子数据库中;DR OP TABLE语句删除 表定义时,不仅 表中的数据将丢 失,而且该表的定 义信息也将从数 据库中删除,用 户就再也不可以向 该 表添加数据了。 在删除一个表定 义时,Oracle将执 行如下一系列操 作。 □ 删除表中所有的 记录。 □ 从数据字典中删 除该表的定义。 □ 删除与该表相关 的所有索引和触 发器。 □ 回收为该表分配 的存储空间。 □ 如果有视图或PL /SQ L过程依赖于该表 ,这些视图或PL/S Q L过程将被置于不 可 用状态。 DROP TABLE语句有一 个可选子句CASCADE CONSTRAINTS» 当使用该参数时 , DROP T A B L E 不仅仅删除该表 ,而且所有引用 这个表的视图、约束或触发器等 也都被 删除。 SQL>drop table employees cascade constraints;

一般情况下,用 户删除了一个表 定义后,数据库 并不会马上释放 该表占用的空间 , 而 是 将 它 重 命 名 ,然 后 放 到 了 回 收 站 中 。这 样 当 用 户 需 要 还 原 该 表 时 ,就可以使用 FLASHBACK T A B L E 语句进行还原。如果想在删除表 定义时立即释放 空间,则可以在



8 管理表 DROP TABLE语句 中 使 用 PU RGE选项。 例 如 ,下 面 的 实 例 将 演 示 如 何 利 用 Oracle 1 1 g 的闪回功能快速恢 复被删除的表 EMPOYEESo ( 1 ) 首先确 认EMPLOYEES表 是否已经被删除。 SQL> select * from employees; select * from employees 第 ι 行出现错误: ORA-00942:表或视 图不存在

( 2 ) 从查询结果中可以 看出该表已经被删 除。 可以查询数据字典 视图RECYCLEBIN , 以了解在回收站中 存放的被删除的表 。 SQL> select object_name,original_name 2 from recyclebin 3 where original_name= ,EMPLOYEES , ; OBJECT NAME BIN$/JLYArbfRpyqUqsEzAwFZA==$O BIN$lAkzE5e8TOSlCNyirFdTuA==$0 BIN$JA87cseLQeKpgMsj8xb0Eg==$0 BIN$FL4Ok0g9SpuJc923oHrzcw==$0 BIN$1yuMBPpeQy+D wxxOO工tqHQ==$ 0 BIN$T4ql8udRSdGIqbfNn71q7g==$0 BIN$uh5CMxhOR2uZQdiuFUEU7w==$0 BIN$foqtLtbcSce5xnAPhDYFmQ==$0 BIN$Ww69nxeHSle/QKoAy9Go8w==$0

ORIGINAL_NAME EMPLOYEES EMPLOYEES EMPLOYEES EMPLOYEES EMPLOYEES EMPLOYEES EMPLOYEES EMPLOYEES EMPLOYEES

已选择9 行。

在 OBJECT_NAME列 显示了在回收站中 被重命名的对象名 , ORIGINAL_NAME 列 则显示该对象原来 的名称。 ( 3 ) 使 用 FLASHBACK TABLE语句恢复被 删除的EMPLOYE ES表 。 SQL> flashback table employees to before drop; 闪回完成。 SQL> select * from employees; 未选定行

♦ - - 8 2 6 修改表的状态 Oracle l l g 推出了一个新的特 性,用户可以将表置 于READ ONI、 (只 读 )状 态 。处 于该状态的表不能 执行D M L 操作和某些D D L 操作。在 Oracle 11g之 前 ,为了使某个表 处 于 READ ONLY状态,只能 通过将整个表空间 或者数据库置于RE AD ONLY状态。 例如,下面的语句 将表EMPLOYEES 置于只读的READ ONLY状 态 。

189

--------------- Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 SQL> alter table employees read only; 表已更改。

SQL> select table_name,read_only 2 from user_tables 3 where table_name=,EMPLOYEES, ; TABLE_NAME

REA

EMPLOYEES

YES

对 于 处 于 READ ONLY状态的表 ,用户不能执 行D M L 操作。例如: SQL> insert into employees(empnof enamez job,deptno) 2 values(1220,,ATG , r ,clerk, z 10); insert into employees(empnoz ename,jobA deptno) * 第 1 行出现错误: ORA-12081: 不 允 许 对 表 ,,SCOTTn ."EMPLOYEES"进行更新操作

190

SQL> truncate table employees; truncate table employees 第 1 行出现错误: ORA-12081: 不 允 许 对 表 n SCOTTn .π EMPLOYEESn 进行更新操作

可以将表从一个 表空间移动到另 一个表空间。例 如: SQL> alter table employees move tablespace users; 表已更改。

处 于 READ ONLY状态的表 可以将其重新 置于可读写的 READ W RITE状态。例如: SQL> alter table employees read write; 表已更改。

SQL> select table_name,read_only 2 from user_tables 3 where table_name=,EMPLOYEES, ; TABLE_NAME

REA

EMPLOYEES

NO

+ ' j 定义和管理数据完整性约束 数据库不仅仅 存储数据,它还 必须保证所存储 数据的正确性 。如果数据不准 确或不 一致,那么该数 据的完整性就可 能受到了破坏,从而给数据库 本身的可靠性 带来问题。 为了维护数据库 中数据的完整性 ,在创建表时常 常需要定义一 些约束。约束可 以限制列 的取值范围,强 制列的取值来自 合理的范围等。在 Oracle 11g系统中,约 束的类型包括



8 ⅛

管 理 表 --------------- 非空约束、主键 约束、唯一性约 束、外键约束、检查约束和默认 约束等。 对约束的定义即 可以在CREATE TABLE语句中 进行,也可以 在ALTER TABLE语 句中进行。在实 际应用中,通常 是先定义表的字 段;然 后 再 根 据 实 际 需 要 通 过 ALTER TABLE语句为 表添加约束。

• - 831

非空约束

非空约束就是限 制必须为某个列 提供值。空值是 不存在值,它 既 不 是 数 字 0 , 也不 是空字符串,而 是没有、未知。 在表中,若某些 字段的值是不可 缺少的,那么就 可以为该列定义 非空约束。这样当 插入数据时,如 果没有为该列提 供数据,那么系 统就会出现一个 错误消息。 如果某些列的值 是可有可无的,那么可以定义这 些列允许空值。这样,在插入数 据 时,就可以不向 该列提供具体的 数据。在默认情 况下,表中的列 是允许空值的。 例如,在 创 建 EMPLOYEES表 时,规 定 EMPNO, E N A M E和 D E PTN O 列不能为 空值。 SQL> create table employees( 2 empno number(10) not null, 3 ename varchar2(20) not null, 4 sex char(2), 5 salary number(8f 2), 6 hiredate date default sysdate, 7 job varchar2(10), 8 email varchar2(50), 9 deptno number(3) not null);



表已创建。

也 可 以 使 用 ALTER TABLE M O D IF Y 语句为已经创建 的表删除或重新 定义NOT N U L L 约束。例如,下 面的语句为SA LARY字段定义 了非空约束。 SQL> alter table employees 2 modify salary not null; 表已更改。

为表中的字段定 义了非空约束后 ,当用户向表插 入数据时,如果 未给相应的字段 提 供值,则添加数 据操作将返回一 个错误。 SQL> insert into employees(ename,sex,salary,deptno) 2 values(, 刘丽, J 男 ,,1500,20); insert into employees(enamez sexr salary,deptno) * 第 1 行出现错误: ORA-01400:无法将 NULL 插 入 ("SCOTT" ."EMPLOYEES" ."EMPNO")

如 果 使 用 ALTER TA B L E -M O D IFY 为表添加NOT N U L L约束,并且表中该列数据 已经存在N U L L 值 ,则向该列添加 NOT N U L L 约束将失败。这 是因为列应用非 空约束

191

Oracle 1 1g中文版数据库管理、应 用与开发标准教程 时,O racle 会试图检查表中所有的行 ,以验证所有行在对应的 列是否存在 N U L L 值 。 使 用 ALTER TABLE…M ODIFY 语句还可以删除表的非空 约束。例如,下面的语句 删除了 SALARY 列的非空约束。 SQL> alter table employees 2 modify salary null; 表已更改。

φ - 8.3.2

主键约束

主键约束用于唯一地标识 表中的每一行数据。在一 个表中,最多只能有一个 主键约 束 ,主键约束既可以由一个 列组成,也可以由两个或 两个以上的列组成。对于 表中的每 一行数据,主键约束列都 是不同的,主键约束同时 也具有非空约束。 如果主键约束由一列组成 时,该主键约束被称为行 级约束。如果主键约束由 两个或 两个以上的列组成时,则 该主键约束被称为表级约 束。这两种不同类型的主 键,在定义 上有一点差异。 例如,在 定 义 EMPLOYEES 表 时 ,为表定义了一个表级主键 约束 E M P _P K , 该主键 约 束 由 EM PNO 和 E NAM E 列组成。 SQL> create table employees( 2 empno number(10)z 3 ename varchar2 (20) not null, 4 sex char (2), 5 salary number(8z 2), 6 hiredate date default sysdate, 7 job varchar2 (10)r 8 email varchar2(50), 9 deρtno number(3) not null z 10 constraint EMP_PK primary key (empno z ename)); 表已创建。

使 用 ALTER TABLE 语句增加主键约束的语法 形式如下: alter table table_name add constraint constraint_name primary k e y (columnl[,column2]);

如果表已经存在主键约束 ,那么当试图为该表再增 加一个主键约束时,系统就会产 生一个错误信息。即使在 不同的列上增加约束也是 如此。例如,当 在 EMPLOYEES 表的 EM AIL 列上再增加一个约束时,系 统 将 产 生 “表只能具有一个主键”的 错误消息。具体

如下: SQL> alter table employees 2 add constraint emp_email_pk primary key (email); add constraint emp_email_pk primary key (email) * 第 2 行出现错误:

管理表 ORA-02260: 表只能具有一个主 键

与 NOT N U L L 约束相同,当为 表添加主键约束 时,如果该表中 已经存在数据,并且 主键列具有相同 的值或存在N U L L值 ,则添加主键约 束的操作将失败 。 如 果 要 为 PRIMARY K E Y 约束指定名称,则必须使用CO NSTRAINT关键 字,如上 面的示例所示。如果要使用系统 自动为其分配的 名称,则 可 以 省 略 CONSTRAINT 关键 字 。例 如 ,下面的语句在 创建EMPLOYE ES表 时 在 EM PNO列上定义了 一个主键约束。 create table employees( empno number(10) primary key, );

同样,使 用 ALTER T A B L E -A D D 添加匿名约束的 语句形式如下: alter table employee_history add primary key (employee_id);

如果要为表删除 PRIMARY K E Y 约束时, 则可以使用如下 的ALTER TA BLE-DR OP 语句来完成: SQL> alter table employees 2 drop constraint EMP_PK; 表已更改。

在表中增加主键 约束时,一定要 根据实际情况确 定。例如,在 EM PLO YEES表的 E M P N O 列 上 增 加 主 键 约 束 是 合 理 的 ,因 为 该 列 的 数 据 是 不 允 许 相 同 的 。但 是 ,在 ENAME、SALA RY等列上创建主 键约束却是不合 理的。

唯一性约束强调 所在的列不允许 有相同的值。但 是,它的定义比 主键约束弱,即它 所在的列允许空 值。UNIQUE约束的 主要作用是在保 证除主键列外、其他列值的唯一 性。 在 一 个 表 中 ,根 据 实 际 情 况 可 能 有 多 个 列 的 数 据 都 不 允 许 存 在 相 同 值 。例 如 , EM PLOYEES表 的 E M A IL等列是不允许 重复的,但是由 于在一个表中最 多只能有一个 主键约束存在,那么如何解决这 种多个列都不允 许重复数据存在 的问题呢?这就 是唯一 性约束的作用。 例如,下面的语句重新定义了 EM PLOYEES表 ,并 为 该 表 的 E M IL 列定义了名为 EM P_UK的唯一性 约束。 SQL> create table employees( 2 empno number(10) primary key, 3 ename varchar2(20) not nullz 4 sex char(2)r 5 salary number(8,2), 6 hiredate date default sysdatez 7 job varchar2(10),

193

Oracle 11g中文版数据库管理、应用与开 发标准教程 8 email varchar2 (50) constraint emp_uk unique, 9 deptno number(3) not null); 表已创建。

前面曾介绍过,U N IQ U E 约束可以保证列中不存在重复的 值,但是可以插入多个 N U L L值 。下面的示例将试图在EMPLOY EES表 的 EM A IL列添加两行N U L L 值 。 SQL> insert into employees(empno,ename,email,deptno) 2 values (1220, ,⅛ J ≡ , z null, 10); ,已创建1 行。 SQL> insert into employees(empno,enamez email,deptno) 2 values(1221, ,≡ ≡ ∖n u l l , 1 0 ) ; 已 创 建 1 行。

为了防止向UNIQUE约束列添加 N U LL值,可以在该列上再添加NOT N U L L约束。 向 UNIQUE约束列添加NOT NU LL约束后, 其功能基本上就相当于主键PRIM ARY KEY 约束。

194

使 用 ALTER TABLE语 句 添 加 UNIQUE约束的语句形式如下: alter table table_name add constraint constraint_name unique (columnl[,column2]);

同样,使 用 ALTER TABLE语句也可以删除UN IQUE约束。例如,下面的语句删 除 创 建 的 UN IQUE约 束 EMP UK() SQL> alter table employees 2 drop constraint emp_uk;

. - 8 3 4 外键约束) 外键约束是这几种约束中最复杂 的,外键约束可以使两个表进行关 联。外键是指引 用另一个表的某个列或某几列,或 者本表的另一个列或另几个列的 列。被引用的列应该 具有主键约束或者唯一性约束。 在外键的定义中,涉及到外键表 、外键列、被引用表和被引用列等 几个概念。如果 成功地创建了外键约束,那么系统 将要求外键列中的数据必须来自 被引用列。被引用列 中不存在的数据不能存储于外键列 中。一般情况下,当删除被引用表 中的数据时,该数 据也不能出现在外键列中。如果 外键列存储了将要在被引用表中 删除的数据,那么对被 引用表删除数据的操作将失败。 最典型的外键约束是H R 模 式 中 的 EMPLOYEES和 DEPARTMENT表 ,在该外键约 束 中 , 外 键 表 E M PL O Y E E S 中 的 外 键 列 DEMPARTMENTID 将 引 用 被 引 用 表 DEPARTMENTS 中的 DEMPARTMENTJD 歹)]。 例 如 , 以 下 的 示 例 将 以 H R 身 份 连 接 到 数 据 库 ,并 创 建 一 个 新 表 ADMINISTR ATION E M P ,并为其添加到DEPATRMENT表 的外键约束。



8

章 管 理 表 -------------- SQL> connect hr/hr 已连接。 SQL> create table administration_emp 2 as select * from h r .employees 3 where departmen t_id=l0; 表已创建。 SQL> alter table administration_emp 2 add constraint admin_dep_fk 3 foreign key(department_id) 4 references departmen ts(departmen t_id); 表已更改。

为验证创建 的外键约束 的有效性,可 以 向 ADMINIS TRATION _EMP 表添加一条 记 录 ,并且 它 的 DEPARTM ENT_ID 列值不存在 于 DEPARTM ENTS 表中,那么 插入操作将 会因为违反 外键约束而 失败。 SQL> insert into administr ation_emp ( 2 employee_ id f last_name,email,hire_date job_id,department_id) r 3 values (120z , ⅛ J S , , , liΘgmain. com , ,sysdate, *HR_REP* 360); r insert into administr ation_emp ( * 第 1 行出现错误 : ORA-0229 1:违 反 完 整 约 束 条 件 (H R .ADMIN_DEP _FK) - 未找到父项关 键字

盘------------------------

在一个表上 创建外键约 束时,被引用 表必须已经 存在,并且必 须为该表的 被引用列定 义 I 唯一性约束 或主键约束 .

如果外键表 的外键列与 被引用表的 被引用列列 名相同,如 上面的示例 所示,则为外 键表定义外 键列时可以 简化为如下 形式: SQL> alter table administration_emp 2 add constraint admin_dep_fk 3 foreign key(department_id) 4 references departments;

在定义外键 约束时,还 可以通过关 键字 O N 指定引用行 为的类型。当尝试删除被引 用表中的一 条记录时,通过引用行 为可以确定 如何处理外 键表中的外 键列。引用类型包 括 3 种。 □

在定义外键 约束时,如果使用了 C A SA D E 关键字,那 么当被引用 表中被引用列 的数据被删 除时,外键 表中对应的 数据也将被 删除。 □ 在定义外键 约束时,如 果使用了 关键字 SET N U L L , 那么当被引用表中被引用 列的数据被 删除时,外 键表中外键 列将被设置 为 NULL 。要使这个 关键字起作 用 ,外键列必 须支持 N U L L 值 。

195

--------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 □ 在定义外键约束时,如果使用了关键字NO A C T IO N ,那么当删除被引用表中被 引用列的数据时将违反外键约束,该操作将被禁止执行,这也是外键的默认引 用类型。 例如,下面的实例将演示外键的级联删除。 ( 1 ) 以 H R 身份连接到数据库,创建一个新的引用表,并为其添加主键约束。 SQL> connect hr/hr

已连接。 SQL> create table admin_dept 2 as select * from h r .departments 3

where department_id=10;

表已创建。 SQL> alter table admin_dept 2 add primary key(department_id);

表已更改。 ( 2 ) 使用 ON DELETE CASADE 关键字修改 ADMINISTRATION_EMP 表的外键

196 SQL> alter table administration_emp 2 add constraint admin_dept_fk 3 foreign key(department_id) 4 references adrnin_dept on delete cascade;

表已更改。 (3 ) 查 看 ADMINISTRATION E M P表中的数据。 SQL> select employee_id,last_name,job_id f salary,department_id 2 from administration_emp; EMPLOYEE_ID 200

LAST_NAME

JOB_ID

Whalen

AD_ASST

SALARY

DEPARTMENT_ID

4400

10

(4 ) 指定外键行为类型为ON DELETE CASADE后,在删除被引用表ADMIN_DEPT 中 编 号 为 1 0 的行时,系统将会级联删除ADMINISTRATION_EMP表中所有的记录。 SQL> delete admin_dept 2 where department_id=l0;

已删除1 行。 SQL> select employee_id,last_name z job_id,salary,department_id 2 from administration_emp;

未选定行



8

管理表



与其他约 束相同,如果想要 删除外键 约束,可 以 使 用 如 下 的 ALTER T A B L E 语句

形式:

alter table administration_emp drop constraint admin_dept_fk;

φ - 8 . 3 . 5 禁止和激活约束 默认情况 下,约束 创建之后 就一直起 作用。也 可以根据 具体应用 情况,临时禁用某 个约束。当某个约 束被禁用 后,该约 束就不再 起作用了 ,但它还 存在于数 据库中。 为什么要 禁用约束 呢?这是 因为约束 的存在会 降低插入 和更改数 据的效率 ,系统必 须确认这 些数据是 否满足定 义的约束 条件。当执 行一些特 殊操作时 ,如 使 用 SQL*Loader 从外部数 据源向表 中导入大 量数据,并且事先 知道操作 的数据满 足定义的 约束,为提高 运行效率 ,就可以 禁用这些 约束。 但是,禁 用约束只 是一种暂 时现象,某些需要 在禁用约 束状态下 完成的操 作完成之 后 ,还应该 激活约束 。如果约 束没有必 要存在,则可以删 除约束。 禁用约束 既可以在 定义约束 时执行,也可以对 现有的约 束执行。在 使 用 CREATE TABLE或 ALTER TABLE语 句定义约 束时,默认情况 下约束是 激活的。如果在定 义约束 时使用关 键字D IS A B L E ,则约束的 是被禁用 的。如果要 禁用已经 存在的约 束,则可以在 ALTER TABLE语 句中使用 DISABLE CONSTR AINT子句 。其语法 形式如下 : alter table table_name disable constraint constraint_name;

如 果 希 望 激 活 被 禁 用 的 约 束 ,则 可 以 在 ALTER T A B L E 语 句 中 使 用 ENABLE CONSTR AINT子句 。激活约 束的语法 形式如下 : alter table table_name enable [novalidate ∣validate] constraint constraint_name;

关键字NO VALIDAT E表示在激 活约束时 不验证表 中已经存 在的数据 是否满足 约束, 如果没有 使用该关 键字,或者 使 用VALID ATE关键 字,则在激活约束时 系统将验 证表中 的数据是 否满足约 束的定义 。 例如,下 面的语句 在创建EM PLOYEE S表时将定 义的约束 置为禁用 状态。 create table employee_history( salary number(8z 2) constraint emp_sal_ck check (salary>0) disable, )

需要注意 ,在禁用 主键约束 时,O racle会默 认删除约 束对应的 唯一索引 ,而在重新 激活约束 时,O racle将会 为重新建 立唯一索 引。如果 希望在删 除约束时 保留对应 的唯一 索引,可 以在禁用 约束时使 用关键字 KEEP INDEX。例如,下 面的语句 在禁用主 键约束 时保留相 应的索引 。 alter table employees disable constraint emp_pk keep index;

197

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 在禁用唯一性约束或主键约束时,如果有外键约束正在引用该列,则无法禁用唯一 性约束或主键约束。这时可以先禁用外键约束,然后再禁用唯一性约束或主键约束;或 者在禁用唯一性约束或主键约束时使用CASCADE关键字,这样可以级联禁用引用这些 列的外键约束。 例如,下面的示例将禁用EMPLOYEES表 的 EM P_PK主键约束,然后再重新激活 该约束。 ( 1 ) 以 SCOTT身份连接数据库系统。 ( 2 ) 使 用 ALTER TABLE语句禁用EMP P K 主键约束。 SQL> connect scott/tiger 已连接。

SQL> alter table employees 2 disable constraint emp_pk; 表已更改。

( 3 ) 在 EMPLOYEES表中插入一行数据,数 据 的 EM PNO列 为 N U L L 值 。

198

SQL> insert into employees(empno,enamez sex,salary,job,deptno) 2 values (null,'文∣ J丽 ','女 ',1 6 0 0 Λ ,CLERK, Λ 1 0 ) ; 已 创 建 1 行。

(4 ) 使 用 ALTER TABLE语句 激 活 EM P_PK主键约束。现在,由 于 EM PNO列中存 在 N U L L值 ,这与主键约束的作用存在冲突,所以激活约束的操作将失败。可以使用两 种方式解决该问题:第一种是更正表中不满足约束条件的数据;第二种是在激活约束时 使 用 NOVALIDATE关键字。 SQL> alter table employees 2 enable constraint emp_pk; alter table employees * 第 1 行出现错误: ORA-02437: 无 法 验 证 (SCOTT.EMP_PK) - 违反主键

SQL> alter table employees 2 enable novalidate constraint emp_pk; 表已更改。

. - 8 3 6 删除约束i 如果不再需要某个约束时,则可以将其删除。可以使用带DROP CONSTRAINT子 句 的 ALTER TABLE语句删除约束。删除约束与禁用约束不相同,禁用的约束是可以激 活的,但是删除的约束在表中就完全消失了。 使 用 ALTER TABLE语句删除约束的语法形式如下:



8 管理表



alter table table_name drop constraint constraint_name;

例如,下面的语句删除了 EMPLOYEES表中的部分约束。 SQL> alter table employees 2 drop constraint SYS_C009713; 表已更改。

8 4 ) 使用大对象数据类型 在 Oracle 11g系统中,提供了 4 种常用的大对象类型。这 4 种大对象类型分别为: CLOB类 型 , 字 符 LO B类型可以用来存储各种字符数据,主要用于存储英文字符;NCLOB 类型,国际语言字符L O B 类型 ,使用多字节存储各种语言的字符,主要用于存储非英文 字符。B L O B 类型 ,二 进 制 L O B 类型主要用于存储二进制数据;B F IL E 类型 ,二进制 FIL E 类型,用于存储指向数据库系统外面的文件系统中文件的指针。 大 对 象 ( L O B ) 数 据 类 型 可 以 存 储 1 2 8 T B 的数据,并且一个表中可以有多个LOB 类型列,这样一个表就可以存储大量的数据。每 一 个 L O B 对象都由两部分组成:用于存 储 L O B 内容的指针和L O B 中的数据内容。根 据 L O B 内容的大小不同,系统采取不同的 存储方式。如 果 L O B 中的数据小于4 K B , 则将该内容存储在包含该L O B 列的表中;如 果 L O B 中的数据大于4 K B , 则系统将该内容存储在表的外部。 在创建大对象表时,可以根据实际情况直接使用大对象类型定义某些列。大对象表 定义完成之后,应该使用初始化函数初始化大对象列。对 于 C L O B 或 N C LO B歹!],可以 使 用 EMPTY_CLOB()函数进行初始化。对 于 B L O B 歹U , 应该 使 用 EMPTY_BLOB()函数 进行初始化。可 以 在 IN S E R T 语句中使用这些初始化函数,初始化完成后,可以使用 UPDATE语句向大对象列加入数据。 例如,下面将创建一个示例表POEM _TABLES,该表记录了一些诗人的诗歌,通过 使用这种示例表演示如何使用大对象表。 ( 1 ) 以 SCOTT身份连接数据库系统。 ( 2 ) 使 用 CREATE TABLE语 句 创 建 POEM_TABLES表 。该表包括4 歹(],其中第一、 第二和第三列是普通数据类型的列,第 四 列 POEM_TEXT是 N CLOB数据类型,用于存 储诗歌的文件。 SQL> create table poem_tables( 2 poem_id number constraint poem_pk primary key, 3 ∙poem_name varchar2(50)r 4 poet_name varchar2 (20), 5 poem_text nclob); 表已创建。

( 3 ) 使 用 INSERT语 句 向 POEM TABLES表中插入数据,并 使 用 EMPTY_CLOB() 函数初始化POEM T E X T歹U。 SQL> insert into poem_tables(poem_id,poem_name,poet_name,poem_text)

199

Oracle 11g中文版数据库管理、应用与开发标准教程 2

values (1J 静夜思 I ,李 白 , ,empty_clob ());

已 创 建 1 行。 SQL> insert into poem_tables(poem_id,poem_name z poet_name,poem_text) 2 values ( 2 Λ r 下江陵 I ,李白 I empty_clob ()); 已 创 建 1 行。

( 4 ) 使 用 UPDATE语 句 更 新 POEM_TABLES表 。在更新操作时,将上述两首诗歌 插 入 到 POEM_TABLES表中。这 时 可 以 在 S E T 子句中指定将要插入的诗歌文件,这些 文本使用单引号括起来。 SQL> update poem_tables 2 3 4

set poem_text= , 床前明月光,疑是地上霜。 举头望明月,低头思故乡。 ,

5

where poem_id=l;

已 更 新 1 行。

200

SQL> update poem_tables 2 set poem_text= , 3 朝辞白谣彩云间,千里江陵一日还。 4

两岸猿声啼不住,轻舟已过万重山。 ,

5

where poem_id=2;

已 更 新 1 行。

( 5 ) 使 用 SELECT语 句 检 索 POEM_TABLES表 。 SQL> column poem_name format alθ SQL> column poet_name format alθ SQL> select poet_name,poem_name,poem_text 2

from poem_tables;

POET_NAME

POEM_NAME

POEM_TEXT 李白

静夜思 床前明月光,疑是地上霜。 举头望明月,低头思故乡。

李白

下江陵 朝辞白帝彩云间,千里江陵一日还。 两岸猿声啼不住,轻舟已过万重山。

管 理 表 -----------

8 $ 实验指导 1 . 创建基本表 如果用户要创建一个表,则用户的登录账户 必须具有CREATE TABLE权限。本练 习将使用CREATE TABLE语句创建基本表。 ( 1 ) 以 H R 身份连接到数据库,在其中创建一个学生信 息表STUDENT和一个班级 信 息 表 CLASS。 create table student( sid number(10), sname varchar2(8) t sex char(2), classic! number (3) ) tablespace users; create table class( cid number(3), cname varchar2(20), tel varchar2(20) ) tablespace users;

( 2 ) 修 改 STUDENT表的存储参数。 alter table student move tablespace example;

( 3 ) 为 CLASS表添加一个新字段。 alter table class a d d (addr varchar2(20));

2 . 为表定义约束 上面的练习创建了两个表STUDENT和 C L A S S ,为了保证数据的完整性,下面的练 习将为这些表建立约束。 ( 1) 为 STUDENT和 CLASS表分另∣ J添力口主键约束。 alter add alter add

table STUDENT constraint pk_sid primary key (SID); table CLASS constraint pk_cid primary key (CID);

(2 ) 尝 试 向 STUDENT表中添加两条具有相同主键的记 录。 insert into student(sidz sname,sex f classid) values (1000,' 文 耐 ,'女 ',012); insert into student(sid,sname,sex,classid)

201

--------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 v a l u e s (10 0 0 ,

, ' ⅛ ' , 0 1 2 );

由于向表中添加的记录违反了主键约束, 因此添加第二条记录时将失败。 ( 3 ) 为 STUDENT和 CLASS表添加外键约束。 a l t e r t a b l e STUDENT ad d c o n s t r a i n t s t u _ c l a s s f o r e i g n key (CLASSID) r e f e r e n c e s c l a s s (C ID );

在为表添加外键约束时,由 于 表 STU D EN T已经存在记录,而 C L A SS表为空,这 意 味 着 ST U D E N T 表 中 的 记 录 已 经 违 反 了 外 键 约 束 ,ST U D E N T 表 中 所 有 记 录 的 C L A SSID 字 段 值 必 须 存 在 于 C L A S S 表 的 C I D 列中。所以添加外键约束前需要删除 STUDENT表中的记录,或添加相关的C LA SS表记录。 ( 4 ) 向 STUDENT表添加另外一个班级的学生记 录,以验证外键约束的有效性。 i n s e r t i n t o s t u d e n t ( s id ,s n a m e z s e x , C l a s s i d ) v a l u e s ( 1 0 0 1 ,,李波 I , 男 ,,O i l ) ;

添加该记录时,由于违反外键约束该操 作将失败。这 可 以 通 过 向 C L A S S 表添加一 个 C ID 列 为 0 1 1 的班级信息来解决。

202

( 5 ) 禁 用 STUDENT表的外键约束。 a l t e r ta b le s tu d e n t d is a b le c o n s tr a in t s tu _ c la s s ;

外键约束被禁用外,就 可 以 向 表 STU D EN T添 加 (4 ) 所示的记录了。很显然该记 录是违反外键约束的,因此,添加该项记 录后将无法启用外键约束。

思考与练习 一、填空题 1 . 数据类型与 类型 都用于存储字符串。如果定义了 类型 的字段并且向其赋值时,若字符串的长度小于定 义的长度,则使用空格填齐;而 类型 的字段用于存储变长的字符串,即如果向该列赋 予的字符长度小于定义时的长度,则该列的字符 长度只会是实际字符数据的长度,系统不会使用 空格填充。 2 . R O W ID 实 际 上 保 存 的 是 记 录 的 , 因此通过ROWID来访问记录可以 获得最快的访问速度。 3 . 完 成 下 面 的 语 句 ,使其可以为 EMPLOYEES表 的 E M PN O 列添加一个名为 PK_EMPNO的主键约束。 ATER TABLE EMPLOYEES ADD PK EMPNO PRIMARY KEY



4 . 如果主键约束由一列组成时,该主键约 被 称 为 ; 如果主键约束由两个或两

个 以 上 的 列 组 成 时 ,则该主键约束被称为 5 . 唯一性约束强调所在的列不允许有相同 的值,但是它与主键约束相比,唯一性约束的列 允



, 而主键约束不允许。

6 . 在 Oracle 11g系统中,提供了 4 种常用 的大对象类型。这 4 种大对象类型分别为:CLOB 类型,该类型可以用来存储各种 数据; NCLOB类型则用于存储

语言的字符,

即 非 英 语 字 符 。B L O B 类 型 主 要 用 于 存 储 数据;BFILE类型用于存储指向数据 库系统外面的文件系统中文件的指针。 二、选择题 1 . 如果一个表中某条记录的一个字段暂时 不具有任何值,那么在其中将保存什么内容 ? )

第 8 章 管 理 表 --------------- — A . 空格字符

D.

B . 数字0

6 . 在 使 用 ALTER TABLE语句重建一个表 时 ,应当指定下列哪一个子句 ? ( )

C. NULL D . 该字段数据类型的默认值 2 (

A.

. 下列哪一 项不 是 伪 列 R O W ID 的作用?

) A . 保存记录的物理地址 B . 快速查询指定的记录 C . 标识各条记录

7

B.

REBUILD RELOCATE

D.

MOVE

. 下列哪一项关于主键约束的 描述是正确 ) A . 主键约束用于唯一地确定表 中的每

. 某用户需要创建一个很小的 表,但是该 表会被许多查询使用。这时 用户应当在创建该表

一行数据

3

4

B



. 在一个表中,最多只能有两 个主键 约束

A.

PCTFREE 和 PCTUSED

C . 主键约束只能由一个列组成

B.

CACHE

D . 主键约束不能由一个单列组 成

C.

NOLOGGING

D.

TABLESPACE

. 唯一性约束与主键约束的一个区



8 . 如果希望在激活约束时不验 证表中已有 的数据是否满足约束的定义 ,那么可以使用下列 哪一个关键字? ( )



A.

DISACTIVE

A . 唯一性约束列的值不可以有 重复值

B.

VALIDATE

B . 唯一性约束列的值可以不是唯 一的

C.

ACTIVE

D.

NOVALIDATE

C . 唯一性约束列的值不可以为 空值 D . 唯一性约束列的值可以为空 值 5

REORGANIZE

C.

的? (

D . 保存记录的头信息

时指定下列哪个子句? (

NOT NULL

. 如 果 为 表 EM PLO Y EES添加一个字段

三 、简答题 1 . 介绍创建表时常用的数据类 型。

E M A I L ,并且规定每个雇员都必须具 有唯一的

2

. 简 要 介 绍 O racle数据表的特性。

EM A IL地 址,则 应 当 为 EM A IL字段建立哪种约

3

. 简 要 介 绍 O racle数据表的各类约束及其

束? (

) A.

PRIMARY KEY

B.

UNIQUE

C.

CHECK

作用。 4

. 如何获知表中是否存在迁移 记录和链接

记录? 5

. 如何使用大对象数据类型?

203

第 9 章索引与索引组织表 索引是一种与表相关的可选数据结构,用于加速数据的存取。通过在表的一个或多 个字段上创建索弓I,能够加快针对该表的S Q L 查询语句的执行速度,这是因为利用索弓I, O racle能够获得一种快速访问表中数据的方法。 索引是一种可选的数据结构,在一个表上是否建立索引不会对表的使用方法产生任 何影响。但是如果在表的某些字段上建立了索引,能够显著地提高对该表的查询速度, 并且可以在很大程度上减少查询时的硬盘I /O 操作。索 引 组 织 表 (也 称 为 IOT)是一种 特殊的表,它 以 B 树索引的方式来组织表中的数据,利用索引组织表能够显著提高查询 的速度。 本章学习要点: >

理解索引的作用原理

A

基于函数的索引

>

B 树索引

A

对索引进行修改

>

位图索引

>

索引组织表的优点

>

反向键索引

A

索引组织表的溢出存储

学索引基础 如果一个表包含有很多条记录,当对表执行查询时,必须将所有的记录一一取出以 便将每一条记录与查询条件进行比较,然后再返回满足条件的记录。这样进行操作的时 间开销和I/O 开销都是十分巨大的。这时就可以考虑通过建立索引来减小开销。 简单地说,如果将表看作一本书,索引的作用则类似于书中的目录。在没有目录的 情况下,要在书中查找指定的内容必须阅读全书,而有了目录之后,只需要通过目录就 可以快速找到包含所需内容的页。类似地,如果要在表中查询指定的记录,在没有索引 的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索 引字段值,就 可 以 通 过 保 存 在 索 引 中 的 ROWID (相 当 于 页 码 )快速找到表中对应的 记录。 因此,合理地使用索引可以大大降低磁盘的I /O 次数,从而提高数据访问性能。假 设 E M P表中的数据占用了 10000个数据块,如 果 EM PNO列上不存在索引,那么当执行 查询操作时需要执行全表扫描,这种操作的I /O 次 数 为 10000次 ;如 果 EM PN O 列上存 在 索 引 (假 设 索 引 层 次 为 2 ), 那么执行查询时将使用索引进行扫描,这 时 I / O 次数为 4 次。 索引与表一样,不仅需要在数据字典中保存索引的定义,还需要在表空间中为它分 配实际的存储空间。创建索引时,O racle会自动在用户的默认表空间或指定的表空间中 创建一个索引段,为索引数据提供存储空间。与创建表的情况类似,在创建索引时也可 以为它设置存储参数。 为某个表创建的索引不必和该表保存在同一个表空间中。如果将索引和对应的表分



9 索引与索引组织表



别存放在不同硬盘的不同的表空间中,反而能够提高查询的速度。因 为 O racle能够并行 读取不同硬盘中的数据,这样的查询可以避免产生I/O 冲突。 在创建索引时,O ra c le首先对将要建立索引的字段进行排序,然后将排序后的字段 值 和 对 应 记 录 的 R O W ID 存储在索引段中。例如,假设使用下面的语句为E M P 表中的 ENAM E字段创建索引。 SQL> c r e a t e i n d e x em p_enam e on emp (e n a m e ) ; 索引已创建。

O racle首 先 在 E M P表 中 按 照 ENAM E字段进行排序,默认为升序排序,然后按照排 序后的顺序将EN AM E字段值和对应的RO W ID逐个保存在索引中。建立索引的字段被 称为索引字段,例 如 ENAM E字段即为索引字段。 在索引创建之后,如果执行一条在W HERE子句中引用了 ENAM E字段的查询,例 如: SQL> s e l e c t e n a m e ,h i r e d a t e f s a l 2 fro m emp 3 w h e re e n a m e = , SMITH , ; ENAME SMITH

HI RE DATE 1 7 -1 2 月- 8 0

SAL 960

O racle将首先对索引中的EN AM E字段进行一次快速搜索(因为索引中的ENAME 字段已经排序,所以该搜索是非常快的),找 到 符 合 条 件 的 E N A M E 字段值所对应的 R O W ID ,然后再利用ROW ID到 E M P表中提取相应的记录。这个操作比逐条读取EMP 表中未排序的记录要快得多。 可以看出, 在索引中只保存索引字段的值与相应的ROWID, 这 种 组 合 称 为 “索引条目”。 初学者常常会混淆索引与键,特别是对于唯一索引与主键。其实索引与键两个术语 在许多地方都可以互换,尤 其 是 Oracle有时会利用索引特别是唯一索引实现一些完整性 约束。但是它们在本质上有着相当明显的区别。索引是存储在数据库中的一种实体结构, 可 以 通 过 S Q L 语句创建、修改和删除。而键只是一个逻辑上的概念,在 O racle中键是与 完整性约束相对应的。 在 O racle中可以创建多种类型的索引,以适应各种表的特点。按照索引数据的存储 方式可以将索引分为B 树索引、反向键索引、位图索引和基于函数的索引等。按照索引 列的个数又可以分为单列索引和复合索引。按照索引列的唯一性,索引又可以分为唯一 索引和非唯一索引。 注 意 ----------------------------------------------------------------------具有索引的表与不具有索引的表,在 编 写 S Q L 查询语句时没有任何区别。索引只是提供 一种快速访问指定记录的方法。可以说,表是否具有索引对表的查询速度影响较大,而对其 他方法的影响则非常微小。索引一旦创建,将 由 O ra c le 自动管理和维护,例如,向表中插入、 更新或删除一条记录时,O racle会自动在索51中做相应的修改。

205

Oracle 1 1g中文版数据库管 理、应用与开发标 准教程 单列索引是基于单 个列所建立的索引 ,而复合索引是基 于两个列或多个列 所建立的 索引。需要注意,B 树索引列的个数不 能超过3 2 歹∣ J , 位图索引列的个数 不能超过3 0 歹IJ。 可以在同一个表上 建立多个索引,但 要求列的组合必须 不同,使用以下语 句建立的两个 索引是合法的。 SQL> create index emp_name_job_index on e m p (ename z job);

索引已创建。 SQL> create index emp_j ob_name_index on emp(job,ename);

索引已创建。

如上所示,尽 管 索 引 EMP NAME JOB IN D E X 和 EMP JOB NAME IN D E X 用至∣ J 了 相 同 的 列 (E N A M E 和 J O B 歹(]),但因为顺序不 同,所以是合法的 。如果顺序完全相 同,则该复合索引 是不合法的。 唯一索引是索引列 的值不能有重复的 索引;非唯一索引 是索引列的值允许 重复的索 引。无论是唯一索 引还是非唯一索引 ,索引列都允许N U L L值 。需要注意,当定义主键 约束或唯一约束时 ,Oracle会自动在 相应的约束列上建 立唯一索引。

206

建立和规划索引时 ,必须选择合适的 表和列。如果选择 的表和列不合适,不仅无法 提高查询速度,反 而会极大地降低D M L 操作的速度。建立 索引的策略如下。 □ 索引应该建立在W H E R E 子句经常引用的表 列上。如果在大表 上频繁使用某列 或某几列作为条件 执行检索操作,并 且 检索行数低于总行 数的1 5 % , 那么应该 考虑在这些列上建 立索引。 □ 为了提高多表连接 的性能,应该在连 接列上建立索引。 □ 不要在小表上建立 索引。 □ 如果经常需要基于 某列或某几列执行 排序操作,那么在 这些列上建立索引 可以 加快数据排序的速 度。 □ 限制表的索引个数 。索引主要用于加 快查询速度,但 会 降 低 D M L 操作的速度。 索引越多,D M L 操作的速度越慢,尤其会极大地影响 INSERT操 作 和 DELETE 操作的速度。因引 ,规划索引时,必 须仔细权衡查询和 D M L 的需求。 □ 删除不再需要的索 引。因为索引会降 低D M L 的速度,所以应该 删除不合理或不 需要的索引。不合 理的索引包括:在 小表上建立的索引 ,因为表很小,使用索 引不会加速查询速 度;查询语句不会 引用的索引。 □ 指定索引块空间的 使用参数。基于表 建立索引时,O ra c le 会将相应表列数据 添 力口至U索弓I块 。为索引块添加数 据时,Oracle会 按 照 PCTFREE参数在索 引块上预 留部分空间,该预 留空间是为将来的 IN SER T操作准备的。如 果将来在表上执 行 大 量 INSERT操 作 ,那么应该在建立索 引时设置较大的P C T FR E E ,需要注意, 建立索引时不能指 定PCTUSED关键 字。 □ 指定索引所在的表 空间。建立索引时 ,既可以将索引和 基表放在相同的表 空间 中,也可以放在不 同的表空间中。将 表和索引部署到相 同的表空间,可以 简化 表空间的管理;将 表和索引部署到不 同的表空间,可以 提高访问性能。 □ 当在大表上建立索 引时,使 用 N O LOG GING选项可以最 小化重做记录。使用

第 9 索引与索引组织表 ------------- NOLOGGING选项 可以节省重做日志 空间、降低索引建 立时间、提高索引并 行 建立的性能。

④建立索引 建立索引是使用CREATE IN D E X 语句完成的。一般 情况下,建立索引是 由表的所 有 者完 成 的 ,如果要以其他用 户身份建立索引, 则 要 求 用 户 必 须 具 有 CREATE ANY IN DEX系统权限或者 相应表的INDEX对 象权限。

r丁一-一一9一一 ∙一 2一一 . 1一一 建立 B树 索 引 -、 — ————― B 树 索 引 是 O racle中默认的、最 常用的索引类型。B 树索引是以B 树结构组织并存 放索引数据的。默 认情况下,B 树索引中的数据是 以升序方式排列的 。如果表包含的数 据非常多,并且经 常在W HERE子句中引用某 列或某几个列,则 应该基于该列或这几 个 列 建 立 B 树索引。B 树索引由根块、分 支块和叶块3 部分组成,其中主要 数据都集中在 叶子结点,如 图 9 -1 所示。

207

£ 1 图 9-1

B 树索引的逻辑结构图

□ 根 块 索 引 顶 级 块 ,它包含指向下一 级节点的信息。 □ 分支块 □ 叶块

.

它包含指向下一级 节点(分支块或叶块)的 信息。 它包含索引人口数 据,索引入口包含 索引列的值和记录 行对应的物理地

址 ROWID o 在 B 树索引中无论用户 要搜索哪个分支的 叶块,都可以保证所 经过的索引层次是相 同的。O racle采用这种方式 的索引,可以确保 无论索引条目位于 何处,都只需要花费 相 同 的 I /O 即可获取它。这就是为什么被称 为B 树索引,其 中 的 B 为平衡之意( Balanced) 。 例如,使用 这 个 B 树索引搜索编号为 “ 1015” 的结点时,首先要 访问根结点,从根 结点中可以发现,下 一步应该搜索右边 的分支(因 为 1015大 于 1012)。因此必须第二次 读取数据,读取右 边的分支结点。从 右边的分支结点可 判断出,要搜索的索 引条目位于 最左边的叶子结点 中。在那里可以很 快找到要查询的索 引条目,并根据索 引条目中的 ROW ID进而找到所要查 询的记录。 这样,对 建 立 B 树索引的表进行查 询时,只需要读取4 次 数 据 (第一次读取根结点 , 第二次读取分支结 点,第三次读取叶子 结点,最后一次用于从表 中获取相关数据)。与在

Oracle 1 1g中文版数据库管理、应用与 开发标准教程 表中进行完全搜索可能要读取 几十次数据相比,使用索引检索 数据通常要快得多。 如 果 在 W HERE子句中要经常引用某列或 某几列,应该基于这些列建立 B 树索引。 如果经常执行类似于SELECT * FROM EMP WHERE EN A M E=5C 0TT的语句,可以基 于 ENAM E列 建 立 B 树索引。建 立 B 树索引的示例如下: SQL> create index e m p _ e n a m e _ i n d e x on emp(ename) 2

p c t f r e e 30

3

t a b l e s p a c e users;

索引已创建。

如 上 所 示 ,子 句 P C T F R E E 指 定 为 将 来 IN S E R T 操 作 所 预 留 的 空 闲 空 间 ,子句 TABLESPACE用于指定索引段 所在的表空间。假设表已经包含了大量数据,那么在建立 索引时应该仔细规划PCTFRE E的值,以便为以后的INSERT 操作预留空间。 从 Oracle 10g开始,Oracle会自动搜索表 及其索引的统计信息。建 立 B 树索引后, 如 果 在 W HERE子句中引用索引列,Ora cle会根据统计信息确定是否使 用B 树索引定位 表行数据。下 面 以 在 W HERE子句中引用B 树索引列并显示其执行计划,说 明 O racle使 用B 树索引的方法。示例如下:

208

SQL> set a u t o t r a c e on explain SQL> select e n a m e z h i r e d a t e z sal 2

fro m emp

3

where e n a m e = , S C O T T , ;

ENA M E

HIREDATE

SCOTT

19-4 月 -87

SAL 3000

执行计划 Plan h a s h v a l u e : 32768 5 8 1 5 6

I Id

∣ Operation

( % C P U ) ∣ Time

I

0 ∣ SE L E C T S T A T E M E N T

00:00:01 1

∣ N ame

1

I Rows

1

1

I T A B L E A C C E S S B Y INDEX R O W I D ∣ EMP

Predicate

I Cost

1

18 ∣

1

2(0)





I 00:00:01 ∣ I* 2 ∣ INDEX R A N G E S C A N 00:00:01

∣ Bytes



∣ EMP ENA M E



INDEX





I n fo r m a t i o n

(identified b y o p e r a t i o n i d ) :

2 - access (n E N A M E ,,= , S C O T T , )

1

1

1 1

18 1



2(0) 1(0) ∣

索引与索引组织表

r _- _9.2.2 建 立 位 图 索 引✓ -、 __________________ 索引的作用简单地说就是能够通过给定的索引 列值,快速地找到对应的记录。在 B 树索引中,通过在索引中保存排过序的索引 列的值以及记录的物理地址R O W ID 来实现 快速查找。但是对于一些特殊的表,B 树索引的效率可能会很低。 例如,在某个具有性别列的表中,该列的所有 取值只能是:男或女。如果在性别列 上 创 建 B 树索引,那么创建的B 树只有两个分支,如 图 9 -2 所示。那么使用该索引对该 表进行检索时,将返回接近一半的记录,这样 也就失去了索引的基本作用。

O

图 9-2 _ “性 别 ”列 上 的 B 树索引图示

像这样当列的基数很低时,为 其 建 立 B 树索引显然不合适。“基数低”表示在索引 列中,所有取值的数量比表中行的数量少。如 “性 别 ”列 只 有 2 个取值;再比如某个拥 有 10000行的表,它的一个列包含有100个不同的取值,则该列仍然满足低基数的要求, 因为该列与行数的比例为1%。O racle推荐当一个列的基数小于1%时 ,这些列不再适合 建 立 B 树索引,而适用于位图索引。 位图索引以位图值标识索引行数据,它主要用于在D S S 系统中执行数据统计、数据 汇总等操作。B 树索引建立在重复值很少的列上,而位图索引 建立在重复值很多、不同 值相对固定的列上。使用位图索引可以节省大 量磁盘空间,它所占用的空间仅仅是在相 同列上建立B 树索引所引用空间的1/20〜 1/10。建立位图索引时,O racle会基于每个不 同值建立一个位图。假 设 要 基 于 EMPLOYEES表 的 S E X 列建立位图索引,因为该列只 有两个不同值,所以只建立两个位图。当行数据匹配位图值时,相 应 位 置 为 1 , 否 则 为 0, 如 图 9 -3 所示。

£ 3 图 9-3 一位图索引示意图

209

Oracle 1 1g中文版数据库管理、应用与 开发标准教程 当在表中低基数的列上建立位 图索引时,系统将对表过行一 次全表扫描,为遇到的 各 个 取 值 构 建 “图表”。例如,对于 上 述 EMPLOYEES表 的 S E X 列而言,它仅包含两种 取值,因此,在这个图表的顶 部列出了 2 个值。在 O racle系统为创建位图索引进行 全表 扫描时,也将创建位图索引记 录,各个行都以在表中出现的 顺序列出。在位图索引的图 表中,各个值的列下面都标记了一个 0 或 1。0 表 示 “否 ,该值不在这一行”;1 表 示 “是, 该值存在于这一行中” 。 可以注意到,1 和 0 虽然自己不能作为指向行的指 针,但是,如果给定表的起始物 理地址和终止物理地址,则由 于图表中各个0 和 1 的位置与表行的位置是相对应 的,所 以可以计算表中相应行的物理 位置。 由 于 S E X 列只有两种数据,并且经常需要基于该列执行数 据统计、数据汇总等操作, 所以应该基于该列建立位图索 引。在创建位图索引时,只 需 要 在 CREATE IN D E X 语句 中显式地指定BITM AP关键字。例如,下面的语 句在E M P 的 JO B 列创建位图索引。 SQL> create bitmap index emp_j ob_bmp 2 on emp(job) 3 tablespace users; 索引已创建。

210

初 始 化 参 数 CREATE_BITMAP_AREA_ SIZE用于指定建立位图索引时 分配的位图 区大小,默 认 值 为 8 M B ,该参数值越大,建立位图索 引的速度越快。为了加快创建位图 索引的速度,应将该参数设置 为更大的值。因为该参数是静 态参数,所以修改后必须重 新启动数据库才能生效。修改 该参数的示例如下: SQL> connect system/password 已连接。 SQL> alter system set create_bitmap_area_size=8388608 2 scope=spfile; 系统已更改c

由 于 Oracle 11g会自动搜集表和索引的统 计信息。当 在 W HERE子句中引用位图索 引列时,O racle会自动根据统计值确定是 否要引用位图索引。下 面 在 W H ER E子句中引 用位图索引列,并显示其执行 计划。 SQL> set autotrace on explain SQL> select count (*) from emp 2

where job= , SALESMAN , ;

COUNT{*) 4 执行计划 Plan hash value: 2421906430



9 章

索引与索引组织表 I Id



{ Operation

Name

0 ∣ SELECT S TA T E M E N T

∣Rows

∣Bytes ∣C ost (%CPU) I Time





1 ∣



1 ∣ SORT A G G R E G A T E





1 ∣



2 ∣ B I T M A P C O N V E R S I O N COU N T





3 ∣

∣ BITMAP

3



1 (0)

8 ∣ 24





f 1 (0)





00:00:01 ∣*

8 ∣



0 0: 00:01

INDEX FAST FULL S C A N

P r e di c a t e I n f o r m a t i on

∣ EMP_JOB_BMP







∣ ∣

(identified b y o p e r a t i o n i d ) :

3 - filter (n JOB',= , S A L E S M A N , )

对 于 B 树索引而言,使 用 O R 谓词效率很低;使用位 图索引时,因为可以执行位图 合 并 , 所 以 使 用 AND、 O R 或 N O T 谓 词 的 效 率 很 高 。 初 始 化 参 数 BITMAP_MERGE_AR EA_SIZE用于指定合并 位图时分配的内存大小 ,默 认 值 为 1MB, 该参数值越大,位图合 并速度越快。为了加快 位图合并速度,应将该 参数设置为更大的 值 。因为该参数是静态参 数,所以修改后必须重 新启动数据库才能生效 。修改该参数的 示例如下:

211

SQL> a l t e r sys t e m set b i t m a p _ m e r g e _ a r e a _ s i z e = 2 048000 2

s c o p e = s p f ile;

系统已更改 α

这样,当 在 W H ER E子句中引用位图索引 列,并 使 用 AND、O R 或 N O T 谓词时, Oracle会执行位图合并 操作。示例如下: SQL> set a u t o t r a c e on ex plain SQL> select c o u n t (*) 2

f rom emp

whe r e j o b = , S A L E S M A N , or j o b = , C L E R K , ;

C O U N T (*)

9

执行计划 Plan has h value:

∣ Operation

I Id I Time

I

0

2 4 21906430

∣ SELECT S T A TE M E N T

00:00:01

∣ Nam e

∣ Row s

∣ Byt e s

∣ Cost

(%CPU)









1



8



1

(0)

I

Oracle 11g中文版数据库 管理、应用与开发 标准教程 |

1

| SOR T A G G R E G A T E

I

2

∣ B I T M A P C O N V E R S I O N COUNT

00:00:01

I

I

1



I ∣

8



6 ∣

I 48



1



(0)



∣ * 3 ∣B I T M A P INDEX FAST F ULL SCAN ∣E M P _ J O B _ B M P ∣

P r e d i c a te I n f o r m at i o n







(identified b y o p e r a t i o n i d ) :

3 - filter (,,J O B ,'= ' C L E R K t O R

,'J O B ,,= , S A L E S M A N ')

在 Oracle中,系统会自动为表的主键列建立索弓I, 这个默认索引是普 通的B 树索弓|。 通常,用户会希望 表的主键是一个自 动增长的序列编号 ,这样的列就是所 谓的单调递增 序列编号列。当在 这种顺序递增的列 上建立普通的B 树索引时,如果表 的数据量非常庞 大 ,将导致索引数据 分布不均。为了分 析原因,可 以 考 虑 常 规 的 B 树索引,如 图 9-4 所示。

212

图 9 -4 τ 常 规 的 B 树索引

可以看到,这是一 个典型的常规B 树索引。如果现在 要为其添加新的数 据,由于主 键列的单调递增性 ,很明显不需要重 新访问早先的叶子 节点。接下的数据 获得的主键为 8 0 , 下一组数据的主键 为9 0 , 依次类推。 这种方法在某些方 面是具有优势的, 由于它不存在在已 经存在的表项之间 嵌入新的 表项这一现象,所 以不会发生叶子节 点的数据块分割。这意味着单调递增 序列上的索引 能够完全利用它的 叶子节点,非常紧 密地存放数据块,可以有效地利用存 储空间。然而 这种优势是需要付 出代价的,每条记 录都会占据最后的 叶子结点,即使删除了先前的节 点 ,也会导致同样的 问题。这最终会导 致对某一边的叶子 节点的大量争用。 所以就需要设计一 个规则,阻止用户 在单调递增序列上 建立索引后使叶子 节点偏向 某一个方向。遗憾 的是,序列编号通 常是用来做表的主 键的,每个主键都需要建立索弓I, 如果用户没有建立 索引,Oracle也会 自动建立。但是,Oracle提供另一种 索引机制,即 反向键索引,它可 以将添加的数据随 机分散到索引中。 反向键索引是一种 特殊类型的B 树索引,在顺序递 增列上建立索引时 非常有用。反 向键索引的工作原 理非常简单,在存 储结构方面它与常 规的B 树索引相同。然而 ,如果 用户使用序列在表 中输入新记录,则 反向键索引首先反 向每个列键值的字 节,然后在反 向后的新数据上进 行索引。例如,如果用户输入的索 引列为2 0 0 8 ,则反向转换后为8 002;

索引与索引组织表 2 0 4 1 反 向转换后为1402o 需要注意,刚才提及的两个 序列编号是递增的,但是当 进行反 向键索引时却是非递增的。这意味如果将其添加到叶子 结点,可能会在任意的叶子 结点 中进行。这样就使得新数据 在值的范围上的分布通常比 原来的有序数更均匀。 对 于 E M P表 的 EM PNO列而言,由于该列是顺 序递增的,所以为了均衡索引数据分 布 ,应在该列上建立反向键索 引。创建反向键索引时只 需要在CREATE IN D E X 语句中 指 定 关 键 字 REV ER SE即可。例如,下面的语 句为表E M P 的 EM PN O 列创建了反向键 索引。 SQL> create index p k _ e m p 2

on e m p (empno)

3

t a b l e s p a c e users;

reverse

如果在该列上已经建立了 普通B 树索引,那么可以使用ALTER INDEX∙∙∙REBUILD 将其重新建立为反向键索 引。示例如下: SQL> alter index p k_ e m p 2

re b u i l d reverse;

索引已更改。

从 Oracle 11g开始,O racle会自动搜集表和索引 的统计信息。当 在 W HERE子句中 引 用 反 向 键 索 引 列 时 ,O ra c le 会 自 动 根 据 统 计 值 确 定 是 否 引 用 反 向 键 索 引 。下面在 W HERE子句中引用反向键索 引列,并显示其执行计划。 SQL> set a u t o t r a c e on ex p l a i n SQL> select ename 2

from emp

3

whe r e empno=7499;

ENAME

ALLEN

执行计划

Plan hash v a l u e : 294954 4 1 3 9

I Id

∣ Operation

∣ SEL E C T

I Nam e

∣ ∣

∣ Rows

∣ 10

I

0

I

1 I TAB L E A C C E S S BY INDEX R O W I D ∣ E M P

I*

2

S T A T E M EN T

∣ IN D E X U N I Q U E SCAN

P r e d i c a t e I n f o r m at i o n

1

∣ Bytes

∣ PK _ E M P



∣ Cos t

( 0 ) ∣ 00:00:01

1

∣ 1 ∣ 10 ∣ 1





∣ 1

(0) ∣ 0 0 : 00:01



0

(0) ∣ 00:00:01





(identified b y o p e r a t i o n i d ) :

2 - access (,,EMPNO' ,=7499)

(%CPU) ∣ Time

213

Oracle 11g中文版数据库管理、应用与开发标准教程

键的反转对用户而言是完全透明的,用户只需要像常规方式一样查询数据,对键的反转 处理将由系统自动完成。

0 - 9 .2 .4 基于函数的索引、 用户在使用O racle数据库时,最常遇到的问题之一就是它对字符大小写敏感。如果 在 E M P 表中存储的雇员姓名为S M IT H ,则用户使用小写搜索时,将无法找到该行记录。 如果用户不能够确定输入数据的格式,那么就会产生一个严重的错误。例如: SQL> select empno z ename,job,sal from emp 2 where ena me ≡ 1 s m ith , ;

未选定行

这可以通过使用O racle字符串函数对其进行转换,然后再使用转换后的数据进行检 索 。例如: SQL> select empno z ename z job r sal from emp

214

2

where upper(ename)=upp er ( , smith*);

EMPNO

ENAME

7369

SMITH

JOB

SAL

CLERK

800

采用这种方法后,无论用户输入数据时所使用的字符的大小写如何组合,都可以使 用该语句检索到数据。但是,使用这样的查询时,用户不是基于表中存储的记录进行搜 索 的 。 即 如 果 搜 索 的 值 不 存 在 于 表 中 ,那 么 它 就 一 定 也 不 会 在 索 引 中 ,所以即使在 EN AM E列上建立索弓|,O racle也会被迫执行全表搜索, 并为所遇到的各个行计算UPPER 函数。 为了解决这个问题,O racle提供了一种新的索引类型— —

基于函数的索引。基于函

数的索引只是常规的B 树索引,但它存放的数据是由表中的数据应用函数后所得到的, 而不是直接存放表中数据本身。 由 于 在 S Q L 语句中经常使用小写字符串,所 以为了加快数据访问速度,应基于 LO W ER函数建立函数索引。示例如下: SQL> create index idx_ename 2

on emp(lower(ename));

索引已创建α

创建这个函数索引之后,如果在查询条件中包含相同的函数,则系统会利用它来提 高查询的执行速度。例如,下面的查询在W HERE子句使用函数并显示其执行计划。 SQL> set autotrace on explain SQL> select ename,job,sal 2

from emp

索引与索引组织表 3

where lower(ename)= ,martin , ;

ENAME

JOB

MARTIN

SALESMAN

SAL 1250

执行计划 Plan hash value: 898688482 ∣Id

∣Operation

∣Name

∣Rows

∣Bytes ∣Cost (%CPU) ∣Time



∣ 0 ∣ SELECT STATEMENT ∣ ∣ 1 ∣ 25 ∣ 2 (0 ) ∣ 00:00:01 ∣ I 1 ∣ TABLE ACCESS BY INDEX ROWID ∣ EMP ∣ 1 ∣ 25 ∣ 2 (0) ∣ 00:00:01 ∣ I* 2 ∣ INDEX RANGE SCAN ∣ IDX_ENAME ∣ 1 ∣ ∣ 1 (0) ∣ 00:00:01 ∣

Predicate Information (identified by operation id): 2 - access(LOW ER(n ENAME π )= ,martin')

如果用户在 自己的模式 中创建基于 函数的索引 ,则 必 须 具 有 QUERY REWRITE 系 统权限。 如果用户要在其他模式中创建索弓I, 必须具有 CREATE ANY INDEX 和 GLOBAL QUERY REWRITE 权 限 。

④修改索引 修改索引是 使用 ALTER IN D E X 命令完成的 。一般情况下 ,修改索引是 由索引的所 有者完成的 ,如果要以 其他用户身 份修改索引 ,则 要 求 该 用 户 必 须 具 有 ALTER ANY IN D E X 系统权限或 在相应表上 的 IN D EX 对象权限。

. 7 9 3 1 合并索引和重建索引4; 为表建立索 引后,随着对 表不断进行 更新、插入和 删除操作,索引中会产生 越来越 多的存储碎 片,这对索引 的工作效率 会产生负面 影响。这时可 以采取两种方 式来清除碎 片— —

重建索引或 合并索引。合 并索引只是 将 B 树中叶子节 点的存储碎 片合并在一 起, 并不会改变 索引的物理 组织结构。例 如,下面的语 句对索引 EMP_ENAM E_INDEX 执行 合并操作。 SQL> alter index emp_ename_index 2 coalesce deallocate unused; 索引已更改。

图 9 - 5 显示了对索 引执行合并 操作后的效 果。假设在执 行该操作之 前,B 树索引的 前 两 个 叶 块 都 有 50% 的空闲空间 。合并索引 后,可以将 它们的数据 合并到一个 索引叶 块中。

215

Oracle 11g中文版数据库管理、应用与 开发标准教程



图 9-5 τ 对 B 树索引进行合并操作

消 除 索 引 碎 片 的 另 一 个 方 法 是 重 建 索 引 ,重 建 索 引 可 以 使 用 ALTER IN D E X R E B U IL D 语句。重建操作不仅可以消除 存储碎片,还可以改变索引的全 部存储参数设 置 ,以及改变索引的存储表空间。重建索引实际上是在指定的表空 间中重新建立一个新 的索引,然后再删除原来的索引 。例如,下面的语句对索引EM P_ENAME_INDEX进行 重建。 SQL> alter index emp_ename_index rebuild; 索引已更改。

在 使 用 ALTER ΠMDEX∙∙-REBUILD语句重建索 引时,还可以在其中使用REVERSE

216

子句将一个反向键索引更改为普 通索引,反之可以将一个普通的 B 树索引转换为反向键 索引。另外,也可以使用TAB LESPACE子句以指定重建索引 的存放位置。 SQL> alter index emp_j ob rebuild 2 tablespace example;

φ - 9 . 3 . 2 删除索引 删除索引是使用DROP INDEX语句完成的。一般情况下,删除索引是由索引所有者 完成的,如果以其他用户身份删 除索引,则要求该用户必须具 有DROP ANY INDEX系 统权限或在相应表上的INDEX 对象权限。通常在如下情况下需 要删除某个索引。 □ 该索引不再需要时应该删除该索 引,以释放其所占用的空间。 □ 如果移动了表中的数据,导致 索引中包含过多的存储碎片,此时需要删除并重 建索引。 □ 通过一段时间的监视,发现很少 有查询会使用到该索引。 索引被删除后,它所占用的所有 盘区都将返回给包含它的表空间 ,并可以被表空间 中的其他对象使用。索引的删 除方式与索引创建采用的方式 有关,如 果 使 用 CREATE IND EX 语句显式地创建该索引,则可 以 用 DROP INDEX语句删除该索引。例如 : SQL> drop index emp_j ob_bmp; 索引已删除。

如果索引是定义约束时由O ra c le自动建立的,则必须禁用或删除该约束本身 。另外, 在删除一个表时,O racle也会删除所有与该表相关 的索引。 关于索引最后需要注意一点,虽 然一个表可以拥有任意数目的 索引,但是表中的索 引数目越多,维护索引所需的开 销也就越大。每当向表中插入、删除和更新一条记录时,



9 索引与索引组织表



O ra c le都必须对该表的所有 索引进行更新。因此,用户还需要在表的查询 速度和更新速 度之间找到一个合适的 平衡点。也就是说,应 该根据表的实际情况限 制在表中创建的索 引数量。

为了显示O racle索引的信息,Or acle提供了一系列的数 据字典视图。通过查询 这些 数据字典视图,用户可 以了解索引的各方面信 息。 1 . 显示表的所有索引 索引是用于加速数据存 储的数据库对象。通过 查询数据字典视图DB AJNDEXES, 可以显示数据库的所有 索引;通过查询数据字 典视图A L L JN D E X E S ,可以显示当前用 户可访问的所有索引;查 询 数 据 字 典 视 图 U SER _IN D EX ES,可以显示当前用户 的索引 信 息 。下 面 以 显 示 S C O T T 用 户 E M P 表 的 所 有 索 引 为 例 ,说明使用数据字典 视图 DBA_INDEXES 的方法。 SQL> connect system/password 已连接。 SQL> select index_name x index_type z uniqueness 2

217

from dba_indexes

3 where owner= , SCOTT , and table name= ,E M P , ; INDEX_NAME

INDEX_TYPE

EMP_ENAME_INDEX

NORMAL

NONUNIQUE

EMP_JOB_BMP

BITMAP

NONUNIQUE

]DX_ENAME

FUNCTION-BASED NORMAL

NONUNIQUE

PK_EMP

NORMAL/REV

UNIQUE

UNIQUENES

如上所示,INDEX_N AM E用于标识索引名。IN DEX_TY PE用于标识索引类型 : NORMAL表示普通B 树索弓|; REV表示反向键索引;BITMAP表示位图索弓| ; FUNCTION 表示基于函数的索引。UNIQUENESS用于标 识索引的唯一性。OW NER用于标识对象的 所有者。TABLE_NA ME用于标识表名。 2 . 显示索引列 创建索引时,需要提供相应的表列。通过查询数据字典视图 DBA_IND_COLUMNS, 可以显示所有索引的表 列信息;通过查询数据 字典视图ALL_IND_C OLUM NS,可以显 示 当 前 用 户 可 访 问 的 所 有 索 引 的 表 列 信 息 ;通 过 查 询 数 据 字 典 视 图 USER_IND_ C O L U M N S ,可以显示当前用户索 引的表列信息。 例如,下面的语句将显 示SCOTT用 户 的 PK_EM P索引列信息。 SQL> col column_name format a20 SQL> select column_name z column_position z column_length 2

from user_ind_columns

3

where index name= , PK EMP';

Oracle 11g中文版数据库 管理、应用与开发 标准教程

COLUMN_NAME

COLUMN POSITION

COLUMN LENGTH

1

22

EMPNO

如上所示,COL UMN_NAME用 于标识索引列的 名称;COLUMN PO SITIO N 用于 标识列在索引中 的位置;COLUM N_LENGTH用于 标识索引列的长 度。 3 . 显示索引段位置及 其大小 建立索引时,O racle会为索引分 配相应的索引段 ,索引数据被存 放在索引段中,并 且段名与索引名 完全相同。通过 查询数据字典视 图DBA_SEGM EN TS,可以显示数据 库 所有段的详细信 息;通过 查 询 数 据 字 典 视 图 U SER_SEG M EN TS,可以显示当前 用户段 的详细信息。 例如,下面的语 句将显示SCOTT 用 户 的 PK_EM P段的信息。 SQL> select tablespace_nam e r segment_type r bytes 2 from user_segments 3 where segment_name= , PK_EMP , ; TABLE S PACE_NAME

218

USERS

SEGMENT_TYPE

BYTES

INDEX

65536

其中,TABLESP ACE_NAME用于 标识段所在的表 空间;S E G M E N T JY P E 用于标 识段的类型;BY TES用于标识段 的大小;SEGME NT_NAME用于 标识段的名称。 4 . 显示函数索引 建立函数索引时 ,O racle会将函数索 引的信息存放到 数据字典中。通过 查询数据字 典 视 图 DBA_IND_EXP RESSIONS,可以 显示数据库所有 函数索引所对应 的函数或表达 式 ;通过查询数据 字典USER_IND _EXPRESSIONS ,可以显示当前用 户函数索引所对 应 的函数或表达式 。 例如,下面的语 句显示E M P表中基于函数的 索引信息。

索引组织表是O racle提供的一种 特殊的表,它将数 据和索引数据存 储在一起,或者 说索引组织表是 按照索引的结构 方式来组织和存 储表中的数据的 。索引组织表适用 于经 常通过主键字段 值来查询整条记 录的情况,这样 可以大大提高查 询效率。其典型的 应用 类似于字典的情 形,主要用于搜 索一些有意义的 信息。

索引与索引组 织表

索引组织表也 称为I O T , 索引组织表实 际上一个表,不过它的存储 结构不像普通 表 那样采用堆组 织方式,而是 采用索引的组 织方式。对于 普通表而言,其存储结构是 将记 录无序地存放 在数据段中,而索引组织表 是将记录按照 某个主键列进 行排序后,再 以 B 树的组织方式 存放在数据段 中。 由于整条记录 都被保存在索 引中,所以索 引组织表不需 要使用R O W ID 来确定记录 的位置。在索引组织表 中只需要知道 主键列的值,就能够直接找 到相应记录的 完整内容。 因此,索引组 织表提供了快 速的、基于主 键的对表中数 据快速访问的 方法。但是,这是 以牺牲插入和 更新性能为代 价的。图 9 - 6 示意性地列出 了索引组织表 与标准堆表之 间的 区别。

219



图 9-6 ■ 索引组织表与标 准堆表的对比

对于普通表而 言,表 、索引数据分 别存放在表段 、索引段中,要占用更多空 间;而 对于索引表而 言,主键列和 非主键列的数 据都被存放在 主键索引段中 。当经常要使用主 键列定义表数 据时,应该建 立索引表。使 用索引表,一 方面降低了对 磁盘和内存空 间的 占用量,另一 方面也可以提 高访问性能。 建立索引表也 是使用CREATE TABLE语句 完成的。需要 注意,建立索引组织表时, 必须 指 定 ORGANIZATION INDEX关键 字,并且在索 引组织表中必 须定义主键约 束。例 如 ,下面的语句 建立了一个索 引组织的EM PLOYEES表 。 SQL> create table employees( 2 emρno number(5) primary keyz 3 ename varchar2(15) not null, 4 job varchar2(10), 5 hiredate date default (sysdate), 6 sal number(7,2),

Oracle 1 1 g 中文版数据库管理、应用与开 发标准教程 7 deptno number(3) not null 8 ) organization index 9 tablespace users; 表已创建:;γj

如果向索引组织表中添加数据 ,O racle会根据主键列对其进行排 序,然后将数据写 入磁盘。这样在使用主键列查 询时,在索引组织表上可以得 到更好的读取性能。在标准 堆表上进行相同的查询时,需 要首先读取索引,然后再判断 数据块在磁盘上的位置,最 后 Oracle将相关的数据块放入内 存中。而索引组织表将所有数 据都存储在索引中,所以 不需要再去查找存储数据的数 据块。这样相同的查询,在索 引组织表中执行的效率是标 准堆表的两倍。 虽然索引组织表的查询执行效 率比堆表高,但是索引组织表 比堆表更难维护。当向 堆表中添加数据时,O ra c le只需要简单地在表的盘区中找 到一个可用空间保存数据。而 索引组织表由于需要对数据按 照B 树结构进行组织,所 以 O racle要根据所添加数据的主 键将数据写到合适的数据块中 。这就不可避免地要从数据块 中移动已经存在的行,以提 供足够的空间存放新行。

与普通表一样,索引组织表的 修改也可以使用ALTER TABLE语句完成。但是,索 引组织表的主键约束不能被删 除、延期和禁止。 1 . 移动索引组织表 索引组织表是基于B 树索引建立的,当在该表上执 行了一系列的UPDATE操作后 , 将导致索引组织表产生空间碎 片。通过移动索引组织表,可 以删除空间碎片。例如: SQL> alter table employees 2 move tablespace example; 表已更改。

2 . 增加溢出段 建 立 索 引 表 时 , 既 可 以 指 定 O V ER FLO W 关 键 字 建 立 溢 出 段 ,也 可 以 不 指 定 OV ERFLOW 关键字。如果建立索引组织表 时没有指定O V E R F L O W ,那么建立索引组 织表之后可以使用ALTER TABLE为其添加溢出段。例如 : SQL> alter table employees add overflow tablespace users; 表已更改。

3 .修 改 溢 出 段 修改索引表时,OVERFLOW选项之前的所有选 项只适用于索引段,而 OVERFLOW 之后的选项只适用于溢出段。示例如下: SQL> alter table employees 2 overflow initrans 5;

第 9 索引与索引组织表

表已更改。

4 . 转换索引组织表为普通表 建立索引组织表后, 可以 使 用CREATE TABLE AS SELECT语句将其转变为 普通表。 示例如下: SQL> create table employees_new 2 as select * from employees; 表已创建。

篓 )实 验 指 导 1 . 索引的应用 本练习将为H R 模 式 中 的 STUDENT表创建索引,并查看索引的使用情况。 ( 1 ) 连 接 到 H R 模式,使用如下的语句 在STUDENT表 的 SNAM E列 上 创 建 B 树非 唯一索引: create index name_index on Student(Sname) tablespace users;

( 2 )在 STUDENT的班级信息列 上创建位图索引。 create bitmap index sclass_index on Student ( classic!) tablespace users;

(3 )执行如下查询语句,并 查 看 O racle的执行计划。 set autotrace traceonly select * from student where sname= , ≡ ≡

,;

( 4 )根据索引的使用情况,并删除不经常使用的索引 。 alter index name_index monitoring usage; select ♦ from v$object_usage where table name=upper(, student , );

(5 )查看索引,是否存有过 多的碎片,当被删除的叶 结点过多时,就 说 明 该 B 树索 引存在过多的碎片,这就 需要重建或合并该索引。 analyze index name_index validate structure; select br_pows,br_blks t lf_rows,del_lf_rows from index_stats where name=upper(, name_index , ); alter index name_index COALESCE DEALLOCATE UNUSED; 一 合并索弓∣ alter index name index R E B U I L D ; 一 在 原 来 的 表 空 间 重 建 索 弓 ]

221

Oracle 11g中文版数据库 管理、应用与开 发标准教程

少思考与练习 一、填空题

1 . B 树索引可以是 或者 , B 树索引可以保证索引 列上不会有重复的 值。

2 . 为表中某个列定义 PRIMARY KEY 约束 PK」D 后 ,系 统 默 认 创 建 的 索 引 名 为 。 3

. 在 B 树索引中,通过在索 引中保存排过

序的

与相对应记录的

来实

MARRIAGE 歹∣ J , 用于描述职工的婚 姻状况,则 应该在该字段上创建 什么类型的索引? ( ) A. B 树唯一索引 B. B 树不唯一索引 C . 基于函数的索引 D . 位图索引 5 . 下列关于索引的描述哪一项是不正确 的? (

4 . 如果表中某列的基 数比较低,则应该在 该列上创建 索引。

会使用索引

5 . 如果要获知索引的 使用情况,可以查询

C . 为表创建索引后,可以提高查询的执

视图;而要获知索 引的当前状态,可 以查询

行速度

视图。

D . 为表创建索引后,Oracle 优化器将根

二 、选择题

据具体情况决定是否 采用索引

1 . 查看下面的语句创建了哪一种索引? 6

222 CREATE INDEX t e s t _ i n d e x ON s t u d e n t ( s tu n o ,s n a m e ) TABLESPACE u s e r s STORAGE( INITIAL 6 4 k ,n e x t 3 2 k ); A B C D

. 全局分区索引 . 位图索引 . 复合索引 . 基于函数的索引

2 .使 用 ALTER INDEX…REBUILD 语句不 可以执行下面哪个 任务? ( ) A . 将反向键索引重建为 普通索引 B . 将一个索引移动到另 一个表空间 C . 将位图索引更改为普 通索引 D . 将一个索引分区移动 到另一个表空间 3 . 下列关于约束与索引 的说法中哪一项是 不正确的?( ) A . 在字段上定义 PRIMARY K EY 约束 时会自动创建 B 树唯一索引 B . 在 字 段 上 定 义 UNIQUE 约束时会自 动 创 建 B 树唯一索引 C . 在默认的情况下,禁用约束会删除对 应的索弓I , 而激活约束会自动重 建相 应的索引

D . 在 定 义 FOREIGN K E Y 约束时会创 建 B 树唯一索引 4 . 假 设 EMPLOYEE 表 包 含 一 个



A . 表是否具有索引不会 影响到所使用的 SQ L 的编写形式 B . 为表创建索引后,所有的查询操作都

现快速查找。

. 如果经常执行类似于 下面的查询语句:

SELECT * from s t u d e n t w here S u b s tr b ( snam e, 0 , 2 )= ' 文∣ J' 应 当为 STUDENT表 中 的 SNAME 列创建哪 一种类型的索引? ( )

A. B 树唯一索引 B . 位图索引 C. B 树不唯一索引 D . 基于函数的索引 7 . 假设在一 个表 的 3 个 字 段 NAME、SEX 和 MONTH_OF_BIRTH中分别保存姓名、性别和 出生月份的数据,则 应 当 为这 3 个字段分别创建 何种类型的索引? ( )

A . 全 部 创 建 B 树索引 B . 全部创建位图索引 C . 分 别 创 建 B 树索引、位图索引和 位 图索引

D . 分 别 创 建 B 树索引、位图索引和 基 于函数的索引

8 . 如果创建的表其主 键可以自动编号,则 应该为主键创建的 索引是哪种类型? (



A . 反向键索引 B. B 树索引 C . 位图索引 D . 基于函数的索引 9. 在 表 A 上 建 立 基 于 ( cola,colb)的复合 索引,以下哪种 SELECT 语句可以引用该索 引?



9 索引与索引组织表 种类型的索引? ( A. SELECT * FROM A WHERE cola=l and colb=4;



A. B 树索引

B . 反向索引

C . 位图索引

D . 函数索引

B. SELECT * FROM A WHERE cola=l;

三、简答题

C. SELECT * FROM A WHERE colb=4; D. SELECT * FROM A WHERE colb=4

2

. 简述位图索引的组织结构。

3

. 简述反向键索引的工作原理。

1 . 简 述 B 树索引的组织结构。

and cola=l; 1 0 .用户经常需要在E M P 表 的 S E X 列上统

4

. 简述索引组织表与普通表之间的 区别。

计不同性别的员工信息,应 该 在 S E X 列上建立哪

5

. 简述索引组织表的溢出存储。

223

第 10章 其 他 模 式 对 象 在 O racle中,除表 、索引和索引 组织表外,视 图、序列、簇 和簇表等也是 重要的模 式对象。本章 将首先介绍如 何创建分区表 ,以及基于分 区表的索引,然 后 介 绍 O racle利 用 外 部 数 据 的 一 种 方 法 一 外 部 表 ,最后对其他 一些模式对象 ,包括簇、临 时表、视图、 序列和同义词 等常用模式对 象进行简单介 绍。 本章学习要点 : > 分区表

> 创建索引簇

A

> 创建散列簇

各类型的分区

> 分区索引

> 使用视图

> 使用外部表查 询数据 > 临时表的使用

> 使用序列 > 使用同义词

> 理解什么是簇 和簇表

ιy

管理表分 区与索引 分区

在当前的企业 应用中,需要 处理的数据量 可以达到几十 到几百G B , 甚 至 T B 级 。为 了提高对这些 巨型数据库和 巨型表的读写 速度,O racle提供了一 种分区技术。用户可以 在创建表时应 用分区技术将 数据分区保存 。本 节 将 对 O racle中的分区 表,以及基于分区 表的分区索引 进行介绍。

φ-- 1 0 . 1 . 1 分 区 的 概 念 -、 分区是指将巨 型的表或索引 分割成相对较 小的、可独立 管理的部分,这些独立的部 分称为原来表 或索引的分区 。分区后的表 与未分区的表 在执行查询语 句或其他D M L 语 句时没有任何 区别,一旦进行分区 之后,还可以使用D D L 语句对每个单 独的分区进行 操 作 。因此,对巨 型表或者索引 进行分区后,能够简化对它 们的管理和维 护操作,而且分 区对于最终用 户和应用程序 是完全透明的 。 在对表进行分 区后,每一个 分区都具有相 同的逻辑属性 ,例 如 ,各个分区都 具有相 同的字段名、数据类型和约 束等。但是各 个分区的物理 属性可以不同 ,例如,各个分区 可以具有不同 的存储参数,或者位于不同 的表空间中。 如果对表进行 了分区,表中 的每一条记录 都必须明确地 属于某一个分 区。记录应当 属于哪一个分 区是由记录中 分区字段的值 决定的。分区 字段可以是表 的一个字段或 多个 字段的组合,这是在创建分 区表时确定的 。在对分区表 执行插入、删除或更新等操作时, O racle会自动根 据分区字段的 值来选择所操 作的分区。分 区 字 段 由 1〜 1 6 个字段以某种 顺序组成,但 不能包含RO W ID等伪列,也 不能包含全为 N U L L 值的字段。 图 10-1显示了一 个典型的分区 表。通常在对表进 行分区时也会 将其对应的索 引进行

其他模式对象 分区,但是未分区的表可以具有分区的索 引,而分区的表也可以具有未分区的索弓 I。 未 分 区 的 表 (分区的索弓I)

图 10-1

分 区 的 表 (分区的索弓I) 索引

ιr分区表

一个表可以被分割成任意数目的分区,但 如果表中包含有 L O N G 或 LONG R A W 类 型的字段,则不能对表分区。对于索引组 织表而言,虽然也可以分区,但是有如下 一些 限制。 □ 索引组织表仅支持范围和散列分区,不能 以列表或复合方式对其进行分区。 □ 分区字段必须是主键字段的一个子集。 □ 如果在索引组织表中使用了 OVERFLOW 子句,溢出存储段将随表的分区进行 相同的分割。 下面给出了对表进行分区时应当考虑的一 些常见情况。 □ 如果一个表的大小超过了 2 G B , 通常要对它进行分区。 □ 如果要对表进行并行 D M L 操作,则必须对它进行分区。 □ 如果为了平衡硬盘 I/O 操 作 ,需要将一个表分散存储在不同的表空间中 ,这时就 必须对表进行分区。 □ 如果需要将表的一部分置为只读,而另 一部分却是可更新的,则必须对它进行 分区。

■一 1 0 .1 .2 建立分区表 、 —_________________ ___________ √ 在 Oracle 11 g 数据库中,根据对表或索引的分区方法 可以创建 5 种类型的分区表: 范围分区、散列分区、列表分区、组合范 围散列分区和组合范围列表分区。每种分 区表 都有自己的特点,在创建分区表时,应当 根据表的应用情况选择合理的分区类型。 □ 范围分区 范围分区就是根据分区字段的取值范围进 行分区,将数据存储在不同的分区段中。 如果表的数据可以按照逻辑范围进行划分 ,并在不同范围内分布比较均衡,那么可 以使 用范围分区。例如,根据日期值进行分区 ,将不同日期的数据存储在不同的分区中 。 如 图 1 0 -2 所示,假设有一个销售表 S A L E S , 该表的数据总量达到 1 0 0 0 G B , 每个季 度 平 均 250GB 。如果使用普通表存储数据,那 么 1000G B 数据会存放到一个表段 SALES 中,那么在统计一季度销售数据时需要 扫描 1000G B 数据;如果使用分区表,则可以将 一 、二 、三 、四季度的数据分别存放到不同的分区段 中,此时统计一季度销售数据时只

225



Oracle 11g中文版数据库管理、应用与开发 标准教程

需要 扫 描 250G B 的数据。显而易见, 使用范围分区可以大大降低I/O 次数,从而提高磁 盘 I/O 性能。 普通表

图 10-2

, 分区表与普通表

例如,下面的示例建立了一个范围分 区表,将每个季度的销售数据部署到 不同的表 分区段。建立范围分区时,必 须 指 定 分 区 方 法 R A N G E ,分区列以及每个分区列值的具 体范围。示例如下: SQL> create table sales_range( 2 customer_id number(3), 3 sales_amount number(10,2)r 4 sales_date date not null 5 )partition by range(sales_date)( 6 partition part_01 values less than(to_date(, 2008-04-01 , r , yyyyπun-dd, )) tablespace spaceθl f 7 partition part_02 values less than(to_date(, 2008-07-01 , ,'yyyymm-dd')) tablespace space02, 8 partition part_03 values less than(to_date(, 2008-10-01 , , , yyyymπι-dd, ) ) tablespace space03 z 9 partition part_o4 values less than(maxvalue) tablespace space04 10 ); 表已创建。

如上所示,PARTITION BY RANGE(cokιmn)用于指定范围分区 方法以及分区列, PARTITION用于指定每个分区的名 称,如果不指定名称,则 O racle会自动对分区命名。 VALUES LESS TH A N 用于指定分布到该范围分区的数据范 围,TABLESPACE用于指定 分 区 段 所 在 的 表空 间 。执 行 上 述 语 句 后 ,不 仅 建 立 了 分 区 表 S A L E S ,而且将分区段 PART_01> PART_02、PART_03 和 PART_04 分别部署到表空间 SPACE0b SPACE02, SPACE03 和 SPACE04 中。 在 使 用 INSERT语句为范围分区表插入数据 时,必须为分区列提供数据,并且分区 列的数据必须符合相应的分区范围。当在分区表SA LES上 执 行 INSERT操作时,Oracle 会 根 据 SALES_DATE值的范围在相应分区 中插入数据。示例如下: SQL> alter session set nls_date_format= , YYYY-MM-DD , ;

其他模式对象 会话已更改 SQL> insert into sales_range v a l u e s (1,30000, , 2008-02-25 , ); 已 创 建 1 行。 SQL> insert into sales_range values (2,2850.0z , 2008-05-17 , );

已 创 建 1 行。 SQL> insert into sales_range v a l u e s (3,37000, , 2008-ll-02 , );

已 创 建 1 行。 SQL> insert into sales_range values (4,42500 r r 2008-08-15 , ); 已创建L 行 " I

执行 以 上 INSERT操作后,第一条数据会被存放到PA R T J)1分区中,第二条数据会 被 存 放 到 P A R T ∕2 分区中,第三条数据会被存放到P A R T /4 分区中,第四条数据会被 存 放 在 PART 0 3 分区中。 建立分区表后,如果要查询该分区表的所有数据,与查询普通表没有任何区别, O racle会在每个分区上执行全表扫描。示例如下: SQL> set autotrace on explain SQL> select * from sales_range;

227

建立分区表后,也可以在表名后指定分区名以显示特定分区的所有数据,O racle只 会在相应的表分区上执行全表扫描。示例如下: SQL> set autotrace on explain SQL> select * from sales partition(part_02);

在建立分区表时,O racle会为每个分区建立一个分区段,并且可以将不同的分区部 署到不同的表空间中。通过查 询 数 据 字 典 视 图 USER_SEG M EN TS,可以显示分区段及 其所在的表空间。示例如下: SQL> col tablespace_name format al5 SQL> col segment__name format al5 SQL> col partiton_name format al5 SQL> select segment_name,partition_name,tablespace__name 2

from user_segments

3

where segment_name= , SALES_RANGE';

SEGMENT NAME

PART 工T 工ON_NAME

TABLESPACE_NAME

SALES_RANGE

PART_01

SALES_RANGE

PART_02

SPACE02

SALES_RANGE

PART/3

SPACE03

SALES RANGE

PART 04

SPACE04

SPACE01

O racle认 为 N U LL值 大于一切非N U LL值 。因此,如果分区字段的值为N U L L ,则必须 在某个分区中使用 MAXVALUE关键字指定上限。

Oracle 1 1g中文版数据库管理、应用与开发标准教程 □ 散列分区 散列分区是指按照O racle提 供 的 散 列 ( HASH)函数计算列值数据,并最终按照函 数结果进行分区。在进行范围分区时,有时用户无法对各个分区中可能具有的记录数目 进行预测,这会导致某个分区中记录数目过多而其他分区中记录很少的不平衡分区情况。 在这种情况下,用户可以考虑创建散列分区表。 散列分区通过H A SH 算法将数据均匀分布到各分区,通 过 在 I/O 设备上进行散列分 区使得这些分区大小一致。创建散列分区表时,必须指定分区方法、分区列以及分区 个数。 例如,下面是一个典型的散列分区的示例,该示例将销售数据表SALES_HASH中 的数据依据CUSTOMER_ID进行散列分区。 SQL> create table sales_hash( 2

customer_id number(3),

3

sales_amount number(10r 2),

4

sales_date date not null

5

)partition by hash(customer_id)

6

partitions 4

7

store i n (spaceθlz space02,space03,space04);

228

表已创建,

在 上 面 的 CREATE TABLE语句中,通 过 PARTITION BY H A SH 子句说明对表进行 的是散列分区,然 后 使 用 PARTITIONS关键字指定分区的数目(不指定分区名称) 。如 果要将各个分区分散存储在不同的表空间中,可 以 使 用 STORE I N 子句指定一个数目与 分区数目相同的表空间列表,这时各个分区的名称由O racle自动生成。 散列分区表的分区字段可以由多个字段组成。例如,使用下面的语句为销售记录创 建另一个散列分区表SA L E SJH A SH 2,它是根据C U ST O M E R JD 和 SALES_DATE字段 进行散列分区的。 SQL> create table sales_hash2( 2 customer_id number(3)λ 3 sales_amount number(10,2)z 4 sales_date date not null 5 )partition by hash(customer_id,sales_date) 6 ( 7 partition part__01 tablespace spaceθl z 8 partition part_02 tablespace sρace02, 9 partition part_03 tablespace space03, 10 partition part_04 tablespace space04 11

);

表已创建。 ⅛

上面的语句直接为各个分区指定了名称和所存储的表空间,因此不必再使用STORE I N 子句。 在 使 用 INSERT语句为散列分区表添加数据时,必须为分区列提供数据。当在散列

其他模式对象 分区表上执行IN SERT操作时,O racle会在分区列上 使用内置散列函数 进行运算,然后 根据运算结果均匀 地分布到不同分区 段上。 查询散列分区表的 所有数据与查询普 通表没有任何区别 ,O racle会在分区表上 执行 全表扫描。如 果 在 W HERE子句中引用 分区列,则 Oracle会自动根据 内置散列函数确定 记录所在的散列分 区。 □ 列表分区 如果分区字段的值 不能划分范围(非数字或日期数据 类型),并且分区字段的取 值范 围只是一个包含少 数值的集合,则可 以对表进行列表分 区。在进行列表分 区时,需要为 每个分区指定一个 取值列表,分区字 段的取值处于同一 个取值列表中的行 被存储在同一 个分区中。 列表分区适用于那 些分区字段是一些 无序的或者无关的 取值集合的表,且分区字段 只能是一个单独的 字段。下面是一个 典型的列表分区的 示例,为销售记录 表创建一个列 表 分 区 表 SA L E S _L IS T ,它是根据销售地 点SALES_STATE 字段进行列表分区 的。 SQL> create table sales_list( 2 customer_id number(3)z 3 sales_amount number ( 1 0 Λ 2), 4 sales_state varchar2(20), 5 sales_date date not null 6 ) 7 partition by list(sales_sta te)( 8 partition sales_east values ( ' 大 连 青 岛 ’) , 9 partition sales_west values ( ' 西 安 太 原 ') 10 ); 表已创建。

在 CREATE TABLE语句中通 过PARTITION BY L IS T 子句说明对表进行 列表分区, 每个分区的定义同 样由PARTITION 关键字开头,其后 跟随可选的分区名 。 V A LU ES子 句 用 于 指 定 一 个 分 区 对 应 的 取 值 列 表 。按 照 销 售 地 点 的 位 置 将 SALES_STATE字 段的所有取值分为 2 个列表:东部和西 部。O racle会对表中每条 记录 的分区亭段进行检 查,如果分区字段 值位于某个取值列 表中,则系统会将 相应的记录存 放到相应的分区中 。 □ 组合范围散列分区 有时候根据需要范 围分区后,还需要 将每个分区内的数 据再散列地分布到 几个表空 间中,这样的分区 方法称为组合范围 散列分区。组合范 围散列分区是范围 分区的一种改 进形式,使它同时 具有范围分区和散 列分区的优势。 下面是一个典型的 组合范围散列分区 的示例,为销售记 录表创建一个组合 范围散列 分 区 表 SALES_RANGE _HASH,它首先根 据销售时间SALE S_DATE进行范围 分区,然 后 根 据 C U ST O M E R JD 字段对得到的每个 分区进行散列分区 。 SQL> create table sales_range_ha sh( 2 customer_id number(3)z 3 sales_amount number(10,2), 4 sales_state varchar2(20), 5 sales date date not null 6

229

Oracle 1 1 g 中文版数据库管理、应用与开发标准教 程 7 8 9 10 11 12 13 14 15 16 17 18

230

19 20 21 22 23 24 25 26

partition by range(sales_date) subpartition by hash(customer_id) subpartitions 3 ( partition part_01 values less than(to_date(1 2008-04-01 , , , yyyymm-dd , )) ( subpartition p_l_l tablespace sρaceθl z subpartition p_l__2 tablespace space02 z subpartition p_l__3 tablespace sρace03) f partition part_02 values less than(to_date(, 2008-07-01 , z , yyyymm-dd , )) ( subpartition p_2_l tablespace spaceθl λ subpartition p_2_2 tablespace space02, subpartition p__2__3 tablespace sρace03), partition part_03 values less than(to_date(, 2008-10-01 , , , yyyymm-dd , )) ( subpartition P_3_l tablespace spaceθl z subpartition p_3_2 tablespace space02 z subpartition p_3_3 tablespace space03), partition part_04 values less than(maxvalue) ( subpartition p _4_1 tablespace spaceθl z subpartition p__4_2 tablespace space02, subpartition p__4_3 tablespace space03) );

表已创建。

在 创 建 组 合 范 围 散 列 分 区 表 时 ,首 先 使 用 PARTITION BY R A N G E 子句根据 SALES_DATE 字段对表进行范围分区,然 后 使 用 SUBPARTITION BY H A SH 子句根据 CUSTOMER」D 字段对各个分区进行散列分区。SALES_RANGE_HASH 表 总 共 由 1 2 个 分区组成,星定义子分区时,使 用 TABLESPACE 关键季指定子分区所处的表空间。图 1 0 -3 显示了组合范围散列分区表中各个子分 区的情况。 散列分区( CUSTOMER」D )

∞ Γ V C Γ S T I V S ) 凶 会 明 博

Ω

图 10-3

一组合范围散列分区表

其他模式对象 □ 组合范围列表分区 组合范围列表分区 是对范围和列表分 区技术的组合。在 该类型的分区表中 ,首先对 表进行范围分区,然后针对每个单独 的范围分区使用列 表分区技术进一步 细分。与组合 范围散列分区不同 ,范围列表分区中 每个子分区的内容 表示数据的逻辑子 集,由适当的 范围和列表分区设 置来描述。 例如,下面的语句 首先将表SALES_ RANGE_LIST分为 两个分区,然后对 每个分区 以列表分区的形式 进行子分区。 SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

create table sales_range_list ( customer_id number(3), sales_amount number(10,2), sales_state varchar2(20), sales_date date not null ) partition by range(sales_date) subpartition by list(sales_stat e)( partition part_01 values less than(to_date(, 2008-04-01 , , 'yyyy-mm-dd , )) ( subpartition p_l_l values ( ' 西 安 太 原 ' ) tablespace spaceθl, subpartition p_l_2 v a l u e s 「青 岛 一 大 连 ' ) tablespace space02), partition part_02 values less than(to_date(, 2008-07-01 , , , yyyy-mm-dd , )) ( subpartition p_2_l values ('西 安 ','太 原 ' ) tablespace spaceθl r subpartition p_2_2 values ('青 岛 ','大 连 ' ) tablespace space02), partition part_03 values less than(to_date(, 2008-10-01 , r , yyyy-ιnm-dd, )) ( subpartition p_3_l values (, 西 安 太 原 ' ) tablespace sρaceθl z subpartition p_3_2 values ('青 岛 ','大 连 ' ) tablespace space02) z partition part_04 values less than(maxvalue) ( subpartition p_4_l values ('西 安 ','太 原 ' ) tablespace spaceθl, subpartition p_4_2 values ('青 岛 ','大 连 ' ) tablespace space02) );

表已创建。

对分区表而言,可 以像对普通表一样 使用ALTER TABLE语句进行修 改。因此,本 节主要介绍分区表 所特有的修改。 □ 为范围分区表增加 分区 如果要在范围分区 表的尾部增加新分 区,可以 使 用 ADD PARTITION选项。下面以 在范围分区表SAL ES_RANGE的尾部 增加一个新分区为 例,说明在范围分区表 的尾部增 加分区的方法。示 例如下: SQL> alter table sales_range 2 add partition part_05 values less than(to__date(, 2009-04-01 , r , yyyy-mm-dci, )); 表已更改。

231

Oracle 11g中文版数据库管理、应用与开 发标准教程

SQL> select segment_name r partition_name,tablespace_name 2 from user_segments ,; 3 where segment_name= , SALES_RANGE ~ SEGMENT_NAME

PARTITION_NAME

TABLESPACE_NAME

SALES_RANGE SALES_RANGE SALES_RANGE SALES_RANGE SALES RANGE

PART_01 PART_02 PART_03 PART_05 PART 04

SPACE01 SPACE02 SPACE03 USERS SPACE04

如果在创建分区表时,最后一个 分区的上限值为M A X V A L U E ,则无法在分区表的 尾部添加新分区,否则将返回如下 错误: SQL> alter table sales_range 2 add partition part_05 values less than(to_date(, 2009-04-01 , z , yyyy-mm-dd r ));

232

add partition part_05 values less than(to_date('2009-04-01 , , , yyyy-mm-dd , )) * 第 2 行出现错误: ORA-14074:分区界限必须调整为高于 最后一个分区界限

如果在范围分区表的顶部或中间增 加分区,可 以 使 用 SPLIT PARTITION选 项 。下面 以在范围分区表SALES_RANGE 的中间增加分区为例,说 明 使 用 SPLIT PARTITION选 项的方法。示例如下: SQL> alter table sales_range 2 split partition part_03 at (to_date(, 2008-08-15 , r , yyyy-mm-dd , )) 3 into (partition part_03_01,partition part_03_02); 表已更改。

□ 为散列分区表增加分区 如果要为散列分区表增加分区,既 可以指定分区名,也可以不指定分 区名。如果不 指定分区名,O racle会自动生成一个分区名。下 面 以 分 区 表 SALES_HASH为例,为散 列分区表增加分区。示例如下: SQL> alter table sales_hash 2 add partition part_05; 表已更改。 SQL> select segment_name,partition_name z tablespace_name 2 from user_segments 3 where segment_name= , SALES_HASH , ; SEGMENT NAME

PARTITION NAME

TABLESPACE NAME



10 章 其他模式对象

SALES_HASH SALES_HASH SALES_HASH SALES_HASH SALES HASH

PART_05 SYS_P6l SYS_P62 SYS_P63 SYS P64

USERS SPACE0l SPACE02 SPACE03 SPACE04

□ 为列表分区 表增加分区 如果要为列 表分区表增 加新分区,则必须提供 相应的离散 值。下面以 为列表分区 表 SALES L IS T 增加新分区 为例,说明 为列表分区 表增加分区 的方法。示 例如下: SQL> alter table sales_list add partition part__north 2 values (,北 京 ― 哈 尔 榛 ,); 表已更改。 SQL> select segment_name,parti tion_name tablespace_name r 2 from user_segments 3 where segment_n ame= , SALES_LIS T , ; SEGMENT_NAME

PARTITION_NAME

SALES_LIST SALES_LIST SALES_LIST

PART_NORTH SALES_EAST SALES_WEST

TABLESPACE_NAME USERS USERS USERS

□ 为组合范围 散列分区表 增加主分区 和子分区个 数 为组合范围 散列分区表 增加分区时 ,不仅需要 指定主分区 ,还应该指 定子分区的 个 数 。如果不指 定子分区的 个数,O racle会使用 表级的默认 子分区。例 如,下面的语句向 SALES_R ANGE_HA SH表增加 一个主分区 。 SQL> alter table sales_range_hash add partition p_5 2 values less than (to__date (, 2009-04-0 1 , , , yyyy-πun-dd, )); 表已更改。 SQL> select segment_n ame r partition _name tablespace_name r 2 from user_segments 3 where segment_n ame= , SALES_RAN GE_HASH , ; SEGMENT_NAME

PART工T10N_NAME

TABLESPACE_NAME

SALES_RANGE_HASH SALES_RANGE_HASH

P_l_l P_l_2

SPACE0l SPACE02

SALES_RANGE_HAS H SALES_RANGE_HASH SALES_PANGE_HASH

P_l_3 P_2_l P_2_2

SPACE03 SPACE0l SPACE02

SALES_RANGE_HASH SALES_RANGE_HASH SALES RANGE HASH

P_2_3 P_3_l P 3 2

SPACE03 SPACE0l SPACE02

233

Oracle 1 1g中文版数据库管理、应用与开发标准教程 SALES__RANGE_ HASH

P_3__3

S P A C E 03

SALES__RANGE__HASH

P_4_

S P A C E 01

SALES._RANGE__HASH

P_4__2

S P A C E 02

SALES_—RANGE._HASH

P_4__3

SPACED3

SALES__RANGE- HASH

SYS__SUBP65

USERS

SALES__RANGE_ HASH

SYS_ SUBP6β

USERS

SALES__RANGE__HASH

SYS_ SUBP67

USERS

已选择 1 5 行 。

为 组 合 范 围 散 列 分 区 表 增 加 子 分 区 时 , 需 要 在 ALTER T A B L E -M O D IFY PARTITION语句中使用ADD SUBPARTITION选项为表指定添加的子分区。例如,下面 的语句为分区P _ 5 增加一个子分区。 SQL> alter table sales_r a n g e _ h a s h m o d i f y p a r t i t i o n p_5 2

add subpartition;

表已更改。

□ 为组合范围列表分区表增加主分区和子分区 为组合范围列表分区表增加分区时,不仅需要指定主分区,还应该指定子分区。如

234

果不指定子分区,O racle会使用分区模板;如果不指定分区模板,O racle会建立一个默 认子分区。例如,下面的语句为SALES_RANGE_LIST表增加主分区。 SQL> alter table s a l e s_range_list ad d p a r t i t i o n p5 2

values less than

( t o _ d a t e ( , 2 0 0 9 - 0 4 - 0 1 , r , y y y y - m m - d d , ))(

3

subpar t i t i o n p_5_l values

4

subpar t i t i o n p_5__2 values

( ' 西 安 太 原 ' ) table s p a c e spaceθl, L 青岛 I ,大 连 ,) t ablespace s p a c e 0 2 ) ;

表已更改。

为 组 合 范 围 列 表 分 区 表 增 加 子 分 区 时 , 需 要 使 用 ALTER T A B LE-M O D IFY PARTITION语 句 的 ADD SUBPARTITION子句。例如,下面的语句为分区P 5 增加一个 子分区。 SQL> alter table sal e s _ r a n g e _ l i s t m o d i f y p a r t i t i o n p5 2

a dd subpa r t i t i o n p_5_3 values

(' 北 京 哈 尔 滨 ');

表已更改。

□ 删除分区 如果要删除范围分区表、列表分区表或组合范围列表分区表的某个分区时,可以使 用 ALTER TABLE…DROP P A R T m O N 语句。例如,下面的语句删除了 SALES_RANGE 表 的 PART_05分区。 SQL> alter table sales__range 2

drop p a r t i t i o n part_05;

表已更改。



10 其他模式对象



如果要删除组合 范围列表分区表 的子分区时,可 以 使 用 ALTER TA B LE-D R O P SUBPARTITIO N语句。例如,下面的语句删除了 SALES_RANG E_LIST表 的 P _5_3子分 区。 SQL> alter table sales_range_list drop subpartition p_5_3; 表已 更 改 〜

删除散列分区表 或者组合范围散 列分区表的分区 时,可 以 使 用 ALTER T A B L E COALESCE PARTITION语句 。例如,下面的 语句删除了散列 分区表SALES_ HASH的 一个分区。 SQL> alter table sales_hash coalesce partition; 表已更改。

删除组合范围散 列分区表的子分 区时,可 以 在 ALTER TABLE MODIFY PARTITION 语 句 中 使 用 COALESCE SUBPARTITIO N子 句 。 例 如 , 下 面 的 语 句 删 除 了 SALES_RANG E_HASH分区表 中分区PART_0 4的一个子分区。 SQL> alter table sales_range_hash modify partition part_04 2 coalesce subpartition; 表已更改。

□ 交换分区数据 使 用 ALTER TABLE-EXCH ANGE PARTITION语句 可以将表分区中 的数据交换到 普 通 表 中 ,也 可 以 将 普 通 表 中 的 数 据 交 换 到 表 分 区 中 。例 如 ,下面的语句将 分区表 SALES_RANG E的 分 区 PART_01中的数 据交换到表SALES」 中。 SQL> create table sales_l 2 as select * from sales_range; 表已创建。 SQL> alter table sales_range exchange partition part_01 2 with table sales_l; 表已更改。

□ 修改分区表名称 使 用 ALTER TABLE-RENA M E PARTΓΠON语句 可以修改分区表 中分区的名称。 例如,下面的语 句将SALES_RA NGE分区表中的 PART_01修 改 为 P l 0

SQL> alter table sales_range rename partition part_01 to p_l; 表已更改。

□ 合并分区 使 用 ALTER TABLE-M ERGE PARTITION语句 可以将多个分区 的内容合并到一 个

235

Oracle 11g中文版数据库管理、应 用与开发标准教程 分区。例如,下面的语句将 分区表SALES_RANGE中 的 PART_03_01和 PART_03_02两 个分区合并为P _ 3 分区。 SQL> alter table sales_range merge partitions part_03_01 r part_03_02 2 into partition p_3; 表已更改。

□ 重组分区 使 用 ALTER TABLE…MOVE PARTITION语句可以重组 特定分区中的所有数据。通 过该语句可以将特定分区中 的数据移到其他表空间,或删除特定分区的迁移记录 。例如, 下面的语句将SALES_RA NGE的分区P _ 1 移 动 到 U SER S表空间。 SQL> alter table sales_range move partition p_l 2 tablespace users; 表已更改。

・ - 1 0 .1 .4 分 区 索 引 和 全 局 索 引 -、 - _____ _ ____________ _ _ _ __ _ __ _ _______✓ 236

对于分区表而言,每个表分 区对应一个分区段。当在分 区表上建立索引时,既可以 建立全局索引,也可以建立 分区索引。对于全局索引,其索引数据会存放在一个索 引段 中;而对于分区索引,索引 数据被存放到几个索引分区 段中。对索引进行分区的目 的与 对表进行分区是一样的,都 是为了更加易于管理和维护 巨型对象。 在 O racle中,一共可以为分区表 建立3 种类型的索引,下面分别介 绍它们的特点和 适用情况。 □ 本地分区索引 本地分区索引为分区表的各 个分区单独地建立分区,各 个索引分区之间是相互独立 的。本地分区索引相对比较 简单,也比较容易管理。图 10-4显示了本地分区索引和 分区 表之间的对应关系。

为分区表创建本地分区索引 后,O racle会自动对表的分区和索 引的分区进行同步处 理 。为分区表添加了新的分区 后,O racle会自动为新分区建立索 引。与此相反,如果表 的分区依然存在,则用户将 不能删除它所对应的索引分 区。在删除表的分区时,系统会 自动删除它所对应的索引分 区。 例如,下面的语句为范围分 区表SALES_RANGE创建本 地分区索引。

其他模式对象 SQL> create index sales_local_idx 2 on sales_range(customer_id) local; 索引已创建。

□ 全局分区索引 全局分区索引是 对整个分区表建 立的索引,然 后 再 由 Oracle对索引进 行分区。全局 分区索引的各个 分区之间不是相 互独立的,索引 分区与分区表之 间也不是简单的 一对一 关系。图 10-5显示了全局 分区索引与分区 表的对应关系。 分区索引

分区表



图 10-5

1全 局 分区 索 引与 分 区 表

例如,下面的语 句为分区表SA LES_LIST创建全局分区索弓 SQL> 2 3 4 5 6 7

create index sales_global_part_idx on sales_list(customer_id) global partition by range (customer__id) ( partition parti values less than (300) tablespace spaced, partition ρart2 values less than(maxvalue) tablespace space02 );

索引已创建。

□ 全局非分区索引 全局非分区索引 就是对整个分区 表建立索引,但 是未对索引进行 分区。图 10-6显示 了全局非分区索 引和分区表之间 的对应关系。



图 10-6

,全 局 非 分 区 索 引 与 分 区 表

例如,下面的语 句为分区表SA LES_HASH创建全局非分区索弓I。 SQL> create index sales_global_idx 2 on sales hash(customer id);

237

Oracle 11g中文版数据库管理、应用与开发标准教程

本地分区索引通常用于决 策支持系统环境中,而全 局分区索引和全局非分区 索引通 常用于在线事务环境中。本地分区索引的管理大部 分由O racle自动完成,而全局分 区索 引的部分管理操作比较特 殊,需 要 D B A 进行更多的干预。

警 外 部 表 外部表是表结构被存储在 数据字典中而表数据被存 放在O S 文件中的表。通过使用 外部表,不仅可以在数据库中查询 O S 文件的数据,还可以使用INSERT方 式 将 O S 文件 数据装载到数据库中,从 而 实 现 SQL*Loader所提供的功 能。建立外部表后,可以查询 外部表的数据,在外部表 上执行连接查询,或者对 外部表的数据进行排序。但是,在外 部表上不能执行D M L 操作,也不能在外部表上 建立索引。

r

238

- 10.2.1

建立外部表

建 立 外 部 表 也 是 使 用 CREATE T A B L E 语 句 来 完 成 ,但 建 立 外 部表时必须指定 ORGANIZATION EXTERNAL子句。与建 立普通表不同,建立外部 表包括两部分:一部 分描述列的数据类型,另 一部分描述O S 文件数据与表列的对应关 系。 为了演示如何建立外部表 ,这里使用包含逗号分隔 符的文件“ EMPLOYEES.CSV”, 该类型的文件可以被E xcel使用。 ( 1) 为了建立外部表,O racle需要知道外部文件在 操作系统中的位置,这可 以通过 使用目录对象作为服务 器文件系统上目录的别 名来解决。创建时还需为 非特权用户或 D B A 用 户 授 予 CREATE ANY DIRECTORY系统权限。另外,为了使数据库用户 可以访 问特定目录下的O S 文件,必须将读写目录对 象的权限授予用户。 SQL>conn ∕ as sysdba 已连接。

SQL> create directory exterior_data 2 as ,d:∖orcldata∖exteriorr ; 目录已创建。

SQL> grant read,write on directory exterior_data to scott; 授权成功。

上 面 的 语 句 建 立 了 一 个 名 为 EXTERIOR_DATA的目 录,该目录指向服务器上 的 d:\orcldata\exteriorw 目录,D:\ORCLDATA\EXTERIOR 目录也是存放 EMPLOYEES.CSV 数据文件的位置。

u

( 2 ) 在指定数据文件的位置 后,就 可 以 使 用 CREATE TABLE∙∙∙ORGANIZATIO N EXTERNAL语句创建外 部表。 这里需要注意,数据文件 中的数据不会被存储到数 据库中。 创建 外 部 表 EXT_EM P的语句如下。 SQL> create table ext_emp 2 (empno number(4), 3 ename varchar2(12),

其他模式对象 4 5 6 7 8 9 10 11 12 13 14 15 16

job varchar2( 1 2 ) , mgr number(4) r hiredate date, salary number(8), comm number(8), deptno number(3)) organization external (type oracle_loader default directory exterior_data access parameters ( records delimited by newline fields terminated by ',') location(, employees.c sv , ));

表已创建。

创建外部表的 语句比创建普 通表要复杂,CREATE TABLE语句 与创建普通表 的语句 前半部分相同 。下 面 的 ORGANIZATION EXTERNAL 子句指出正在 创建的表是外 部表, 其 中 T Y PE 关键字指定访 问外部表数据 文件时所使用 的访问驱动程 序,该程序可 以将数 据从它们最初 的格式转换为 可以向服务器 提供的格式。ACCESS PARAMETE RS选项就 是用于驱动程 序访问数据文 件时进行转换 的参数设置,其中,FIELDS TERMINATED BY 选项决定了字 段之间的分隔 符。

f r - 1 0 . 2 . 2 处理外部 表错误 在将数据文件 中的数据转换 为表中列数据 时,不可避免 地会出现一些 错误。当出现 错误时,用户 就需要收集错 误信息,从中 找到导致错误 出现的原因并 加以纠正。在创建 外部表时,关 于错误处理的 子句包括:REJECT LIMIT, BADFILE和 LOGFILE子 句。 □ REJECT LIMIT 子句 如果在创建外 部表时,使用了 REJECT LIM IT子句,则将数据文件中的 数据转换为 表定义的列数 据时,数据库 允许出现特定 数量的错误。如果用户在执 行一个查询,而 O racle遇到超过 这个转换数量 的错误时,那 么查询将会失 败。 默认情况下,REJECT L IM IT子句指定的 数值为0 。可 以 使 用 REJECT L IM IT子句 设置允许出现 的错误数为U N L IM IT E D ,这样查询就 不会失败。如 果外部数据文 件中的 所有记录都由 于转换错误而 失败,那么查 询这个外部表 时将返回0 行 。 例如,下面的 示例将重新创 建外部表E X T _ E M P ,并在指定字段 分隔符时使用 分号 很显然这在转 换数据时将发 生错误。但是 ,由于其中使用了 REJECT L IM IT子句指 定错误数为无 限U N L IM IT E D ,所以可以成 功地创建外部 表。 SQL> create table ext_emp 2 ( ) 10 11 12

organization external (type oracle_loader default directory exterior data

239

Oracle 1 1g中文版数据库管理、应用与开发标准教程 13 access parameters( 14 records delimited by newline 15 fields terminated by , , ) 16 location(,employees.csv , )); 17 reject limit unlimited; 表已创建。「

虽然忽略了在创建外部表时发生的错误,但是,这意 味 着 O racle可能无法读取数据 文件中的数据。如果这时用户使用SELECT语句查询该外部表,则无法返回正常的数据。 □

BADFILE 和 NOBADFILE 子句

当读取外部表的数据文件时,数据库可能会遇到数据类型转换错误,不能够将源文 件转换成数据库中为外部表定义的列。这时可以在创建外部表时使用B A D FIL E子句, 将所有不能转换的数值写入BADFILE指定的文件中。 SQL> create table ext_emp 2 (empno number(4)z

240

9 10 11 12 13 14 15 16 17 18

deptno number(3)) organization external (type oracle_loader default directory exterior_data access parameters( records delimited by newline badfile exterior_data:1emρ.text fields terminated by , , , ) location(,employees.csv , )) reject limit unlimited;

表已创建;:

根据前面的示例,如果在外部o s 文件中有这样一条记录: 79814,ATG,MANAGER,7839, 1990-12-26,2500,0, 10

则 O racle就不能读取它,因 为 79814为 5 位数,而 EM PN O 的定义允许4 位 数 。查 询该表将返回能够成功转换的所有记录,而 不 能 转 换 的 记 录 会 被 记 录 到 B A D F IL E 文 件中。 与 BA DFILE子句相反,如果在建立外部表时使用NOBADFILE子句,O racle将会 忽略数据类型转换错误。如果用户在创建表时没有规定B A D FILE和 N O B A D F IL E ,默 认情况下,O racle将使用名称与外部表相同但扩展名为.B A D 的文件,并且该文件位于数 据文件所处的目录中。 BADFILE可以为表的所有者提供一个可供分析的文件,找到发生错误的记录,以便 D B A 调整数据或者表定义,确保源文件中的所有数据都可以由O racle读取。 □

LOGFILE

NOLOGFILE

在第一次建立表时,外部表会经常发生错误。例如,操作系统限制O racle读取文件, 或者数据文件不存在等。当发生错误时,Oracle将在日志文件中记录这些错误。LOGFILE

其他模式对 象 子句用于指 定记录错误 信息的日志 文件。如果 要忽略访问 外部数据源 时所遇到的 错误, 则可以使用 NOLOGFI LE子句,这 样 Oracle将不 会将错误信 息写入任何 日志文件。 如果在创建 外部表时没 有规定LO GFILE或 者 NOLOGFILE, O racle将会使 用默认情 况 ,建 立 一 个 LOGFILE 文件,该文 件的名称与 外部表相同 ,扩展名为 .L O G ,该文件与 数据文件位 于同一个目 录。

当在操作系 统环境中修 改了数据文 件所对应的 O S 路径后,为 了 使 O racle能够正确 标 识 O S 文件所在的 目录,则必 须改变DIR ECTORY对 象。例如,下面的语句 修改外部 表 EXT EMP 的默认 DIRECTORY 对象为 EXT NEW 0

SQL>alter table ext_emp default direct ext_new;

当在操作系统中修改了 O S 文件名后,为 了 使 O racle能够正 确标识该O S 文件,则 必须逻辑修 改外部表对 应的O S 文件。例如 ,下面的语 句修改外部 表EXT_EM P对应的 OS 文件为 EMP.CVSo SQL>alter table ext_emp location(, emp.csv r );

当数据文件 的数据格式 发生改变时 ,如 分 隔 符 由 变 为 这 就 需 要 改 变 访 问 参数设置。例如: SQL>alter table ext_emp access parameters 2 (fields terminated by , , )

驾 临 时 表 O ra c le的临时表 与其他关系 数据库中的 不同,O ra c le中 的 临 时 表 是 “静态”的,也 就是说,用 户不需要在 每次使用临 时表时重新 建立,它与 普通的数据 表一样被数 据库保 存 ,其结构从 创建开始直 到被删除期 间一直是有 效的,并且 被作为模式 对象存在于 数据 字典中。通 过这种方法 ,可以避免 每当用户需 要使用临时 表存储数据 时必须重新 创建临 时表。 临时表与其 他类型表的 不同之处是 :临时表只 有在用户向 表中添加数 据时,才会为 其分配存储 空间;而其 他类型的表 则在CREATE TABLE语 句执行之后 就分配一个 盘区。 并且为临时 表分配的空 间来自临时 表空间,这 就避免了与 永久对象争 用存储空间 。不仅 如此,临时 表中存储数 据也是以事 务或者会话 为基础的, 当用户当前 的事务结束 或会话 终止时,就 会因为释放 该临时表占 用的存储空 间而丢失数 据。尽管临 时表的数据 存储机 制与堆表的 数据存储机 制有明显的 差异,但是 用户可以像 在堆表上进 行操作一样 ,在临 时表上建立 索引、视图 和触发器等 。 由于临时表 中存储的数 据只是在当 前事务处理 或者会话进 行期间有效 ,所以创建的 临时表分为 事务级别临 时表和会话 级别临时表 。这 就 要 求 在 使 用 CREATE GLOBAL

241

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 TEMPORARY TABLE语句创建临时表时,还需要使如下子句说明创建的临时表级别。 □ 如果要创建一个事务级别的临时表,需要使用ON COMMIT DELETE R O W S子 句。事务级别的临时表在Oracle每次提交事务后,其中的记录都会被自动删除。 □ 如 果 要 创 建 一 个 会 话 级 别 的 临 时 表 ,则 需 要 使 用 ON COMMIT PRESERVE R O W S 子句。会话级别的临时表在用户连接到服务器期间,其中的记录将被一 直保存,并持续到用户断开与服务器的连接。

出 簇 与 簇 表 簇是一种用于存储数据表中数据的方法。簇实际上是一组表,由一组共享相同数据 块的多个表组成。因为这些表有公共的列并且经常一起被使用,所以将这些表组合在一 起 ,不仅降低了簇键列所占用的磁盘空间,而且可以大大降低特定SQ L 操 作 的 I/O 次数, 从而提高数据访问性能。

1 0 .4 .1 索引簇 索引簇是指使用索引定义簇键列数据的方法。如果用户需要执行连接查询显示主从

242

表的数据,则应该将主从表组织到索引簇。 1 . 普通表与索引簇 在建立普通表时,Oracle会为该表分配相应的表段。例如,当建立表D E PT和 EMP 时,O racle会分别为这两张表分配表段D E PT 和 E M P ,并且它们的数据被分别存放到这 两个表段中。 如 图 10-7所示,表 E M P 中的所有数据被存放到表段E M P 中,而 表 D E P T 中的数据 则被存放到表段D E P T 中。因为这两个表被存放在不同位置,所以在执行连接查询语句 时,至少需要扫描两个数据块才能检索到关联的数据。 deptno 10 20 30 40

C

dname ACCOUNTING RESEARCH SALES OPERATIONS

图 10-7

loc NEW YORK DALLAS CHICAGO BOSTON

empno

ename

7954 7369 7499 7521

ATG SMITH ALLEN WARD

job CLERK CLERK SALESMAN SALESMAN

deptno 10 20 30 30

,普通表存放数据的方式

使用索引簇存储表数据时,Oracle会将不同表的相关数据按照簇键值存放在簇段中。 例如,当建立索引簇E M P _D E P T ,并 将 E M P 和 D E P T 表组织到索引簇后,O racle会按 照 簇 键 DEPTNO存放相关数据,如 图 10-8所示。

10 其他模式对 象 簇键 (deptno)

dname

loc

10

ACCOUNTING

NEW YORK

20

RESEARCH

DALLAS

7954 7782 7839 7934 7369 7566 7788 7876 7902

ATG CLARK KING MILLER SMITH JONES SCOTT ADAMS FORD

DEPT- E M P ^ J

图 10-8

1索弓I簇存储数据

表 E M P和 D E P T 中的所有数 据都被存储 在簇段DEP T_EM P中。因为关联数据被存 储到同一个 数据块,所以当执行 如下的连接 查询语句检 索部门只为 1 0 的部门信息及该部 门的雇员信 息时,只需 要扫描一个 数据块就可 以检索到关 联数据。在 这种情况下 ,使用 索引簇显然 速度更快。 select t2.deptno,t2.dname,t2.loc,t l .empno,t l .ename from emp tl,dept t2 where t l .deptno=t2.deptno and tl.deptno=10;

2 . 建立索引簇 使用索引簇 时,簇键列 数据是通过 索引来定位 的。如果用 户经常使用 主从查询显 示 相关表的数 据,可以将 这些表组织 到索引簇中 ,并应将主 外键列作为 簇键列。在 自己模 式中创建索 引簇时,用 户必须具有 CREATE CLUSTER 系统权限, 以及能够包含该索引 簇的表空间 限额或具有 UNLIMITE D TABLESPA CE系统权限 。如果想在其 他模式中创 建 索引簇,则 必须具有CREATE ANY CLUSTER 系统权限。 例如,下面 的语句建立 索引簇DEP T_EM P_CLU,在这 个簇中通过 DEPTNO字段对 SCOTT.EM P和 SCOTT.DE PT两个表进 行聚簇存储 。 SQL> create cluster dept_emp_clu (deptno number(3)) 2 pctfree 20 pctused 60 3 size 500 tablespace spaceOl; 簇已创建。

如上所示,簇 键 列 为 DEPTNO, PCTFREE用 于指定在数 据块内为U PDATE操作所 预留的空间 ,PC T U SE D 则指定将数 据块标记为 可重新插入 数据时已用 空间的最低 百分 比。SIZ E 用于指定每 个簇键值相 关行数据所 占用的总计 空间,其默 认值为一个 数据块的 大小,TAB LESPACE用 于指定簇段 所在的表空 间。 在建立索引 簇时,为了 将表组织到 簇中,创建 表时必须指 定CLUSTE R子句来指定 新创建的表 所使用的簇 以及簇键列 。另外,创 建的簇表将 从所使用的 索引簇中分 配存储 空间。例如 ,下 面 以 将 DEPT_COP Y表增加到 簇DEPT_E MP_CLU为 例,说明增加主表

243

Oracle 11g中文版数据库管理、应用与开发标准教程 到簇中的方法。 SQL> create table dept_copy( deptno number(3) primary key, 2 dname varchar2(30), 3 loc varchar2 (20) 4 )cluster dept_emp_clu(deptno); 5

表已创建。

执行了以上语句之后,系统会将表DEPT_CO PY中的数据组织到簇中,并且主键列 DEPTNO会作为簇键列。下面的语句将从表EMP_COPY增 加 到 簇 DEPT_EMP_CLU中。 SQL> create table emp_copy( empno number(4) primary key, 2 ename varchar2(20)r 3 job varchar2 (10)r 4 mgr number(4), 5 hiredate date, 6 sal number(7,2), 7 comm number(7,2), 8 deptno number(3) references dept_copy) 9 cluster dept_emp_clu(deptno); 10

表已创建。

执行了上述语句后,会 将 表 EM P_COPY中的数据组织到簇中,并且外键列DEPTNO 会作为簇键列。 为了能够向簇表中添加数据,用户还必须建立簇索引。否则,系统将返回如 下错误: SQL> insert into dept_copy(deptno f dname z loc) 2 values ( 1 0 Λ 'ACCOUNTING\ ,NEW YORK* ); insert into dept_copy(deptno,dname,loc) *

第 1 行出现错误: ORA-02032: 聚簇表无法在簇索引建立之前使用

因 为 O racle会自动基于簇键列建立簇索引,所以在建 立簇索引时不需要指定列名。 示例如下: SQL> create index dept_emp_idx on cluster dept_emp_clu 2 tablespace users; 3

索引已创建。

在选择簇表时,应考虑如下两种因素。 □ 相关的表主要用于执行SELECT操 作 ,而不是执行INSERT和 UPDATE操作。 □ 经常需要在相关表之间执行连接查询。 建立索引簇时,通 过 指 定 PCTFREE和 PCTUSED选 项 ,可以控制数据块的使用空 间。如果建立簇时指定PCTFREE和 PCTUSED选项,O racle会忽略表级的相应选项设

其他模式对象 置 ,而自动 使用簇级 的相应设 置。 3 . 修改和删除簇 建立簇后 ,用户还 可以簇进 行修改。对簇可以 进行的修 改包括:修改数据块的使用 参数;扩 展簇段;释放簇段 空间;改 变 SIZ E 选项和删 除索引簇 。 建立索引 簇后,如 果数据块 的参数设 置不合适 ,则可以 使用ALTER CLUSTE R命令 改 变 PCTFRE E和 PCTUSE D选项。示例如下 : SQL> alter cluster dept_emp_clu 2 pctfree 30 pctused 40;

簇已变更。

在 使 用 SQ L*Loade r为簇表装 载数据时 ,如果簇 段空间不 足,这将 导致簇段 动态扩 展 ,从而降 低数据装 载速度。为了避免 簇的动态 分配,应 该在执行 装载操作 前手动为



段分配足 够空间。需要注意 ,散列簇 不能扩展 。示例如 下: SQL> alter cluster dept_emp_clu 2 allocate extent;

簇已变更。

在建立索 引簇时,使 用 S IZ E 选项可以 指定每个 簇键值所 占用的平 均空间。如果该 选项设置 得太小,则可能会 导致记录 迁移。如 果该选项 设置得不 合适,可 以 使 用 ALTER CLUSTE R修改其 设置。需 要注意,散 列簇的S IZ E 选项不能 修改。示例如下: SQL> alter cluster dept_emp_clu size 1024;

簇已变更。

如果索引 簇包含簇 表,那么 当删除索 引簇时,必须首先 删除其簇 表。否则将返回如 下所示错 误: SQL> drop cluster dept_em p_clu; drop cluster dept_emp _c1u *

第 1 行出现错误: ORA-009 51: 簇非空

如 果 希 望 在 删 除 簇 时 同 时 删 除 簇 表 , 可 以 在 DROP C L U S T E R 语 句 中 使 用 INCLUDING TABLES 选项,以 级联删除 簇表及簇 。

φ - 1 0 . 4 .2 散 列 簇 「 散列簇使用散列( HASH)函数定位 行的位置 。通过散 列簇,可 以将静态 表的数据 均匀地分 布到数据 块中。将 表组织到 散列簇后 ,如 果 使 用 W HER E子句中 引用簇键

列,

O racle会根 据散列函 数的结果 定位表行 数据。 合理地使 用散列簇 , 可以大大 降低磁盘

I/O,

从而提高 数据访问 性能。

245

Oracle 1 1 g 中文版数据库管理、应用与开发标 准教程 1 . 散列簇定位数据 当在普通表上建立B 树索引后,如 果 在 W HERE子句中引用索引列,O racle会自动 使用索引定位表行数据。如 图 10-9所示,假设索引层次为2 , 那么当执行查询语句时, Oracle会根据索引定位其数据行,I/O 次 数 为 4 。 将 静 态 表 组 织 到 散 列 簇 时 ,O ra c le 会 根 据 散 列 函 数 的 结 果 分 布 表 行 数 据 。 当在 W H E R E 子句中引用散列簇键列时,O racle会根据散列值确定表行位置 ,怂而直接检索 其数据值。如 图 10-10所示,假 设 在 EMPLOYEES表 中 具 有 1000行记录, ’因为员工记 录数相对固定,所以可以考虑将其 数据组织到散列簇中。如 果 将 EMPLOYEES表组织到 散列簇中,并使用散列函数M OD(EM PNO,100),那 么 157、257、3 5 7 等员工信息就会存 放到相同数据块中,当 执 行 SELECT * FROM EMPLOYEES WHERE EMPNO=567语句 时,只 需 要 一 次 I /O 操作。从这里可以看出,使用散列 簇的性能显然优于使用索引定位 数据。

246

O

图 10-9

一通 过 B 树 索 引 检 索 数 据

2 . 建立散列簇 使用散列簇时,表行数据是通过簇键列定位的。如果经常在等值查询中引用簇键列 , 可以将表组织到散列簇;如果经常 在范围查询中引用特定列,则不应 该将表组织到散列 簇 。另一方面,如果表数据是静态的 ,则可以考虑将该表组织到散列簇 :反之,如果表 数据的变化非常频繁,则使用散列 簇是不合理的。 在建立散列簇时,需要 使 用 HASH I S 定义散列函数。如果不指定HASH I S 子句, O racle会使用默认散列函数。为了 避免浪费存储空间,在建立散列簇 之前,应该规划好 簇键列相关行数据占用的平均空间 。例如: SQL> create cluster employee 一c l u (empno number(4)) 2

size 500 hashkeys 1000 hash is m o d (empno,100) 3 tablespace spaceOl;

簇已创建。

如上所示,SIZ E 子句指定每个散列簇键值的数据行 所占用的总计空间,如果未指定 该选项,O racle会自动为每个簇键值保留一 个数据块的空间。HASHKEYS用于指定散列 键值的个数,该选项是必须的。HASH I S 用于指定用户自定义的散列函数,如果未指定 该选项,O racle会自动使用系统提供的散列 函数。TABLESPACE用于指定簇 段所在的表

其他模式对象

第 10 章

空间。 建立簇表时,用 户 必 须具 有 CREATE TA BLE系统权限;如果要在 其他模式中建立 簇表,则必须具有CREATE ANY TABLE系统权限。例如,下面的语句将表EMPLOYEES 组织到散列簇。 SQL> create table employees( empno number(4) primary key, 2 ename varchar2(20)r 3 job varchar2(10)f 4 mgr number(4) 5 hiredate date, 6 sal n u m b e r 3 , 2), 7 comm number(7z 2) z 8 deptno number(3)) 9 cluster employee_clu(empno); 10 表已创建。

将静态表组织到散列簇后,如 果 在 W H E R E 子句中引用簇键列,Oracle会 使用散列簇定 数据。

3 . 建立单表散列簇 单表散列簇是指只能存放 单个表数据的散列簇。对 于普通散列簇而言,每个散列簇 可以包含共用相同簇键列 的多个表;而对于单表散 列簇而言,每个单表散列 簇只能存放 一个表的数据。 在建立单表散列簇时,必 须 指 定 SINGLE TABLE选 项 和 HASHKEYS选项。为了提 高空间利用率,还 应 该 仔细规划并指定S IZ E 选项。例如,下面的语句 建立单表散列簇 EMP_CLU= SQL> create cluster emp_clu(empno number(4)) 2 size 100 single table hashkeys 1000 3 tablespace users; 簇已创建。

建立单表散列簇后,就可 以向簇中添加簇表。例如: SQL> 2 3 4 5

create table emp_sample( empno number(4)z ename varchar2(20)z sal number(7z 2) )cluster emp_clu(empno);

表已创建。

4 .修改和删除散列簇 修改散列簇是由ALTER CLUSTER语句完成的。一般情况下,修改簇是由 簇的所有

247

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 者 完 成 的 ,如 果 要 以 其 他 用 户 身 份 修 改 簇 ,则 要 求 该 用 户 必 须 具 有 ALTER ANY C L U STE R 系统权限。但是,散 列 簇 的 SIZE、HASHKEYS和 HASH I S 等选项不能被 修改。 使 用 SQL*Loader为簇表装载数据时,如果簇段表空间 不足,将导致簇段动态扩展, 这会降低数据装载速度。为了避免簇段的动态分配 ,应该在执行装载操作前手动为簇段 分配足够空间。示例如下: SQL> alter cluster emp_clu allocate extent; 簇已变更。

如果簇段实际占用空间多于所需空间,则可以手动释放其所占用的多余空间。例如: SQL> alter cluster emp_clu deallocate unused; 簇已变更。

如果散列簇不包含簇表,则可以直接使用DROP CLUSTER语句删除散列簇。反之, 如果散列簇中包含簇表,则必须在DROP CLUSTER命令中使用INCLUDING TABLES 选项,以便级联删除簇表及散列簇。例如:

248

SQL> drop cluster emp_clu including tables; 簇已删除。

♦一

1 0 4 3 显示簇信息

)

建立索引簇或散列簇时,O racle会将簇的相关信息存放到数据字典中,通过查询数 据字典视图USER_CLUSTERS,可以显示当前用户 所有簇的信息。例如,下面的语句将 显 示 SCOTT用户所包含的所有簇。 SQL> select cluster_name,tablespace_name z key_size 2 from user_clusters; CLUSTER_NAME EMPLOYEE_CLU DEPT EMP CLU

KEY_SIZE

TABLES PACE_NAME

500 1024

SPACE01 SPACE01

在建立索引簇或散列簇时,Oracle会为其分配簇段,并将其信息存放到数据字 典中。 通过查询数据字典视图USER_SEG M EN TS,可以显示当前用户的簇段的信息。例如: SQL> select segment_name z segment_type r tablespace_name,bytes 2 from user_segments 3 where segment_name= , DEPT_EMP_CLU , ; SEGMENT_NAME DEPT EMP CLU

SEGMENT_TYPE CLUSTER

TABLES PACE_NAME SPACE01

BYTES 131072

在建立索引簇或散列簇时需指定簇键列,O racle会将簇键列的信息存放到数据字典 中。可 以通过查询数据字典视图USER_CLU_COLUM NS,显示当前用户所有簇的簇键



10 ∙t⅛∙

其他模式对象



列信息。例如,下面的语句将显示SCOTT用 户 的 DEPT_EMP_CLU簇的簇键列信息。 SQL> select clu_column_name z table_name,tab_column_name 2

from user_c1u_co1umns

3

where cluster_name= , DEPT_EMP_CLU , ;

CLU_COLUMN_NAME

TABLE_NAME

DEPTNO

TAB_COLUMN_NAME

DEPT_COPY EMP COPY

DEPTNO

DEPTNO DEPTNO

在建立散列簇时,O racle会将其散列函数信息存放到数据字典中。通过查询数据字 典 视 图 USER_CLUSTER_HASH_EXPRESSIONS, 可以显示当前用户所有散列簇的散列 函数。例如,下面的语句将显示SCOTT用户的所有散列簇和散列函数。 SQL> col hash_expression format a30 SQL> select cluster_name,hash_expression 2

from user_cluster_hash_expressions;

CLUSTER_NAME

HASH_EXPRESSION

EMPLOYEE_CLU

mod(empno,100)

249

萼 管 理 视 图 视图是一个虚拟表,它由存储的查询构成,可以将它的输出看作是一个表。视图同 真实的表一样,也包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储 数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在数据字典中存储视 图的定义信息。 视图可以建立在关系表上,也可以在其他视图上,或者同时建立在两者之上。视图 看上去非常像数据库中的表,甚至可以在视图中进行INSERT.UDAΓE和 DELETE操作。 通过视图修改数据时,实际上就是在修改基本表中的数据。与之相对应,改变基本表中 的数据也会反映到由该表组成的视图中。 ∙- -

-Y C

C

A

1 U .O . I

A∣ l 7 ∙⅛ U ΛI71 Γ‰,∣

f 日 J建 说 图

T ______ _ _______________________________×

创建视图是使用CREATE V IEW 语句完成的。为了在当前用户模式中创建视图,要 求数据库用户必须具有CREATE V IEW 系统权限;如果要在其他用户模式中创建视图, 则用户必须具有CREATE ANY V IE W 系统权限。 创建视图最基本的语法如下: create

[ or replace] view

[ (alias [z alias]...)]

as ; [with check option

[constraint constraint_name]]

[with read only]

如上所示,A L IA S 用于指定视图列的别名,SUBQUERY用于指定视图对应的子查

--------------------- Oracle 1 1 g 中文版数据库管理、应用与 开发标准教程 询语句;WITH CHECK O P T IO N 子句用于指定在视图上定 义的C H E C K 约束;WITH READ O N L Y 子句用于定义只读视图。在 创建视图时,如果不提供视 图列别名,Oracle 会自动使用子查询的列名或 列别名;如果视图子查询包 含函数或表达式,则必须定义列 别名。下面通过示列说明建 立和使用视图的方法。 1 . 简单视图 简单视图是指基于单个表建 立的,不包含任何函数、表 达式和分组数据的视图。下 面的语句建立了一个用于显 示某个部门的员工信息的视 图。 SQL> create or replace view emp_sales_view as 2 select emρno,ename,job,sal z deptno 3 from scott.emρ 4 where deptno=30; 视图已创建。

上述语句建立一个视图EM P_SALES_VIEW。因为建 立视图时没有提供列别名,所 以视图的列名分别为EMP NO、ENAME、JOB、S A L 和 DEPTNO。对于简单视图而 言, 不 仅 可 以 执 行 SELECT操作,而且还可 以执行INSERT、UPDATE, D E LETE等操作。 示例如下:

250

SQL> insert into emp_sales_view 2 values(7950,,mary , , ,CLERK',1000 r 30); 已 创 建 1 行。 SQL> update emp_sales_view 2 set sal=2000 3 where empno=7950; 已 更 新 1 行。 SQL> select * from emp_sales_view; EMPNO

ENAME

JOB

SAL

DEPTNO

7950 7499 7521 7654 7698 7844 7900 已选择7 行 。

mary ALLEN WARD MARTIN BLAKE TURNER

CLERK SALESMAN SALESMAN SALESMAN MANAGER SALESMAN CLERK

2000 1600 1250 1250 2850 1500 950

30 30 30 30 30 30 30

JAMES

SQL> delete from emp_sales_view where empno=7950; 已 删 除 1 行。

系统在执行CREATE V IEW 语句创建视图时, 只是将视图的定义信息存入 数据字典, 并不会执行其中的SELEC T语句。在对视图进行查询 时,系统才会根据视图的定 义从基 本表中获取数据。由 于 SELECT是使用最广泛、最 灵活的语句,通过它可以构 造一些复 杂的查询,从而构造一个复 杂的视图。

其他模式对象 2 . 建立视图并定义C H E C K 约束 建 立 视 图 时 可 以 指 定 WITH CHECK O P T IO N 选 项 ,该选项用于在视 图上定义 CHECK约束。在视图上定义了 CHECK约束后,如果在视图上执行 INSERT和 UPDATE 操 作 ,则 要 求 新 数 据 必 须 符 合 视 图 子 查 询 中 的 约 束 。下 面 的 语 句 重 新 定 义 视 图 EM P_SA LES_V IEW ,在该视图上定义了 CHECK约束。 SQL> create or replace view emp_sales_view as 2 select empno z ename,job f sal z deptno 3 from scott.emp 4 where deptno=30 5 with check option constraint chk_vu30; 视图已创建。

上述语句重新定义 了视图EMP_SAL ES_VIEW,并定义了 CHECK约 束 CHK VU30。 这样当基于视图E MP_SALES_VIEW 执 行 INSERT操作时,DEPTNO列的值必须设置为 30;在基于视图E MP_SALES_VIEW 执 行 UPDATE操作时,可以修改除DEPT NO列之 外的所有列。 3 . 建立只读视图 建立视图时可以指 定WITH READ ONLY选项,该选 项用于定义只读视 图。定义了 只读视图后,数 据 库用 户 只 能在该视图上执行 S E L E C T 语 句 ,而 禁 止 执 行 INSERT, UPDATE 和 DELETE 语句。 例如,下面的语句 建立了一个只读视 图EMP一RESEARCH _VIEW ,用于获得部门编 号 为 2 0 的员工信息。 SQL> create or replace view emp_research_view as 2 select * from scott.emp 3 4

where deptno=20 with read only;

视图已创建。

用户只可以在该视 图上执行SELECT 操作,而禁止任何 D M L 操作。例如: SQL> update emp_research_view 2 set sal==1000 3 where empno=7369; set sal≡1000 * 第 2 行出现错误: ORA-42399: 无 法 对 只 读 视 图 执 行 D M L 操作

. 复杂视图 复杂视图是指包含 函数、表达式或分 组数据的视图,使 用复杂视图的主要 目的是为

4

了简化查询操作。需要注意,当视图 子查询包含函数或 表达式时,必须为 其定义列别名。 复杂视图主要用于 执行查询操作,而 执 行 D M L 操作时必须符合特 定条件。 例 如 ,下面的语句建立了 一个复杂视图JOB _SAL_VIEW ,该视图用于获得每 个岗位

251

---------------------- Oracle 1 1 g 中文版数据库管理 、应用与开发标准教 程

的平均工资、工资 总和、最高工资和 最低工资。 SQL> create or replace view job_sal_view as 2 select j o b 岗位,avg(sa1) 平均工资,sum (sal) 工资总和,max (sal) 最高工 资 ,min (sal) 最低工资 3 from scott.emp 4 group by job;

视图已创建。

为了获取岗位工资 的统计信息,可以 直接查询该视图。例如: SQL> select * from job_sal_view 2 where W alter system set control_files= , d:∖app∖Administrator∖oradata∖orcl∖ control01.ctl , , 2 ,d:∖app∖Administrator∖oradata∖orcl∖control02.ctl , t 3 ,d:∖aρρ∖Administrator∖oradata∖orcl∖control03.ctl , , 4 ,e :∖oradata∖orcl∖control01b.ctl , , 5 ,e :∖oradata∖orcl∖control02b.ctl , r 6 ,e :∖oradata∖orcl∖control03b.ctl , 7 scope=sρfile; 系统已更改。 I

^

'

( 2 )关闭数据库,将已有的控制文件复制多份,修改名称后保存到不同的位置。 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 O R A C L E 例程已经关闭。 SQL> host copy d:∖app∖Adπιinistrator∖oradata∖orcl∖control01.ctl

控制文件与日志文件的管理 e :∖oradata ∖orcl ∖control01b.ctl; 已复制 1 个文件。 SQL> host copy d: ∖aρp ∖Administrator ∖oradata ∖orcl ∖control02.ctl e :∖oradata ∖orcl ∖control02b.ctl; 已复制 1 个文件。 SQL> host copy d: ∖app ∖Administrator ∖oradata ∖orcl ∖control03.ctl e: ∖oradata ∖orcl ∖control03b.ctl; 已复制 1 个文件。

( 3 ) 启动数据库。 现在可以重新连接到数据库,查 询 数 据 字 典 V$CONTROLFILE确认是否启用了控 制 文 件 CONTROL03B.CTL.,示例如下: SQL> startup O R A C L E 例程已经启动。 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers 数据库装载完毕。 数据库已经打开。 SQL> NAME

376635392 1333312 272631744 96468992 6201344

bytes bytes bytes bytes bytes

select name from v$controlfile;

D:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROLOl.CTL D:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL02.CTL D:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL03.CTL E:\ORADATA\ORCL\CONTROL01B.CTL E :∖ORADATA ∖ORCL ∖CONTROL02B.CTL E :∖ORADATA ∖ORCL ∖CONTROL03B.CTL 已选择6 行。

启用复合控制文件后,由于多个控制文件互为镜像,内容总是完全保持一致。这样 在 装 载 O racle数据库时, 系统会读取并打开CONTROL_FILES参数所对应的所有控制文 件 。需要注意,启用复合控制文件后,如果某个控制文件丢失或损坏,数据库将无法装 载 。那么在启动实例时,将产生如下错误: ORA-00205 : error in identifying controlfile, check alert log for more info

出现如上错误时,应该修改初始化参数CO NTROL_FILES,去掉损坏或丢失的控制 文件,然后重新启动数据库。

- 1 1 . 1 . 3 建立控制文件 一般情况下,如果使用了复合控制文件,并且将各个控制文件分别存储在不同的磁 盘中,则丢失全部控件文件的可能性将非常小。但是 ,如果数据库的所有控制文件全部

265

i--------------------- Oracle

1 1 g 中文版数据库管理、应 用与开发标准教程

丢失,这时唯一的补救 方法就是以手动方式重 新创建控制文件。 另外,如 果 D B A 需要改变数据库的某个 永久性参数,也需要重 新创建控制文件。 永久性参数是在创建数 据库时设置的一些参数 ,主要包括:数据库名称、MAXLOGFILES ( 最大重做日志文件数) 、MAXLOGMEMBER S (最大重做日志组成员数 )等 。 下面介绍创建新的控制 文件的命令CREATE CONTROLFILE语句的 基本用法,具体 步骤如下。 (1)查看数据库中所有的 数据文件和重做日志文 件的名称和路径。 在创建新控制文件时,首先需要了解数据库中 的数据文件和重做日志 文件。如果数 据库中所有的控制文件 和重做日志文件都已经 丢失,这时数据库已经 无法打开,因此也 就无法来查询数据字典 获得数据文件和日志文 件的信息,这时唯一的 办法就是查看警告 文件中的内容。如果数 据库可以打开,那么可 以通过执行下面的查询 来生成文件列表。 SQL> select member from v$logfile; SQL> select name from v$datafile; SQL> select name from v$controlfile;

如果既无法打开数据库 ,又无法打开可靠的文 件列表,那么就只能用 手工方法通过 查找操作系统文件来制 作文件列表。 ( 2 )关闭数据库。

266

如果数据库处于打开状 态,则可以采取正常模 式关闭数据库。 SQL> connect as sysdba SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 O R A C L E 例程已经关闭。

( 3 )在操作系统级别备份 所有的数据文件和重做 日志文件。 在 使 用 CREATE CONTROLFILE语句创 建新的控制文件时,如果操作不当可能会损 坏数据文件和日志文件 ,因此,需要事先对其 进行备份。 ( 4 )启动实例,但是不加 载数据库。 在建立控制文件时,要 求实例处于NOMOUN T状态,即不打开控制 文件。 SQL> startup nomount O R A C L E 例程已经启动。 Total System Global Area Fixed Size Variable Size Database Buffers Redo Buffers

401743872 1333480 255854360 138412032 6144000

bytes bytes bytes bytes bytes

( 5 )建立控制文件。 利用先前获得的文件列 表,执 行 CREATE CONTROLFILE命令创 建一个新的控制文 件 。需要注意,建立控制 文件要求用户必须具有 SYSDBA特 权 。示例如下: SQL> create controlfile 2 reuse database ,,orcl n

第 11 控制文件与日志文件的管 理------------- 且 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

logfile group 1 , D :∖APP∖USER∖ORADATA∖ORCL∖REDOO1.LOG , r group 2 'D :∖APP∖USER∖ORADATA∖ORCL∖RED002.LOG , , group 3 , D :∖APP∖USER∖ORADATA∖ORCL∖REDO03.LOG , datafile ,D:\APP\USER\ORADATA\OR CL\SYSTEM01.DBF , , , D:\APP\USER\ORADATA\ORCL\SYSAUX01.DBF I , D:∖ APP∖USER∖ORADATA∖ORCL∖UNDOTBS01.DBF, z ,D : ∖APP∖USER∖ORADATA∖ORCL∖USERS01.DBF , z , D :∖ APP∖USER∖ORADATA∖ORCL∖EXAMPLE01.DBF , z 'D:\ORACLEDATA\BF_TBS01.DBFl 'D :\ORACLEDATA\BIGBLICK_TBS01.DBF , z 'D:\ORACLEDATA\UNDO02 ・DBF'z 'D:\ORACLEDATA\USER_0 3 .DBF 1 z 'D :∖ORACLEDATA∖USERO4 .DBF', 'D :∖ORACLEDATA∖UNDOTBS02.DBF , maxlogfiles 50 maxlogmembers 3 maxinstances 6 maxdatafiles 200 noresetlogs noarchivelog;

控制文件已创建。

其中,DATABASE用于指 定数据库名,该名称必须 与初始化参数DB_NAM E完全 一致;NORESETLOGS选项 用于指定仍然使用原有重 做日志,如果不希望使用重做日志 , 可 以 指 定 RESETLOGS选项;LO G FILE用于指定数据库原有 重做日志的组号、大小以 及对应的日志成员;DAT AFILE用于指定数据库原有 的数据文件。 (6 ) 编辑初始化参数C O N TR O L_FILES,使其指向新建的 控制文件。 如果控制文件所在磁盘出 现损坏,那么还必须使用 ALTER SYSTEM命令改变控制 文件的存放位置。 SQL> alter system set control_files= 2 ,d:∖app∖Administrator∖oradata∖orcl∖control01.ctl , , 3 'd:∖app∖Administrator∖oradata∖orcl∖control02.ctl , z 4 ,d:∖app∖Administrator∖oradata∖orcl∖control03.ctl , 5 scope=spfile; 系统已更改。

( 7 ) 打开数据库。 如果没有执行恢复过程,就 可以以下面的方式正常打 开数据库。 SQL> alter database open;

如果在创建控制文件时使用 了 RESETLOGS语句,则可以 按下面的方式即恢复方式 打开数据库。 SQL> alter database open resetlogs;

267

Oracle 11g中文版数据库管 理、应用与开发标 准教程 现在,新的控制文 件已经创建成功,并且数据库已经使 用新创建的控制文 件打开。

♦ - - 1 1 . 1 . 4 控制文件的备 份与恢复-、 为了提高数据库的 可靠性,降低由于 丢失控制文件而造 成灾难性后果的可 能性, D B A 需要经常对控制文 件进行备份。特别是当修改了数 据库结构之后,需要立该对控制 文件进行备份。 备份控制文件是由 ALTER DATABASE BACKUP CONTROLFILE语 句完成的。有两 种备份方式:一种 是将控制文件备份 为二进制文件;另 一种是备份为脚本 文件。例 如 , 下面的语句可以将 控制文件备份为一 个二进制文件,即 复制当前的控制文 件。 SQL> alter database backup- controlfile 2 to , d:\backup_controlfile\control_08 -05-04.bkp , ; 数据库已更改。

使用下面的语句可 以将控制文件备份 为可读的文本文件 。 SQL> alter database backup controlfile to trace; 数据库已更改。

268

将控制文件以文本 形式备份时,所创 建的文件也称为跟 踪文件,该文件实 际上是一 个 S Q L 脚本文件,可以利 用它来重新创建新 的控制文件。跟踪 文件的存放位置由 参数 USER_DUMP_DEST 决定。 SQL> show parameter user_dump_dest VALUE TYPE NAME use r_dump _de st

string

d:∖aρρ∖Administrator∖diag∖rdbms∖orcl∖ orcl∖trace

创 建 了 控 制 文 件 的 备 份 后 , 即 使 发 生 磁 盘 物 理 损 坏 ,只 需 要 修 改 初 始 化 参 数 CONTROL_FILES 的值,使它指向备 份的控制文件,然 后就可以重新启动 数据库。 现在假设参数CON TROL_FILES所指 定的某个控制文件 被损坏,但是存在这个控制 文件的一个复合副 本,则可以采用下 面的方法恢复。 ( 1 ) 关闭数据库。 SQL> connect as sysdba SQL> shutdown immediate;

( 2 ) 通 过 操 作 系 统 命 令 使 用 一 个 完 好 的 镜 像 副 本 覆 盖 掉 损 坏 的 控 制 文 件 。如果 因为永久性介质故 障的原因,不 能 访 问 CONTROL_FILES 参数指定的某个控 制文件, 则 可 以 编 辑 初 始 化 参 数 C O N TR O L_FILES,用新控制 文件的位置替换原 来损坏文件的 位置。 (3 ) 重新启动数据库。 SQL> startup

控制文件与日 志文件的管理

为了防止控制 文件被损坏,应该启用复合 控制文件。但 是,多个复合 控制文件中的 任意一个被损 坏,都将导致 无法装载Ora cle数据库。这 时为了使数据 库可以正常工 作, 只需要删除损 坏的控制文件 即可。 删除损坏控制 文件的步骤如 下。 ( 1) 关 闭 数 据 库 ( shutdown)o ( 2 ) 编辑初始化参 数CONTROL _FILES,使其中 不再包含要删 除的控制文件 的名称。 (3 ) 重新启动数据 库。 该操作并不能 从磁盘中物理 地删除控制文 件,物理删除 控制文件可以 在从数据库中 删除控制文件 后,使用操作 系统命令来删 除不需要的控 制文件。

1 1 .1 .6 查 看 控 制 文 件 信 息 一 数据库中控制 文件的信息同 样也被存储在 数据字典中。表 11-1列出了各 种包含控制 文件信息的数 据字典视图和 动态性能视图 。 筑

表 11-1

269

,包含控制文件信息的数据字典视图

视图

描述

VSCONTROLFILE

包含所有控制文件的名称和状态信息 包含控制文件中各个记录文档段的信息 包 含 系 统 的 所 有 初 始 化 参 数 ,从 中 可 以 查 询 参 数 CONTROL FILES 的值

V$CONTROLFILE_RECORD_S ECTION VSPARAMETER

控制文件是一 个二进制文件 ,其中被分隔 为许多部分,分别记录各种 类型的信息。 每一类信息称 为一个记录文 档段。控制文 件的大小在创 建时即被确定 ,其中各个记 录文 档段的大小也 是固定的。例 如,在创建数 据库时通过M AXDATAFIL ES子句指定数 据库 最多具有的数 据文件,那么 在控制文件中 只会为DATA FILE记录文档 段分配相应的 存储 空间。若数据库的数据文件 超过了 MAXDATAF ILES的规定,则无法在控制 文件中保存 相应的信息。 通 过 查 询 V$CONTROL _RECORD_S ECTION视图 ,可以获取控 制文件中各个 记录 文档段的基本 信息,包括记 条文档段的余 型、文档段中 每条记录的大 小、记录文档段中 能存储的条目 数等。例如: SQL> select type,record_size,records total,records used 2 from v$controlfile_record_section; TYPE DATABASE CKPT PROGRESS REDO LOG DATAFILE FILENAME

RECORD_SIZE 316 8180 72 520 524

RECORDS_TOTAL 1 11 16 100 2298

RECORDS_USED 1 0 3 11 9

1

--------------------- Oracle 1 1 g 中文版数据库管理、应用与开 发标准教程 以 类 型 DATAFILE的记录文档段为例 ,从查询结果中可以看出,该数据库最多可以 拥 有 100个数据文件,现存已经创建了 11个数据文件。

管理重做日志文件 ---------------------------事务对数据库所做的修改将以 重做记录的形式保存在重做日 志缓存中 。 在 O racle中, 当事务提交时,由 L G W R 进程将缓存中与该事务相关的 重做记录全部写入重做日志文 件 ,此时该事务被认为成功提交 。重做日志对数据库恢复来说 是至关重要的,因此,对 日志的管理也是D B A 的日常工作的一部分。

φ--*11.2.1

重做日志简介

日志文件也称为重做日志文 件(Redo Log F i l e ) , 重做日志文件用于记载事务操 作所 引起的数据库变化。执 行 D D L 或 D M L 操作时,O racle会将事务变化的信息顺序 地写入 重做日志。当丢失或损坏数据 库中的数据时,O racle会根据重做日志文件中的 记录恢复 丢失的数据。

270

1 . 重做记录 重做日志文件由重做记录组成 ,重做记录又称为重做条目,它由一组修改向量组成。 每个修改向量都记录了数据 库中某个数据块所做的修改 。例 如 ,如果用户执行了一条 UPDATE语句对某个表中的一 条记录进行修改,同时生成一 条重做记录。这条重做记录 可能由多个变更向量组成,在 这些变更向量中记录了所有被 这条语句修改过的数据块中 的信息,被修改的数据块包括 表中存储这条记录的数据块, 以及回退段中存储的相应的 回退条目的数据块。如果由于 某种原因导致数据库丢失了 这条U PD A TE语句操作的结 果 ,则可以通过与这条UPDATE 语句对应的重做记录找到被修 改结果并复制到各个数据 块中,从而完成数据恢复。 利用重做记录,不仅能够恢复 对数据文件所做的修改操作,还能够恢复对回退段所 做的修改操作。因此,重做日 志文件不仅可以保护用户数据 ,还能够保护回退段数据。 在进行数据库恢复时,O racle会读取每个变更向量,然后将其中记录的修改信息重 新应 用到相应的数据块上。 重做记录将以循环方式在S G A 区的重做日志高速缓存中进行 缓存,并且由后台进程 LG W R写入到重做日志文件中。当 一个事务被提交时,LG W R进程将与该事务相关的所 有重做记录全部写入重做日志 文件中,同 时 生 成 一 个 “系 统 变 更 码 SCN”。系统变更码 SC N 会随重做记录一起保存到重做 日志文件中,以标识与重做记录相关的事务。只有当某 个事务所产生的重做记录全部 被写入重做日志文件后,O s c le 才会认为该事务提交成功。 2 . 写入重做日志文件 在 O racle中,用户对数据库所做的 修改首先被保存在内存中,这 样可以提高数据库 的性能,因为对内存中的数据 进行操作要比对磁盘中的数据 进行操作快得多。O racle每 隔一段时间就会启动LG W R进程将内存中的重做记录保 存到重做日志文件中。因此,即 使发生故障导致数据库崩溃,O racle也可以利用重做日志信息 来恢复丢失的数据。 当一个重做日志文件被写满后 , 每 个 Oracle数据库至少需要拥有两 个重做日志文件。 后 台 进 程 L G W R 开始写入下一个重做日志文件 ;当所有日志文件都写满后,L G W R 进

控制文件与日志 文件的管理 程再重新写入第 一个重做日志文 件。当前 正被使用的一组 重做日志文件称 为联机 重做日志文件。在 安 装 O ra c le llg 时,默 认 创 建 3 组重做日志文件 。图 11-2显示 了重做日志的循 环写入方式。

. -一 4—一1 1 2一一 2一-增 加 做 日 一— _一一 一1重 一 一 一 一 一 一志 一、 如 果 发 现 L G W R 经常处于等待状 态 ,则需要考虑添加 日志组及其成员 ,一 个 数据 库 最多可以拥有M AXLOGFILES 个日志组。增加 重做日志是使用 ALTER 图 11-2 DATABASE语句 完成的,执行该语句时 要求用户必须具 有ALTER DATABASE系统 权限。

重做日志文件的循环 写入

1 . 增加重做日志组 当管理重做日志 时,为防止后台 进程L G W R 等待写入日志组 ,D B A 必须选择合适 的 日 志 组 个 数 。要 增 加 重 做 日 志 组 ,可 以 使 用 带 ADD L O G F IL E 子 句 的 ALTER DATABASE语句 。例 如 ,下面的语句向 数据库中添加了 一个新的重做日 志组。 SQL> alter database add logfile 2 (, d:∖app∖Administrator∖oradata∖orcl∖redo04.log,, 3 ,e :∖oradata∖orcl∖redo04b.log , ) 4 size 10m; 数据库已更改。

新增的重做日志 组具有两个成员 ,每个 成员 文 件 的大 小 均 为10MBo 一般情况下, 日志文件的大小 在10M B到 50M B之间,O racle默认的日志 文件大小为50M B。 如 果 在 ALTER DATABASE ADD LOGFILE语 句 指 定 GR OU P子句,Oracle将自动 为新建的重做日 志组设置编号,例如,下面的语 句可以在创建日 志组时指定为第 4 组 。 SQL> alter database add logfile group 4 2 (, d:∖app∖Administrator∖oradata∖orcl∖redo04.log', 3 , e :∖oradata∖orcl∖redo04b.log 1 ) 4 size 10m; 数据库已更改。

使用组号可以更 加方便地管理重 做日志组,但 是 ,对日志组的编 号必须为连续的 , 不能跳跃式地指 定日志组编号。也 就是说,不要将 组号编为10, 20, 3 0 等这样不连续的 数 。否将会耗费数 据库控制文件的 空间。 如果要创建一个 非复合的重做日 志文件,则可以 使用如下语句: alter database add logfile 'd:∖aρp∖Administrator∖oradata∖orcl∖redo01 .log* reuse;

如果要创建的日 志文件已经存在 ,则必须在ALTER DTABASE语句中 使用REUSE 子句,覆盖已有 的操作系统文件 。在使用了 R E U SE的情况下,不 能再使用S IZ E 子句设

271

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程

置重做日志文件的大小,重做日志文件的大小将由已存在日志文件的大小决定。 2 . 创建日志成员文件

建立日志组时,至少要为日志组指定一个日志成员。为了防止日志成员损坏而导致 日志组无法使用,O racle 建议每个日志组至少包含两个或两个以上的日志成员。如果日 志组只有一个日志成员,并且该日志成员出现损坏,那么当后台进程 LGW R 切换到该日 志组时,Oracle 会停止工作,并对该数据库执行不完全恢复。 为重做日志组添加新的成员时,只需要使用带 ADD LOG M EM BER 子 句 的 ALTER DATABASE 语句即可。 例如, 下面示例为第 1 组重做日志文件添加了一个新的成员日志文件。 SQL> alter database add logfile member 2 ,e :∖oradata∖orcl∖redo01b.log , to group 1; 数据库已更改。

此外,也可以通过指定重做日志组中其他成员的名称,以确定要添加的成员所属的 重做日志组。例如,下面的语句为第 2 组添加一个新成员。 SQL> alter database add logfile member 2 te :∖oradata∖orcl∖redo02b.log , to 3 (, d:∖aρp∖Administrator∖oradata∖orcl∖redo02.log , );

272

数据库已更改。

为日志组添加新的成员时,必须指定文件名,但是不可以指定大小,新成员的大小是由 组中其他成员的大小决定。

φ-- 11.2.3 当日志成员出现损坏或丢失时,后台进程 LGW R 不能将事务变化写入到该日志成员 中,在这种情况下应该删除该日志成员;当日志组大小不合适时,需要重新建立日志组, 并删除原有的日志组。删除重做日志是使用 ALTER DATABASE 语句来完成的,执行该 语句要求数据库用户必须具有 ALTER DATABASE 系统权限。 1 . 删除日志成员

要删除一个成员日志文件,需要使用带 DROP LOGFILE M EM BER 子 句 的 ALTER DA1ABASE 语 句 。例如,下面的语句将删除 4 号日志组的第 2 个成员。 SQL> alter database drop logfile member 2 ,e :∖oradata∖orcl∖redo04b.log , ; 数据库已更改。

上面的语句只是在数据字典和控制文件中将重做日志成员的信息删除,要在操作系 统中物理地删除相应的文件,需要确认删除成功后手工在操作系统中删除文件。 2 . 删除日志组

由于已经存在的日志组的大小不能改变,所以当日志组大小不合适时,就需要重新 建立日志组并指定合适大小,然后删除不符合大小要求的日志组。在删除一个日志组时,

控制文件与日志文 件的管理 其中的成员文件也 将全部被删除。在 删除日志组时,首 先需要考虑如下几 点。 □ 无论日志组中有多 少个成员,一个数 据库至少需要两个 日志组。 □ 只能删除处于INA CTIVE状态的日志 组。如果 要 删 除CURRENT状态的重做日 志组,则必须将它 切换到INACTIV E状态。 □ 如果数据库处于归 档模式下,则在删 除重做日志组之前 必须确定它已经被 归档。 因此,在删除重做 日志组之前,可 以 查 询 V $L O G 动态性能视图来获 知各个重做日 志组的状态以及它 是否已经归档。例 如: SQL> select group#,archived,status from v$log; GROUP#

ARC

STATUS

1 2 3 4

NO NO NO YES

CURRENT INACTIVE INACTIVE UNUSED

要删除一个重做日 志组,需要使用带有DR OP LOGFILE子 句 的 ALTER DATABASE 语句。例如,下面 的语句可以删除4 号重做日志组。 SQL> alter database drop logfile group 4;

同样,该语句只是 在数据字典和控制 文件中将重做日志 组的记录信息删除 ,要物理 地删除操作系统中 相应的文件,需要 手工在操作系统中 将相应的文件删除 。 3 . 清空重做日志组 清空重做日志文件 就是将重做日志文 件中的内容全部初 始化,这相当于删 除该重做 日志文件,然后再 重新建立它。即使 数据库只拥有两个 重做日志组,或者 要清空的重做 日志组正处于CU RRENT状态,也 都可以成功执行清 空操作。 要 清 空 一 个 重 做 日 志 组 , 需 要 使 用 带 有 CLEAR L O G F IL E 子 句 的 ALTER DATABASE语句 。例如,下面的语 句将清空3 号重做日志组。 SQL> alter database clear logfile group 3; 数据库已更改。

如果要 清空 的 重 做 日志 组 尚 未归 档 ,则 必 须 在 ALTER DATABASE语句 中指定 UNARCHIVED子 句,例如: SQL> alter database clear unarchived logfile group 3; 数据库已更改。

如果被清空的重做日 志组没有被归档,则 有可能造成数据丢失 。

在所有后台进程中 ,LGW R进程活动最为频 繁,它需要不断地 将事务变化由重做 日 志缓冲区写入重做 日志中。在数据库 文件、控制文件和 重做日志这3 种文件中,重做日

273

--------------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 志 的 I/O 操作最频繁。为了提高I/O 性能,应将重做日志分布到1/。操作相对较少、速度 较快的磁盘设备上。规划重做日志时,应将同一个日志组的不同日志成员尽可能地分布 到不同磁盘上,以防止磁盘损坏而导致所有日志成员丢失。例如,假设在初始阶段, 日 志 组 2 中的日志成员被放在同一块磁盘上,但是后来出于安全和性能方法的考虑,DBA 为服务器新增加了一块磁盘,并且将日志组2 中的一个日志成员移动到新磁盘上,此时 就需要改变该日志成员的存放位置。 修改重做日志文件的名称和位置的具体操作步骤如下。 ( 1 ) 关闭数据库。 SQL> connect ∕as sysdba SQL> shutdown

( 2 ) 复制或移动日志成员到目标位置。关闭数据库后,D B A 就可以使用操作系统命 令复制或移动日志成员到新位置。例如,修改原日志文件的名称。 ( 3 ) 重新启动数据库实例,加载数据库,但是不打开数据库。 SQL> startup mount;

( 4 ) 使 用 带 RENAME FIL E 子 句 的 ALTER DATABASE语句重新设置重做日志文件 的路径和名称。

274

SQL> 2 3 4 5 6 7 8

alter database rename file ,d:∖app∖Administrator ∖oradata ∖orcl ∖redo03.log ,, 1d:∖apρ ∖Administrator ∖oradata ∖orcl ∖redo02.log,, , d: ∖ aρρ ∖Administrator ∖oradata ∖orcl ∖redoO1 .log , to ,d:∖app ∖Administrator ∖oradata ∖orcl ∖redoO3a.log , r , d: ∖ aρp ∖Administrator ∖oradata ∖orcl ∖redo02a.log' r , d: ∖ aρp ∖Administrator ∖oradata ∖orcl ∖redoOla.log);

数据库已更改。

( 5 ) 打开数据库。 SQL> alter database open;

(6 ) 备份控制文件。 重 新 启 动 数 据 库 后 ,对 联 机 重 做 日 志 文 件 的 修 改 将 生 效 。通 过 查 询 数 据 字 典 VSLOGFILE可以获知数据库现在所使用的重做日志文件。

φ-.-一 '— 1—1—.l2f.5 做 日 -■ »> 显 示 重一 >>■ »■ >_ 志 信 息一” - 1

j

i

l

l

— —> —

≡ > ≡ ∙ j- > i1 0

对 于 D B A 而言,可能经常要查询重做日志文件,以了解其使用情况。要 了 解 Oracle 数据库的日志文件信息,可以查询如表11・ 2 所示的数据字典视图和动态性能视图。 翳 : 表 11-2

-包含重做日志文件信息的视图

视图

说明

VSLOG

包含从控制文件中获取的所有重做日志文件的基本信息

VSLOGFILE

包含各个成员日志文件的信息,例如成员的状态和所属的重做日志组

V$LOG HISTROY

包含重做日志文件的历史信息

控制文件与 日志文件的 管理 下面列出了 V $L O G 的结构信息 。 SQL> desc v$log 名称

是否为空?

GROUP#

类型 NUMBER

THREAD#

NUMBER

SEQUENCE#

NUMBER

BYTES

NUMBER

MEMBERS

NUMBER

ARCHIVED STATUS

VARCHAR2(3) VARCHAR2(16)

FIRST_CHANGE#

NUMBER

FIRST_TIME

DATE

其中,GROUP#字 段显示的是 重做日志文 件组的编号 ,THREAD#显示的是重做日 志 组所属的日 志写入线程 ,SEQUENC E#字段显示 的是重做日 志组的日志 序列号,BYTES 字段显示重 做日志组中 各个成员的 大小,M EMBERS字 段显示的是 重做日志组 中的成员 数 ,ARCHIVE D字段显示的 是重做日志 的归档情况 ,STATUS字 段显示重做 日志组的状 态 (CURRENT 表示当前正 在使用,NA CTIV E表示非活动 组,ACTIVE 表示归档未 完成), FIRST_CHA NGE#字 段 显 示 的 是 重 做 日 志 组 上 一 次 写 入 时 的 系 统 改 变 号 SCN , FIRST_TIM E字段显示的 是重做日志 组上一次写 入的时间。

密管理归档日志 归档日志是 非活动重做 日志的备份 。通过使用 归档日志,可以保留所 有重做历史 记 录 。当数据库 处于ARCH IVELOG模式 并进行日志 切换时,后 台 进 程 A R C H 会将重做日 志的内容保 存到归档日 志中。当数 据库出现介 质故障时,使用数据文 件的备份、归档日 志和重做日 志可以完成 数据库的完 全恢复。

・一 1 1 3 1 日 志 操 作 模 式 ] 日志操作模 式是指Orac le数据库处理 重做日志的 方式, 它决定了是 否保存重做 日志, 以保留重做 日志所记载 的事务变化 。Oracle数据 库包括非归 档日志(NO ARCHIVEL OG) 模 式 和 归 档 日 志 (A R C H IV ELO G )模式。 1. NOARCHIV ELOG (非归档模式) NOARCHIV ELOG是指不 保留重做记 录的日志操 作模式,只 能用于保护 实例故障, 而不能保护 介质故障。当 数据库处于 NOARCHIV ELOG模式时 ,如果进行日 志切换,生 成的新内容 将直接覆盖 日志原来的 内容。 NOARCHIV ELOG模式具 有如下一些 特点。 □ 当检查点完 成之后,后 台 进 程 LG W R可以覆盖原 来的重做日 志内容。 □ 如果数据库 备份后的重 做日志内容 已经被覆盖 ,那么当出现 数据文件损 坏时只

275

Oracle 11g中文版数据库管理、应用 与开发标准教程 能恢复到过去的完全备份点 。 2. ARCHIVELOG (归档模式) O racle利用重做日志文件记录 对数据库所做的修改,但是重 做日志文件是以循环方 式使用的,在发生日志切换 时,原来重做日志中的重做 记录会被覆盖。为了完整地记 录 数据库的全部修改过程,可 以 使 Oracle数据库的日志操作模 式处于归档模式。 当数据库的运行在归档模式 时具有如下优势。 □ 如果发生磁盘介质损坏,则 可以使用数据库备份与归档 重做日志恢复已经提交 的事务,保证不会发生任何数 据丢失。 □ 利用归档日志文件,可以实 现使用数据库打开状态下创 建的备份文件来进行数 据库恢复。 □ 如果为当前数据库建立一个 备份数据库,通过持续地为 备份数据库应用归档重 做日志,可以保证源数据库 与备份数据库的一致性。 在归档模式下,归档操作可 以由后台进程A R C n 自动完成,也 可 以 由 D B A 手工来 完成。为了提高效率、简化操 作,通常使用自动归档操作。图 11-3显示了利用归档进程 ARCO进行自动归档操作的过 程。

276

归档重 做日志

联机重 做日志

是否将数据库的日志操作置为 归档模式取决于对数据库应 用环境的可靠性和可用性 的要求。如果任何由于磁盘物 理损坏而造成的数据丢失都 是不允许的,那么应该让数据 库运行在归档模式下。这样 ,在发生磁盘介质故障后,D B A 就能够使用归档重做日志文 件和数据文件的备份来恢复 丢失的数据。

t - - 1 1 .3 .2 控 制 归 档 : 在 安 装 Oracle 11g时,默认为数据库运行在 非归档模式下,这样可以避免 在创建数 据库的过程中对生成的重做 日志进行归档。当数据库开 始正常运行后,就可以将它切 换 到 归 档 模 式 。要 将 数 据 库 在 归 档 模 式 与 非 归 档 式 之 间 进 行 切 换 ,需要使用带

控制文件与 日志文件的 管理 ARCHIVEL OG 或 NOARCHIV ELOG 子句的 ALTER DATABAS 语句。 1 . 改变日志操作模式 从 Oracle 10g开始,改 变日志操作 模式已经变 得很简单,很容易管理 。在 Oracle 11g 中 , 默 认 情 况 下 , 归 档 日 志 会 存 放 到 快 速 恢 复 区 所 对 应 的 目 录 (由 初 始 化 参 数 DB_RECOV ERY_FILE_ DEST设定)中,并且会 按照特定的 格式生成归 档日志文件 名。 当想要将归 档日志放在 默认的路径 下时,只 需 执 行 ALTER DATABASE ARCHIVELOG 即可。 改变日志操 作模式时,必 须 以 SYSDBA和 SYSOPER身 份执行相应 操作。将数据库 由非归档模 式切换为归 档模式的具 体操作步骤 如下。 (1)检查当前 日志操作模 式。 在改变日志 操作模式之 前,D B A 应首先检查 当前日志操 作模式。通过查询动 态性能 视 图 V $D A TA BA SE,可以确定 当前日志操 作模式。示 例如下: SQL> select log_mode from v$database; LOG_MODE NOARCHIVELOG

( 2 )关闭数据 库,然后装 载数据库。 改变日志操 作模式只能 在M OUNT状态 下进行,因 此必须先关 闭数据库,然后重新 装 载 数 据 库 。需 要 注 意 ,如 果 要 改 变 日 志 操 作 模 式 ,那么在关 闭数据库时 不能使用 SHUTDOW N ABORT命令 。示例如下 : SQL> shutdown immediate; SQL>startup mount

(3 )改变日志 操作模式,然后打开数 据库。 将数据库转 变为M OUNT状态 后,就可以 使用ALTER DATABASE 语句将数据 库切 换到归档模 式了。改变 日志操作模 式后,打开 数据库。示 例如下: SQL> alter database archivelog; 数据库已更改 。 SQL> alter database open; 数据库已更改 。

可以使用如 下语句查看 数据库是否 已经处于归 档模式。 SQL> archive log list; 数据库日志模 式

存档模式

自动存档

启用

存档终点

USE_DB_RECOVERY_FILE_DEST

最早的联机日 志序列

68

下一个存档日 志序列

71

当前日志序列

71

从这里可以 看出,数据 库是否已经 被置于归档 模式下,是否启用了自动归档功能,

277

--------------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 以及归档的重做日志等信息。 2 . 配置归档进程 为 避 免 LG W R进程出现等待状态,可以考虑启动多个A R C n进程。修改初始化参数 LOG_ARCHIVE_MAX_PROCESSES可以调整启动A R C n进程的数量。当将数据库转变 为 ARCHIVELOG模式时,默认情况下O racle会自动启动两个归档进程。通过改变初始 化 参 数 LOG_ARCHIVE_MAX_PROCESSES的值,D B A 可以动态地增加或减少归档进 程的个数。例如: SQL> alter system set log_archive_max_processes=5; 系统已更改。

数据 库 处 于 ARCHIVELOG模式时,如果进行日志切换,后台进程将自动生成归档 日志。归档日志的默认位置为%ORACLE HOEM%∖ R D B M S ,在 Oracle 1 1 g 中,归档日 志的默认文件名格式为ARC%S%_%R%T。为了改变归档日志的位置和名称格式,必须 改变相应的初始化参数。

278

初始化参数LOG_ARCHIVE_FORMAT用于指定归档日志的文件名称格式,设置该 初始化参数时,可以指定以下匹配符。 s 日志序列号。



%



% S 日志序列号,但带有前导0。



%

t 重做线程号。

α

% T 重做线程号,但带有前导0 。



% a 活 动 I D 号。



% d 数 据 库 I D 号。

□ % r RESETLOGS 的 ID 值 。 需要注意,在 Oracle 11g中,配置归档日志文件格式时,必须带有%s、%t 和%r 匹 配符,其他匹配符可有可无。配置了归档文件格式后,必须重新启动数据库。例如: SQL> alter system set log_archive_format= , %s_%t_%r.arc , 2

scope=sρfile;

系统已更改。 SQL> shutdown immediate; SQL> startup

修改初始化参数LOG_ARCHIVE_FORMAT并重启数据库后,初始化参数配置将会 生效。进行日志切换时,会生成该格装的归档日志文件。

归档日志文件保存的位置称为归档目标,归档目标在初始化参数中进行设置。DBA 可以为数据库设置多个归档目标,不同的归档目标最好位于不同的磁盘中,以分布归档



*

控制文件与 日志文件的 管理--------------时磁盘的I/ O 操作。 通过设置初 始化参数L OG_ARCH IVE_DEST _n,可以为数 据库指定1 到 1 0 个归档 目标( n 为 1 至!] 1 0 的整数)。在进行归 档时,O racle会将重 做日志组以 相同的方式 归档 到每一个归 档目标中。利 用 LOG_ARC HIVE_DES T_n参数可以 指定本地系 统为归档目 标 ,也可以指 定远程的数 据库为归档 目标。 如果在设置 LOG_ARC HIVE_DES T_n参数时使用了 LOCATION 关键字,则指定的 归档目标为 一个本地五 统的目录。例如: SQL> alter system set 2 log_archiv e_dest_l= , location=d:∖oracledata ∖archivel , ; 系统已更改。 SQL> alter system set 2 1og_a rchive_des t_2= , location=d:∖oracledata ∖archive2 , ; 系统已更改。

SQL> alter system set 2

log__archive__dest_3=, location==dι ∖oracledata∖archive3 ';

如果在设置 LOG_ARC HIVE_DES T_n参数时使用了 SERVICE关 键字,指定的归档 目标则是一 个远程数据 库。例如: SQL>alter system set log_archiv e_dest_2= , service=D BYl ,

其中,D B Y 1是一个远程 备用数据库 的服务器名 。 使用初始化 参数LOG_ ARCHIVE_ DEST_n配置 归档位置时 ,可以在归档 位置上指定 OPTIONAL 或 MANDATO RY选项。指 定 MANDATO RY选项时,可以 设 置 REOPEN属 性 ,分别介绍 如下。 □ OPTIONAL

该选项是默 认选项,使 用该选项时 ,无论归档 是否成功,都可以 覆盖重做日 志。

□ MANDATORY

该选项用于 强制归档。使用该选项 时,只有在 归档成功后 ,重 做日志才能 被覆盖。

□ REOPEN

该属性用于 指定重新归 档的时间间 隔,默 认 值 为 3 0 0 秒。需要注 意,

REOPEN属 性必须跟在 MANDATO RY选项后。 为了强制归 档到特定位 置,必 须 指 定 MANDATO RY选项。下 面以强制归 档到特定 目录为例,说 明 MANDATO RY和 OPTIONAL 选项使用方 法。 SQL> alter system set 2 log_archiv e_dest_l= , location=d:∖oracledata∖archivel mandatory *; 系统已更发。 SQL> alter system set 2 log_archiv e_dest_2= , location=d:∖oracledata∖archive2 mandatory reopen≈50 0 , ; 系统已更改。

279

Oracle 1 1g中文版数据库管理、应用与开发标准教程 SQL> alter system set 2 log archive dest 3= , location=d:∖oracledata∖archive3 optional , ; 一 ― 系统已更浅。

使用初始化参数LOG_ARCHIVE_DEST_n配 置归档位置时,D B A 可以使用初始化 参 数 LOG_ARCH1VE_MIN_SUCCEED_DEST控制 本地归档的最小成功个数。示例如下: SQL> alter system set 2 log_archive_min_succeed_dest=2; 系统已更浅。

执行上述语句后,如果生成的归档日志少于两 份,重做日志将不能被覆盖。 另夕卜,D B A 可以使用初始化参数LOG_ARCHIVE_DEST_STATE_n控制归档位置的 可用性。设置该参数为E N A B L E ,表示会激活相应的归档位置;设置该参数为 DEFER, 表示会禁用相应的归档位置。当归档日志的所 在的磁盘损坏或填满时,D B A 需要暂时禁 用该归档位置。例如: SQL> alter system set 2 log_archive_dest_state_3=defer; 系统已更派。

280

执行以上语句后,会禁用初始化参数LOG_A RCHIVE_DEST_STATE_3所对应的归 档位置。为了重新启用该归档位置,可以执行 以下语句: SQL> alter system set 2 log_archive_dest_state_3=enable; 系统已更改。

从 Oracle 10g开始不再 使 用 LOG_ARCHIVE_DEST参数,若设置该参数后重启实 例,则 系统会提示使用了过时的参数这一错误提示。另外,不能同时使用LOG_ARCHIVE_DEST和 LOG_ARCHIVE DEST N 两 种 参 数 ,在 设 置 LOG_ARCHVIE_DEST_N 之 前 必 须 先 清 除 LOG ARCHIVE DEST 参数。

1 1 .3 .5 显示归档日志信息『 查询关于归档的信息有两种方法:一种是使用 数据字典和动态性能视图;另一种是 使用 ARCHIVE LOG LIST 命令。在 SQL*Plus 中执行 ARCHIVE LOG LIST 命令,将显 示当前数据库的归档信息。例如: SQL> connect /as sysdba 已连接。 SQL> archive log list; 数据库日志模式

存档模式

自动存档

启用

存档终点

d:\oracledata\archive3

最早的联机日志序列

68

第 11

控制文件与日志 文件的管理 下一个存档日志序列

71

当前日志序列

71



执行上述命令可 以得知以下信息 。 □ 数据库处于归档 模式。 □ 自动归档功能被启 用。 □ 归档目标为本地 目录D:\ORACLE DATA\ARCHIVE3。 □ 已经归档的最早 的重做日志序号 为68。 □ 当前正在归档的 重做日志序列号 为71。 表 11-3列出了各种 包含归档信息的 数据字典视图和 动态性能视图。 雪

表 11-3

, 包包含归档信息的视 图

视图

描述

VSDATABASE

用于查询数据库是否 处于归档模式

V$ARCHIVED_LO G

包含控制文件中所有 已经归档的日志信息

V$ARCHIVED_DE ST

包含所有归档目标信 息

V$ARCHIVE_PROCESSES

包含已启动的A RC n进程状态信息

V$BACKUP_REDO LOG

包含所有已经备份的 归档日志信息

V$LOG

包含所有重做日志组 的信息,还可以查看 日志组是否需要归档

g

281

查看日志信息

在重做日志文件 中记录了数据库 中曾经过发生过 的操作,对重做 日志进行归档后 , 所有已经执行的 操作都将被记录 在案。D B A 可以利用这些归 档日志将数据库 恢复到任意 时刻的状态,还 可以利用一些工 具对日志进行分 析,以便对数据 库操作进行跟踪和 统计 分析。本节将介 绍如何利用LogM iner工具对归档日 志进行基本的分 析。

φ-- 11.4.1

LogMiner 概述 I

使 用 LogM iner工具可以对重 做日志文件或归 档重做日志文件 进行分析,以 便 DBA 对数据库用户的 操作进行审计,或者撤销数据库 中已经执行过的 、指定的操作。此外, D B A 还能够通过分析 日志文件来追踪 某个用户的所有 操作,或者追踪某个数据 库对象的 变更过程,并由 此生成统计信息 。 LogMiner工具由 一系列内置DBM S包和动态视图组 成。 在 使 用 LogM iner的过程中, 主要用到以下两 个D B M S包 。 □ DBMS_LOGMNR_D

在这个包中包含 提取数据字典信 息和创建L ogM iner字 典文件所必需的 过程,即 DBMS_LOGMN R_D.BUILD()过程 。

□ D B M S _ L O G M N R 在这个包中包含 有初始化和运行 LogM iner所必需的过程 。 它 有 3 个过程:用来添 加/删除用于分析 的日志文件的过 程ADD_LOGFILE(); 用来开启日志分 析,同时确定分析的时间/S C N 号以及确认是否使 用提取出来的 数 据 字典信息的过程 START_LOGM NR();用来终止分 析会话、回 收 LogMiner 所占用内存的过 程END LOGMNR()a

Oracle 11g中文版数据库管理、应用 与开发标准教程 D B M S 包 是 随 O racle服务器软件一同提供的 另一种类型的实用工具。在 D B M S包 中 包 含 了 许 多 P L /S Q L 过程,利用这些过程能够完 成许多数据库操作。组 成 LogMiner 的包均位于SY S模式中。 与 LogM iner相关的数据字典包括以下 几种。 □ vSlogmnr dictionary 包 含 LogM iner可能使用的数据字典信息 ,因 logmnr ^≡Γ 以有多个字典文件,该视图用 于显示这方面的信息。 □ □

v$logmnr_parameters

当前LogM iner所设定的参数信息。

vSlogmnr l o g s 当前用于分析的日志列表。

日志分析结果。 在 Oracle 11 g 中,还需要安装LogM iner工具。在数据库安装目录 下的rdbms∖ admin 子目录中,可以找到两个SQ L 脚本文件:DBMSLM.SQL和 DBMSLMD.SQL。这两个脚 □

v$logmnr_contents

本必 须 均 以 SY S用户身份运行。其中第一个脚本文件用来创 建DBMS_LOGMNR包 ,该 包用来分析日志文件。第二个脚本文件用来创建DB MS_LOGMNR_D包 ,该包用来创建 数据字典文件。下面是运行 脚本文件安装LogM iner的过程。 SQL> θ D:∖app∖Administrator∖product∖ll.1-.O\db_l\RDBMS\ADMIN\dbmslmd. sql;

282

程序包已创建。 同义词已创建。 SQL> @ D:\app\Administrator\pro duct\ll.1.0∖db_l∖RDBMS∖ADMIN∖dbmslm.sql;

程序包已创建。 授权成功。 同义词已创建。

利 用 LogM iner分析日志组文件的操作主 要包括以下几步。 ( 1 ) 解读数据字典,创 建 LogMiner字典文件。 (2 ) 指定用于分析的重做日志文 件。 ( 3 ) 启动 LogMiner。 ( 4 ) 生成分析结果视图。 ( 5 ) 结束 LogMiner。

1 1 .4 .2 创 建 LogMiner使 用 的字典文件) LogM iner只有在实例启动的情况下 才可以运行。在 使 用 LogM iner工具分析重做日 志文件之前,可以使 用DBMS_LOGMNR_D包将 数据字典导出为一个文本文 件。该字典 文件是可选的,LogM iner使用这个字典文件来实现 O racle内部对象名称的转换,如果没 有这个字典文件,则直接显 示内部对象编号,这部分内容 是无法直接理解的。 创建字典文件的目的就是让 L ogM iner引用所涉及到的内部数据 字典,提供它们实 际的名字,而不是系统内部的 对象编号。数据字典文件是一 个文本文件,用于存放表及 对 象 I D 号之间的对应关系。使用字典 文件时,它会在表名和对象 I D 号之间建立— — 对 应的关系。如果要分析的数 据库中的表有变化,则数据库 的数据字典也会发生变化,这 时就需要重新创建该字典文 件。 如 果 要 使 用 字 典 文 件 , 数 据 库 至 少 应 该 处 于 M OUNT状 态 。 然后执行

控制文件与日志文件的管理

第 11 章

DBMS_LOGMNR_D.BUILD 过程将数据字典信息提取到一 个外部文件中。具体步骤如下。 ( 1 ) 确认设置了初始化参数U T L_FILE_D IR ,并 确 认 O racle对目录拥有读写权限, 然后启动实例。 SQL> show parameter utl NAME

TYPE

create_stored_outlines utl file dir

string string

VALUE

参 数 UTL_FILE_DIR指定的目录 主要用于存放DBMS_LOGM NR_D.BU1LD过程所 产生的字典信息文件。如果未 设置该参数,则可以通过如下 语句修改: SQL> alter system set utl_file_dir='e :∖orcldata ∖logminer' scope=spfile; 系统已更改。

( 2 ) 重 新 启 动 数 据 库 ( STARTUP)o 由 于 UTL_FILE_DIR参数不是一个 动态参数,在为其设置参数值后还需要重 新启动 数据库。 ( 3 ) 执 行 PL/SQ L过 程 DBMS_LOGMNR_D.BUILD 创建字典文件。 SQL> execute dbms_logmnr_d.build('e :∖orcldata ∖logminer∖sqltrace.o ra', , e: ∖orcldata ∖logminer'); P L / S Q L 过程已成功完成。

其中,第一个参数用于指定字 典文件的存放位置,它必须完 全匹配UTL_FILE_DIR 的值,第二个参数用于指示字 典文件的名称。

♦ - T 1 4 3 指定分析的日志文件「 在 使 用 LogM iner进行日志分析之前,必须 指定它将对哪些重做日志文件 进行分析。 LogM iner可以一次对多个重做日志 文件进行分析。 执 行 DBMS_LOGMNR.ADD_LOG FILE()过程可以指定要分析的 重做日志文件。利 用这个过程可以雇次添加多个 重施日志文件,或删除已经添 加的重做日志文件。下面是 指定重做日志文件列表的具体 操作步骤。 ( 1 ) 确保数据库实 例 已 经 启 动 ( STARTUP )o ( 2 ) 创建重做日志文件列表。 通 过 指 定 DBMS_LOGMNR.ADD_LOG FILE()过 程 的 N E W 选项来创建重做日志文 件的列表。例 如 ,利由下面的语句建立一个重 做日志文件列表,并向其中添 加一个重做 日志文件。 SQL> execute dbms_lognmr.add_logfile(logfilename=>,d: ∖aρp ∖user ∖oradata ∖orcl ∖redo01a .log',options=>dbms logmnr.new);

(3 ) 根据需要,使 用 A D D FILE选项继续向列表中添加 其他重作日志文件。比如, 利用下面的语句向列表中添加 重做日志文件。

283

Oracle 11g中文版数据库管理 、应用与开发标准教程 execute dbms__logmnr.add_lo gfile(logfilename=>, d:∖aρp∖user∖ oradata\orcl\redo02a.log* r options=>dbms_logm nr.addfile);

( 4 ) 如 果 需 要 , 还 可 以 通 过 指 定 DBMS_LOGMNR.AD D_LOGFILE()过 程 的 REM OVEFILE选项来删除 重做日志文件。例 如 ,利用下面的语句可以 将重做日志文件 REDO02A.LOG从日志 文件列表中删除。 execute dbms__logmnr.add_lo gfile(logfilename= > , d:∖app∖user∖ oradata∖orcl∖redo02a.log , , options=>dbms_logm nr.removefile);

DBMS_LOGMNR.AD D_LOGFILE()过 程 的 OPTIONS各选项的含 义如下。 □ NEW 表示创建一个新的日志 文件列表。 □ ADDFILE 表示向列表中添加日志 文件。 □ REMOVEFILE 与 ADDFILE相 反 ,为在列表中删除日志 文件。

史 - 11.4.4

284

启动 L ^M ine r -

在 为 L ogM iner创建了字典文件,并且指定了要分析的重 做日志文件列表后,就可 以启动LogM iner开始分析日志文件 了。执 行 DBMS_LOGMNR.START_LOGMNR()过程 将 启 动 LogMinero 启 动 LogM iner非常方便,只需要执行DBMS_LOGMNR.START_LOGM NR()过程即 可 。执行该过程时,需要 为参数DICTFILENA ME指定一个已经建立 的字典文件。例如, 下 面 的 语 句 在 执 行 DBMS_LOGMNR.START_LOGMNR()过程时 ,指定了前面所创建的 字典文件 E:\ORCLDATA\LOGM INER\SQLTRACE.ORA。 SQL> execute dbms_logmnr.start__logmnr(dictfilename=>, e :∖orcldata∖ logminer∖sqltrace.ora , ); P L / S Q L 过程已成功完成。

如果不指定字典文件,那么生成的分析结果 中将使用O racle内部的对象标识和数据 格式,这些数据的可读 性非常差。指定字典文 件后,O racle会将内部对象标 识和数据类 型转换为用户可读的对 象名称和外部数据格式 。 另夕卜,如果在执行DBMS_LOGMNR.START_LOGMNR()过程时没有指 定其他参数, 则在分析结果中包含重 做日志文件的所有内容 。因此,D B A 可 以 在 启 动 LogM iner时, 为其限定要分析的范围 。DBMS_LOGMNR.START_LOGMNR()过程提 供了基于分析日志 时 间 和 S C N 号的 参 数 ,它 们 分别 是 :表 示 分 析 的 起 始 /结 束 S C N 号 的 STARTSCN/ ENDSCN;表示分析的 起始/结束时间的STA RTTIME/ENDTIME。 例如,下面的语句在执行DB MS_LOGMNR.START_LOGMNR()过程时,将 过滤2008 年 5 月 1 日以后,2008年 5 月 1 0 日以前的数据。 execute dbms_logmnr.start_ logmnr(dictfilename=>, e :∖orcldata∖ logminer∖sqltrace.ora', starttime=>to_date (, 2008/05/01 01:00:00,, 1 yyyy/mm/dd hh:mi:s s ')z endtime=>to date(, 2008/05/10 10:30:00 , z , yyyy/mm/dd hh:mi:ss , ));

第 11 章

控制文件与日志文件的管理 在 使 用 S C N 号限定分析范围时,必须明确地知道事务的S C N 范围,这通常可以从 重做日志的基本信息中获取。

动态性能视图V$LOGMNR_CONTENTS中 包 含 LogM iner分析得到的所有信息。分 析结果 中 包 含 了 执 行 的 S Q L 语句、数据库对象名、会话信息、回退信息以及用户名等 信息。 例如,下面的语句可以查看一个分析结果。 select operation,sql redo from v$logmnr contents;

如果仅仅想知道某个用户对于某个表的操作,则可以使用如下S Q L 查询: select sql_redo from v$logmnr_contents table_name= ,EMP , ;

where username= , SCOTT , and ∙

需要强调的一点是,动态性能视图V$LOGMNR_CONTENTS中的分析结果仅在运 行 过 程 DBMS_LOGMNR.START_LOGMNR()的 会 话 的 生 命 期 中 存 在 。 因为所有的 LogM iner分析结果都存储在P G A 内存中,其他进程是看不到它的,同时随着进程的结 束 ,分析结果也随之消失。

φ-- 11.4.6

结束 LogM iner-:

正 常 退 出 L ogM iner会话时,必 须 使 用 DBMS_LOGMNR.END_LOGMNR()过程。 例如: execute dbms_logmnr.end_logmnr;

过 程 DBMS_LOGMNR.END_LOGMNR()将终止日志分析事务,并且 释 放 P G A 内存 区域,分析结果也将随之不再存在。如果没有执行该过程,则 LogM iner将保留所有它分 配的资源,直到启动LogM iner的会话结束为止。

变实验指导 1 . 备份控制文件 备份控制文件有两种方式,即二进制文件形式和脚本文件形式。本练习将分别备份 控制文件为二进制文件和脚本文件。 ( 1 ) 以二进制文件形式备份控制文件。 alter database backup controlfile to *d: ∖backup controlf ile∖control .bkp , ;

( 2 ) 以脚本文件形式备份控制文件。 alter database backup controlfile to trace;

"/



'

285

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 ( 3 ) 查看脚本文件的存放位置。 show parameter user_dump_dest;,



( 4 ) 打开以脚本文件形式备份的控制文件,查看生成的控制文件的脚本。 2 .控 制 归 档 改变日志操作模式时,必 须 以 SYSDBA和 SYSOPER身份连接到数据库。本练习将 控制数据库的日志操作模式。 ( 1 ) 检查当前日志操作模式。 select log_mode from v$database;

( 2 ) 改变数据库状态到M OUNT状态。 shutdown immediate; startup mount;

( 3 ) 改变日志操作模式,然后打开数据库。 alter database archivelog; alter database open;

( 4 ) 查看数据库是否已经处于归档模式。

286

archive log list;



思考与练习 一、填空题

当 第 2 个重做日志组突然损坏时,D B A 应当采取

1 . 假 设 数据库包含3 个控制文件,如果其

下列哪项操作? ( 使用

启动。

ALTER DATABASE ADD LOGFILE

措施来解决该问题 。

GROUP语句建立新的重做日志组

4 . 启用复合控制文件后,由于多个控制文 容



C . 使用 ALTER DATABASE CLEAR LOGFILE GROUP 2 语句对第2 个重

。这样在装载



做日志组进行初始化

O racle数据库时,系统会读取并打开

D . 使用 ALTER DATABASE CLEAR

参数所对应的所有控制文件。

LOGFILE GROUP 2 语句对第2 个重

5 .使 用 LogMin叫进行日志分析的基本步骤 为:

、指定日志文件、

做日志组进行初始化,然后删除它,



再重新建立第2 个重做日志组

查询输出结果。

3 . 在哪种情况下,可能需要增加重做日志

二、选择题 1 . 每 个 O racle数据库至少应包含几个重做 日志组? (

ADD

B . 删 除 所 有 重 做 日 志 组 ,然后再使用

3 . 如果某个数据库的L G W R 进程经常会因 为检查点未完成而进入等待状态,则 D B A 应当

件互为镜像,内

DATABASE

第 2 个重做日志组

上执行操作。

采取

ALTER

L∞FELE GROUP 2 语句建立新的

. 执 行 C O M M IT 操作时,后台进程会在

2

)

A . 删除原有的第2 个重做日志组,然后

中 一 个 控 制 文 件 被 用 户 误 删 除 ,则数据库将

组? (

) A . 检查点完成

)

A. 1 个

B. 2 个

B . 日志组未归档

C. 3 个

D. 4 个

C . 多元化重做日志

2 . 如果某个数据库拥有两个重做日志组,

D . 重做日志组成员被损坏

第 章11 控制文件与日志文件的管理 4 . 通过执行 ALTER SYSTEM ARCHIVE

项是不正确的? (

进程完成? (

5

须在 ALTER DATABASE ADD LOG



A. LGWR

B . 服务器进程

C.

D. ARCH

DBWR

F IL E 语 句 中 指 定 R EU SE子句 B . 在使用 ALTER DATABASE ADD

. 在为已有的数据库创建复合控制文件的

过程中,数据库应当处于什么状态? 〈

6



A . 如 果 要 覆 盖 已 有 的 日 志 文 件 ,则必

LOG A L L 语句进行归档时,该归档操作将由哪个

LOGFILE M E M B ER语句添加重做



A . 打开状态

B . 关闭状态

C . 未加载状态

D . 静默状态

日志组成员时,可 以 使 用 S IZ E 子句 设置重做日志文件的大小 C . 在 使 用 ALTER DATABASE ADD

. 假设用户通过操作系统命令将数据库的

LOGFILE GROUP语句创建新的重做

控制文件重命名,但是没有对初始化参数进行相

日志组时,可以显式地指定组号,也

应的修改,那么在下一次启动数据库时将会发生

可以让Omcle对新建组进行自动编号

下列哪种情况? (



D . 如果选择显式地新建重做日志组进行

A . 数据库无法加载

编 号 ,编号应当连续

B. O ra c le 能够自动搜索到更名后的控制 文件,并利用它来打开数据库 C . 数据库能够加载,但是却无法打开 D.

v 新的控制文 O ra c le 将自动创建一"↑

件 ,并利用它来打开数据库 7

. 为数据库添加一个新的数据文件之后,

应当立即执行下列哪操作? (



A . 重新启动实例 B

. 备份所有的表空间

三 、简答题 1 . 重新建立控制文件,修改以下永久参数。 □ 最大数据文件个数: 100. □ 最大日志组个数:50. □ 每个日志组的最大日志成员个数:4. 2

. 为 数 据 库 添 加 两 个 控 制 文 件 DAORCL∖

ORCL01.CTL 和 D:\ORCL\ORCL02,CTLo 3 . 为数据库添加一个新的日志组, 日志组 大 小 为 10MB o

C . 备份控制文件

4

D . 更新初始化参数

5 . 查看数据库的日志文件。

8 . 下列关于创建重做日志文件中的描述哪

. 改变数据库的日志操作模式。

28

第 12章

管理表空间 和数据文件

在物理上,数据库中的数 据存储在数据文件中,而 在逻辑上,数据库中的数 据存储 在表空间中。这也就意味 着表空间与数据文件之间 存在着对应关系,对表空 间的管理操 作与对数据文件的管理操 作密切相关。通过使用表 空间,可以有效地部署不 同类型的数 据 ,加强数据管理,从而提 高数据库的运行性能。 本章将介绍如何在数据库 中创建新的表空间和数据 文件,以及如何对已有的表空间 进行维护和管理。 本章学习要点: > 掌握各种表空间的建立方 法

>

掌握管理数据文件的方法

>

掌握改变表空间状态的方 法

>

掌 握 对 U N D O 表空间的管理

>

掌握扩展表空间的方法

T

建立表空间

在 Oracle 11g中,当数据库管理员(D B A )创建数据库时,Oracle不 仅会创建SYSTEM 表空间,还会创建一些辅 助表空间,如 U N D O 表空间和默认临时表空间 。为了简化表空 间的管理并提高性能,O racle建议将不同类型的 数据部署到不同的表空间 中。因此,在 创建数据库后,数据库管 理员还应该根据具体应用 的情况,建立不同类型的 表空间。例 如 ,专门存放表数据的表空 间、存放索引的索引表空 间等。

. - - 1 2 1 1 建 立 普 通 表 空 间 -; 根据表空间对盘区的管理 方式,表空间可以分为数 据字典管理的表空间和本 地化管 理的表空间。数据字典表 空间是传统的表空间类型 ,其主要用于早期的O racle数据库版 本中,它是通过数据字典对表空间中的盘区进行管理的。而本地管理表空间,则不再使用数 据字典去寻找空闲空间,而使用位图的方法使用表空间中的数据块,从而避 免使用S Q L 语 句引起系统性能的下降。从 O racle9iR 2后,系统默认创建的表空间为本地管理表空间。 要创建本地管理方式的表 空间,可 以 在 CREATE TABLESPACE语句中显式地使用 EXTENT MANAGEMENT 子句指定 LOCAL 关键字。省略 EXTENT MANAGEMENT 子 句时,创建的是本地管理 方式的表空间。例如,下 面的语句创建表空间U S E R 0 1 ,该表 空间具有一个50M B 的数据文件,并且使用本 地管理方式。 SQL> create tablespace userθl 2 datafile ,d:∖oracledata∖user01' size 50M 3 extent management local; 表空间已创建。

在 创 建 本 地 管 理 方 式 的 表 空 间 时 ,可 以 通 过 EXTENT M ANAGEM ENT子句和



12 章

管理表空间和数据文件-----------SEGMENT SPACE MANAGEMENT子句来为表空间设置区的分配管理方式和段的存储 管理方式。 1 . 本地管理表空间中区的分配管理方式 在创建本地管理方式的表空间时,可以为它应用两种区的分配管理方式。 □

AUTOALLOCATE

如果在

EXTENT MANAGEMENT 子 句 中 指 定 了

AUTO ALLOCATE关键字,则说明由O racle负责对区的分配进行自动管理。这 也是默认的设置。 □

UNIFORM

如果在 EXTENT MANAGEMENT 子句中指定了 UNIFORM 关键

字 ,则说明表空间中所有的区都具有统一的大小。 如 果 D B A 能够预测到表空间中将存放的是大小经常变化的、需要使用许多不同大 小的区的对象,那么可以使用AUTOALLOCATE关键字。该关键字提供了一种最简单的 区的分配管理方式。 例如,下面的语句将创建一个AUTOALLOCATE方式的本地管理表空间。 SQL> create tablespace user02 2 datafile , d:∖oracledata∖user02.dbf , size 50m 3 extent management local autoallocate;

表空间已创建。

289

如 果 D B A 能够预测到表空间中存放的大部分对象都要求使用相同大小的区,那么 UN IFORM 关键字是更好的选择。在这种方式下,O racle将为表空间中所有的对象分配 相同大小的区。

.

例如,下面的语句可以创建一个UNIFORM方式的本地管理表空间,表空间中所有 区的大小都是512KB。 SQL> create tablespace user03 2 datafile ,d:∖oracledata∖user03.dbf , size 50m 3 extent management local uniform size 512k;

表空间已创建。

如 果 在 UNIFORM关键字后没有指定SIZ E 参数值,则 SIZ E 参 数 值 为 1MB。 2

. 本地管理表空间中段的存储管理方式

在创建本地管理方式的表空间时,除了需要选择区的分配管理方式外,还可以选择 表空间中段的存储管理方式。段的存储管理主要是指Oracle用来管理段中已用数据块和 空闲数据块的机制。 ⅛ CREATE TABLESPACE 语句中可以通过使用 SEGMENT SPACE MANAGEMENT 子句来设置段的存储管理方式。可以为本地管理方式的表空间设置如下两种段的存储管 理方式。 □

手动方式

使 用 SEGMENT SPACE MANAGEMENT MANUAL子句可以将段的

存储管理方式设置为手动方式。这 时 O racle将使用可用列表来管理段中的空闲 数据块,手动方式也是默认的方式。 □

自动方式

自动管理方式使用SEGMENT SPACE MANAGEMENT A U TO 子句

来设置,这 时 O racle将使用位图来管理已用数据块和空闲数据块。Oracle ½ i±

Oracle 11g中文版数据库管理、应用与 开发标准教程 位图中的单元的取值来判断段 中的块是否可用. 可用列表是管理存储空间的传 统方式,段中所有空闲的数据块 都被放入这个列表, 在需要存储空间时,系统将在 可用列表中搜索。与可用列表方 式相比,使用位图的自动 化管理可以提供更好的存储利 用率。在自动化方式下,用户不 需要在创建对象时通过指 定 PCTFREE、PCTUSED等参数来 为段管理数据块。如果用户设置 了这些参数,则在自 动化方式下将被忽略。 例如,下面的语句将创建一个 具有手动段存储管理方式的表 空间。 SQL> create tablespace user04 2 datafile ,d:∖oracledata∖user04.dbf , size 50m 3 extent management local uniform size 512k 4 segment space management manual; 表空间已创建∙

φ- 12.1.2

290

、 建立大文件表空间八二

BIGFILE) — 大文件( 从 Oracle 1 0 g 开始,O racle引入了一个新增的表空间 类型— 表空间,从而显著地增强了存 储能力。一个大文件表空间对应 一个单一的数据文件或临 时文件,但是文件可以达到4G .个数据块大小。理论上,当数 据块大小为8 K B 时,大文 件表空间的数据文件最大可以 达到32TB;当数据块大小为32 K B 时,那么大文件表空间 的数据文件最大可以达到128T B。在实际环境中,这还受到操作系统中文件系统 的限制。 在创建表空间时,默认创建的 表空间为SMALLFILE类型的表 空间,通过查询数据 字 典 视 图 DATABASE_PROPERTIES,可 以显示当前数据库默认创建的 表空间是否为 BIGFILE类型的。具体如下: SQL> select * 2 3

from database_properties where property_name = , DEFAULT_TBS_TYPE , ;

PROPERTY_NAME

PROPERTY_VALUE

DESCRIPTION

DEFAULT_TBS_TYPE

SMALLFILE

Default tablespace type

从这里可以看出,如果在创建 表空间时不指定数据文件的类 型,那么默认创建的表 空 间 都 是 SMALLFILE类型的。用户可以 通过ALTER DATABASE命令来修改数据库 默 认的表空间类型。 SQL> alter database set default bigfile tablespace; 数据库已更改。 SQL> select ♦ 2 3

from database_properties where property_name = , DEFAULT_TBS_TYPE , ;

PROPERTY_NAME

PROPERTY_VALUE

DESCRIPTION

DEFAULT_TBS_TYPE

BIGFILE

Default tablespace type

管理表空间和数据文件

SQL> alter database set default smallfile tablespace; 数据库已更改。

建立大文件表空间是使用CRETAE BIGFILE TABLESPACE语句完成的。需要注意, 当 执 行 该 语 句 建 立 大 文 件 表 空 间 时 ,不 能 使 用 SEGMENT SPACE MANAGEMENT M A N U A L 子句,并且只能指定一个数据文件。例如,下面的语 句将创建一个大文件表 空间 BIGJTBS。 SQL> create bigfile tablespace big_tbs 2 datafile , d:\oracledata\bigfile_tbs01.dbf , size 10m; 表空间已创建,

执行上述语句后,将 建 立 名 称 为 B IG _T B S 的大文件表空间,该表空间的空间管理 方式为本地化管理,并且区大小由系统自i b 分配。 通 过 查 询 数 据 字 典 DBA_TABLESPACES,可以了解表空间是否为大文 件表空间类 型 。例如: SQL> select tablespace_name r bigfile 2 from dba_tablespaces 3 where tablespace_name= ,BIG_TBS , ; TABLESPACE_NAME

BIG

BIG_TBS

YES

在前面曾提及过,大文件表空间的最大大小与数据块 有关。例如,下面将显示当前 数据库的数据块大小。 SQL> show parameters db_block_size; NAME

TYPE

VALUE

db block size

integer

8192

也就是说,理论上创建的BIGFILE表空间最大可以 创建32TB 0

♦ - - 1 2 . 1 . 3 建 立 临 时 表 空 间 -; 通过在表空间中分配临时存储空间,O racle能够使带有排序等操作的S Q L 语句获得 更高的执行效率。如果创建了专门的临时表空间,O racle就可以不必在其他表空间中为 排序操作分配临时空间,这样不仅可以实现临时数据 的集中化管理,而且还不会影响到 其他表空间的使用效率。 在数据库中创建用户时必须为用户指定一个表空间作 为临时表空间使用,该用户所 生成的所有临时表数据都将存储在这个表空间中。如果使用其他表空间作为临时表空间, 这不仅会占用其中的存储空间,而且会在该表空间中 生成许多存储碎片,从而影响整个 数据库的性能。因此,最好为数据库创建一个专门的 临时表空间。 一个临时表空间可以被多个数据库用户共享使用。在 临时表空间中创建的段称为临 时段。O racle只会为一个实例创建一个临时段,这个临时段被 实例中的所有排序操作共

291

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 享使用,但是临时段中的每个区只能由一个 事务使用。 另外,如果在数据库运行过程中经常有大量并发排 序操作,那么为了提高排序性能, 可 以 建 立 多 个 临 时 表 空 间 。 建 立 临 时 表 空 间 是 使 用 CREATE TEMPORARY TABLESPACE命令完成的。 1 . 建立本地管理临时表空间 建立本地管理临时表空间时,使 用 UNIFORM选项可以指定区的大小。需要注 意, 当建立临时表空间时,不能 指 定 AUTOALLOCATE选项。 例如,下面的语句在数据库中创建一个临时 表空间TEMP01。 SQL> create temporary tablespace tempθ1 2 tempfile , d:∖oracledata∖temp01.d bf , size 10m 3 extent management local 4 uniform size 256k; 表空间已创建。

上面创建的表空间的管理方式为本地化管理 ,并且区的大小统一为256KB。需要注 意 ,本地化管理临时表空间不使用数据文件,而使用临时文件,也就是说,在创建临时 表空间时,必须将表示数据文件的DATAFILE改为表示临时文件的TEMPFILE。

292

2

. 建立大文件临时表空间

在 Oracle 11g 中,允许使用 CREATE BIGFILE TEMPORARY TABLESPACE 语句建 立只包含一个临时文件的大文件临时表空间 。例如: SQL> create bigfile temporary tablespace big_temp02 2 tempfile , d:∖oracledata∖temp02.d bf , size 10m; 表空间已创建。

上述语句创建了一个名为BIG_TEMP02的临 时表空间,该表空间只能包含一个临时 文件,并且其空间管理方式为本地管理。 3

.使用临时表空间组

临时表空间组是多个临时表空间的集合,它 使得一个数据库用户可以使用多个临时 表空间。临时表空间组具有如下特点。 □ 临时表空间组至少要包含一个临时表空间。 □ 临 时表空间组不能与任何表空间同名。 □ 当指定数据库的默认临时表空间或用户的临 时表空间时,可以直接指定临时表 空间。 使用临时表空间时,必须首先执行CREATE TEMPORARY TABLESPACE语句显式 地建立临时表空间,而临时表空间组则是隐 含建立的。当 执 行 CREATE TEMPORARY TABLESPACE语句时,通 过 指 定 TABLESPACE G R O U P选项,可以隐含地建立临时表 空间组。例如,下面的语句将隐含建立临时 表空间组GROUP1: SQL> create bigfile temporary tablespace tempo3 2 tempfile , d:∖oracledata∖temp03.d bf , size 2m 3 tablespace group groupl;



12 章 管理表空间和数据 文件 表空间已创建。

执 行 上 述 语 句 后 ,会 显 式 建 立 临 时 表 空 间 T E M P 0 3 ,隐 含 建 立 临 时 表 空 间 组 GROUP 1 , 并且将临时表空间 TEM P03添加到临进表 空间组GROUP 1 中。当 执 行 ALTER TABLESPACE语 句时,通 过 指 定 TABLESPACE GROUP选项,可 以隐含建立临时表 空 间组。下面以隐含建立临 时表空间组GRO UP2为例,说 明 使 用 ALTER TABLESPACE隐 含建立临时表空间 组的方法。例如: SQL> alter tablespace tempθ1 tablespace group group2; 表空间已更改。

上述语句将隐含地 创建表空间组GR OUP2,并将临时表 空间TEMP01追加 到该组中。 使 用 ALTER TABLESPACE语 句不仅可以隐含地 建立临时表空间组 ,而且可以将已 创建的临时表空间 添加到临时表空间 组中,或者从临时 表空间组中删除其 成员。例如, 下面的语句将TE MP01、TEM P03添加到临时表 空间组GROUP 1 中。 SQL> alter tablespace tempθ1 tablespace group groupl; 表空间已更改。 SQL> alter tablespace tempo3 tablespace group groupl; 表空间已更改。

当要从临时表空间 组中删除成员时,也可以使用ALTER TABLESPACE语 句。例如, 下面的语句从临时 表空间组GR OU P1中删除成员TE MP03。 SQL> alter tablespace tempθ3 tablespace group 表空间已更改。

1一 2一一 . 1一一 . 4一— 建 立 非 标 准 表 空 间 一一一― —— —— 一一 一一 一一块 一一 一一 一一 一一i 一

J

前 面 所 创 建 的 表 空 间 中 ,所 有 的 数 据 块 大 小 都 是 相 同 的 。数据块的大小 由参数 DB_BLOCK_SIZ E决定, 并且在创建数据库 后不能再进行修改 。 为了 优化 I/O 性能,Oracle 系余允许不l⅞的表 空间使用不同大小 的数据块,这样可 以实现将大规模的 表存储在由大 数据块构成的表空 间中,而小规模的 表则存储在由小数 据块构成的表空间 中。在创建非 标准数据块的表空 间时,用户需要显 式地使用BLOCK SIZE选 项 。 当在数据库中使用 多种数据块大小时 , 必须为每种数据块 分配相应的数据高 速缓存, 并且数据高速缓存 的大小可以动态修 改。具体而言,参 数 BLOCKSIZE必须与数据缓冲 区 参 数 DB_nk_CACHE_ SIZE相对应,BL OCKSIZE与数据 缓冲区参数DB_nk_CACHE_ S IZ E 的对应关系如表 12-1所示。 者

表 12-1

, BLOCKSIZE 与 DB_nk_CACHE_SIZE 对应关系

BLOCKSIZE

DB nK CACHE SIZE

2KB

DB_2K_CACHE_SIZ E

4KB

DB_4K_CACHE_SIZ E

8KB

DB_8K_CACHE_SIZ E

16KB

DB_l 6K_CACHE_SIZE

32KB

DB 32K CACHE SIZE

Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程

例如,下面 的语 句 为 16K B 数据块设置了 2 0 M B 的高速缓冲区 。 SQL> alter system set db_16k_cache_size=20m; 系统已更改。

分配了非标准 数据高速缓存 后,就可以建 立非标准块表 空间了。建立 非标准块表空 间时,必 须 指 定 BLO C K S IZE 参数。例如,下面的语句创 建了数据块大 小为 1 6 K B 的非 标准块表空间 。 SQL> create tablespace bigblock_tbs 2 datafile ,d:\oracledata\big__blick_tbs01.d bf , size 2m 3 blocksize 16k; 表空间已创建。

查 询 数 据 字 典 视 图 USER_TABL ESPACES,可以显示表空 间的数据块大 小,具体 如下: SQL> select tablespace_ name z block_size 2 from user_tablespaces 3 where tablespace_ name= ,BIGBLOCK_TB S " ;

294 TABLESPACE_NAME

BLOCK_SIZE

BIGBLOCK_TBS

16384

方维护表空间 对于数据库管 理员而言,在 创建各种表空 间后,还需要 经常维护表空 间,如改变表 ■空间的可用性 和读写状态,改变表空间的 名称、备份和 恢复表空间、删除不需要的 表空 间等。

当建立表空间 时,表空间及 其所有数据文 件都处于 O N LIN E 状态,此时该 表空间及 其数据文件都 是可以访问的 。在多表空间数 据库中,D B A 可以通过将某 个表空间设置为 脱机状态,使 数据库的某部 分暂时无法被 用户访问。同 时,数据库的 其他表空间不 会受 到任何影响。相反地,也可 以将某个处于 脱机状态的表 空间重新设置 为联机状态,使用 户能够重新访 问其中的数据 。 1 . 使表空间脱机

为了实现如下 目的时,D B A 可能需要将一 个表空间设置 为脱机状态。 □ 要禁止用户访 问数据库中的 一部分数据,但又不影响对 数据库中其他 部分的正 常访问。 □ 要进行脱机表 空间备份。 □ 在升级或维护 应用程序时,要禁用与该应 用程序相关的 表空间数据操 作.

管理表空间和数 据文件 在将某个表空间 设置为脱机状态 时,属于这个表 空间的所有数据 文件也被设置为 脱 机状态。需要注 意,SY STEM 表 空 间 和 SY SA U X 表空间不能被脱 机,因为在数据库运 行期间始终会使 用SYSTEM表空 间中的数据。 设置表空间为脱 机状态时,可以 使用如下4 个参数来控制脱 机方式。 □ N O R M A L 该参数表示将表 空间以正常方式 切换到脱机状态 。在进入脱机状态 的过程中,Orac le会执行一次检 查点,将 S G A 区中与该表空间 相关的脏缓存块 写入数据文件中 ,然后再关闭表 空间的所有数据 文件。如果在这 个过程中没有 发生任何错误,则可以使用NOR M AL参数,这也是 默认的方式。 □ T E M P O R A R Y 该参数将表空间 以临时方式切换 到脱机状态。这 时 O racle在执 行检查点时并不 会检查各个数据 文件的状态,即 使某些数据文件 处于不可用状 态 ,O ra c le 也会忽略这些错 误。这样在将表 空间设置为联机 状态时,可能需 要 进行数据库恢复 。 □ I M M E D I A T E 该参数将表空间 以立即方式切换 到脱机状态。这 时 O racle不会 执行检查点,也 不会检查数据文 件是否可用,而 是直接将属于表 空间的数据文 件设置为脱机状 态。下一次将表 空间恢复为联机 状态时必须进行 数据库恢复。 □ F O R R E C O V E R 该参数将表空间 以用于恢复方式 切换到脱机状态 。如果要对 表空间进行基于 时间的恢复,可 以使用这个参数 将表空间切换到 脱机状态。 例如,下面的语 句将表空间USE R 01以立即方式切 换到脱机状态。 SQL> alter tablespace userθl offline immediate; 表空间已更改。

⅛t”

如果数据库运行在 非归档模式下 (NOARCHΓVELO G),由于无法保留恢 复表空间所需的

重做日志,所以不 能将表空间以立即 方式切换到脱机状 态。

将表空间设置为 脱机状态时,应 当尽 量 使用 N O R M A L方式,这样在将 表空间恢复 联机状态时不需 要进行数据库恢 复。只有在无法 使用N O RM A L方式进入脱机状 态时才 考 虑 使 用 TEMPORARY方式,当上述两种 方式失败时,才 需要 使 用 IMMEDIATE方 式。 例如,下面的语 句以NORM AL方式将表空间 USER01转 变 为 OFFLINE状 态 。 SQL> alter tablespace userθl offline normal; 表空间已更改。 ;-.;u

当表空间处于O FFLINE状态时,该表空间将不能 被访问。 2 . 使表空间联机 在数据库处于打 开状态时,D B A 可以将脱机的表 空间重新恢复为 联机状态。表空间 恢复为联机状态 后,用户可以重 新访问其中的数 据。 如果在表空间进 入脱机状态时,属于该表空间的 所有脏缓存块都 已经被写入数据 文 件 ,则称该表空间 在切换到脱机状 态时是“干 净 的 " ( 以 N O R M A L方式切换)。如果脱 机表空间是''干 净的",在将它恢 复到联机状态时 不需要进行数据 恢复,否则恢复 为联机 状态之前必须先 对表空间进行数 据库恢复。 例如,下面的语 句将表空间USE R01转 变 为 ONLINE状态。

第 12 章

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程

SQL> alter tablespace userθl online; 表空间已更改。 SQL> create table employees( 2 id number(4), 3 name varchar(20), 4 salary number( 7 Λ 2) 5 )tablespace userOl; 表已创建。

φ- 1 2 . 2 . 2 改 变 表 空 间 读 写 状 态 ι 表空间可以是读写方式,也可以是只读方式。默认情况下,所有的表空间都是读写 方式,任何具有配额并且具有适当权限的用户都可以写入表空间。但是如果将表空间设 置为只读方式,则任何用户都无法向表空间写入数据,也无法修改表空间中已有的数据, 这种限制与权限无关。 将表空间设置为只读方式的主要目的是为了避免对数据库中的静态数据进行更改。

296

用户只能查询只读表空间中的数据,而不能进行修改。 1 . 设置表空间为只读状态

所有的表空间在创建后都是处于读写状态。通 过 在 ALTER TABLESPACE 语句中使 用 READ ONLY 子句,可以将表空间设置为只读状态。将表空间设置为只读状态时,表 空间必须处于联机状态,另外,SYSEM 表空间不能设置为只读状态。 例如,下面的语句将把表空间 U SE R 01 设置为只读状态。 SQL> alter tablespace userθl read only; 表空间已更改。 SQL> insert into employees 2 values (100r , SWITH∖1200); insert into employees * 第 1 行出现错误: ORA-003721 此 时 无 法 修 改 文 件 10 ORA-01110:数据文件 '10: 'D:\ORACLEDATA\USER01'

上述语句执行后,不必等待表空间中的活动事务结束即可立即生效,U S E R 0 1 表空 间 将 进 入 “事务只读状态”。以后任何用户都不能再创建针对该表空间的读写事务,而当 前正在活动的事务则可以继续向表空间中写入数据,直到它们结束为止。当针对该表空 间的所有事务都结束之后,表空间才进入只读状态。 2 . 设置表空间为读写状态

将表空 间 恢 复 为 读 写 状 态 时 ,需 要 在 ALTER TABLESPACE 语 句 中 使 用 READ W RITE 子句。将表空间恢复为读写状态时,必须保证表空间的所有数据文件都处于联机

状态,同时表空间本身也必须处于联机状态。 例如,下面的语句可以将表空间 U SE R 01 恢复为读写状态。

管理表空间 和数据文件 SQL> alter tablespace userθl read write; 表空间已更改 。

在 Oracle 10g之前,表空间的名 称是不能被 修改的。在 Oracle 11g中,通 过 在 ALTER TABLESPA CE语句中使 用RENAM E子句,数据库管理 员可以改变 表空间的名 称。例 如 , 下面的语句 将修改表空 间BIG_TBS 为 BIG_FILE_TBSo SQL> alter tablespace big tbs rename to big file tbs; 表空间已更改 。 一 一 一

需要注意,SY STEM 表 空 间 和 SYSAUX表 空间的名称 不能被修改 ,并且当表空间 或其中的任 何数据文件 处于OFFLI NE状态时,该表空间的 名称也不能 修改。

在 Oracle 10g前 ,建立数据 库用户时,如果不指定 其默认的表 空间,则系统将使用 SY ST E M 表空间作为 用户的默认 表空间。在 Oracle 1 1 g 中,使 用 ALTER DATABASE DEFAULT TABLESPA CE语句可以 设置数据库 的默认表空 间,这样当 建立用户时 ,默认 将使用指定 的表空间。设置数据库 默认表空间 的示例如下 : SQL> alter database default tablespace users; 数据库已更改 。

与此类似,使 用 ALTER DATABASE DEFAULT TEMPORARY TABLESPACE 语句可 以为数据库 设置默认的 临时表空间 。例如,下面 的语句改变 数据库的默 认临时表空 间为 临时表空间 组GROUP 1。 SQL> alter database default temporary tablespace groupl; 数据库已更改 。

如果表空间 和其中保存 的数据不再 使用时,可 以从数据库 中删除这个 表空间。除了 S Y S T E M 表 空 间 外 ,数 据 库中 的任 何表 空间 都可以 删除 。删 除 表 空 间 将 使 用 DROP TABLESPA CE语句,执 行该语句的 用户必须具 有DROP TABLESPA CE系统权限 。 删除表空间 时,O racle仅仅是 在控制文件 和数据字典 中删除与表 空间和数据 文件相 关的信息,默认情况下 ,O racle并不会 在操作系统 中删除相应 的数据文件 。因此,在成 功执行删除 表空间的操 作后,需要 手动删除操 作系统中的 数据文件。如果在删除表空间 的 同 时 要 删 除 对 应 的 数 据 文 件 ,则 必 须 显 式 地 指 定 INCLUDING CONTENTS AND DATAFILES 子句。 例如,下面 的语句将删 除表空间US ER01。

第 12 章

Oracle 1 1 g 中文版数据库管理、应用与 开发标准教程 SQL> drop tablespace userθl including contents; 表空间已删除。



如果在表空间中包含数据库对象 ,则 必 须 在 DROP TABLESPACE语句中显式地指 定

INCLUDING CONTENTS 子句。

如 果 要 在 删 除 表 空 间 U S E R S 的同时删除它所对应的数据 文件,则可以使用如下 语句: SQL> drop tablespace user02 including contents and datafiles; 表空间已删除。

表 12-2列出了各种包含有表空 间信息的数据字典和动态性 能视图。 W W 表 12-2

一包含表空间信息的视图

视图 V$TABLESPACE DBA_TABLESPACE DBA_SEGMENTS

说明 包含从控痴文件中获取的襄空间 名称而编号信息 包含数据库中所有表空间的描述 信息 包含所有表空间中的段的描述信 息

V$DATAFILE

包含所有表空间中的区的描述信 息 包含从控制文件中获取的数据文 件的基本信息,包括它所属的表空 间名 称 、编号等

V$TEMPFILE DBA_DATA_FILES

包含所有临时数据文件的基本信 息 包含数据文件以及所属表空间的 描述信息

DBA_TEMP_FILES

包含临时数据文件以及所属表空 间的描述信息

V$TEMP_SPACE_POOL

包含本地管理方式的临时表空间 的缓存信息 包含本地管理方式的临时表空间 中所有区的描述信息

DBA_EXTENTS

V$TEMP_EXTENT_MAP V$SORT_SEGMENT V$SORT_USER

包含实例所创建的排序区的描述 信息 包含描述排序区的用户使用情况 的信息

巴管理数据文件 数据文件在创建数据库或表 空间时建立。表空间创建后,D B A 可以根据需要为表空 间添加新的数据文件,或者 更改已有数据文件的大小、名称和位置。

φ-- 1 2 .3 .1 数 据 文 件 的 管 理 策 略 [ 数据文件是物理上存储表空 间数据的操作系统文件,在 创建表空间的同时将为它建 立数据文件。在创建表空间 前,D B A 不仅要考虑表空间的管理方 式,还需要决定与表空 间对应的数据文件的数量、大小以及位置。

第 12 管理表空间和数 据文件------------- 睡 1 . 确定数据文件的 数量 在 为 其 他 非 SYSTEM表空间 设置数据文件的 数量时,需要考 虑如下限制条件 。 □ 初始化参数DB FILES指 定 在 S G A 区中能够保存的 数据文件信息的 最大数量, 也就是一个实例 所能支持的数据 文件的最大数量 。 □ 操作系统中每一 个进程能够同时 打开的文件数量 是有限的,这个 限制的大小取 决于操作系统本 身。 □ 每新建一个数据 文件,都会在数 据库的控制文件 中添加一条记录 。如果在控制 文 件 中 指 定 了 MAXDATAFIL ES子 句 ,那 么 在 控 制 文 件 中 最 多 只 能 保 存 MAXDATAFIL ES条数据文件的 记录。 但是数据库所拥 有的数据文件的 最大值仍 然 是 DB FIE L S参数指定。如 果 MAXDATAFELES参 数 小 于 DB_FILES参数 , 则 Oracle会自动对 控制文件进行扩 展,以便容纳更 多的数据文件记 录。 2 . 确定数据文件的 存放位置 表空间数据的物 理存放位置由数 据文件的存放位 置决定。因此,要正确地为表空间 设置物理存储位 置,就必须合理 地选择数据文件 的存放位置。 例如,如果数据 库可以使用多个 磁盘,可以考虑 将可能并发访问 的数据文件分散 存 储在各个磁盘中 ,这样可以减少 由于磁盘I/O 冲突对系统性能 造成的影响。 3

. 分离存放数据文 件与日志文件

299 同的磁盘中。如 果数据文件和重 做日志文件保存 在同一个磁盘中 ,当这个磁盘损 坏时, 数据库中的数据 将永久性地丢失 。 在使用复合重做 日志文件时,如 果各个成员日志 文件分别存放在 独立的磁盘中,那 么同时丢失所有 重做日志的可能 性很小,这时将 数据文件与重做 日志文件保存在 相同的 磁盘中是允许的 。

t-

1 2 .3 .2 添加表空间数据文件[ 在创建表空间时 ,通常会预先估 计表空间所需的 存储空间大小,然后为它建立若 干

适当大小的数据 文件。如果在使 用过程中发现表 空间存储空间不 足,可以再为它 添加新 的数据文件,以 增加表空间的总 存储空间。 要 为 普 通 表 空 间 添 加 新 的 数 据 文 件 , 可 以 使 用 ALTER TABLESPACE -ADD DATAFILE语句 ,执行该语句的 用户必须具有ALTER TABLESPACE系 统权限。 例如,下面的语 句为表空间USE R03添 加 一 个 大小 为 10M B 的数据文件。 SQL> alter tablespace user03 2 add datafile , d:\oracledata \user03_02.d bf , size 10m; 表空间已更改。

例如,下面的语 句为临时表空间 TEM P01添加一个新 的临时文件。 SQL> alter tablespace tempθ1 2 add tempfile , d:\oracledata \temp01_02.db f , size 10m reuse; 表空间已更改。

Oracle 1 1 g 中文版数据库管理、应用与 开发标准教程 在添加新的数据文件时,如果同名的操作系统文件已 经存在,ALTER TABLESPACE 语句将失败。如果要覆盖同 名的操作系统文件,则必须 在 ALTER TABLESPACE语句中 显式地指定REU SE子句。

t-

1 2 . 3 . 3 改变数据文件的大小 二、

除了为表空间增加新的数据 文件外,另一种增加表空间 的存储空间的方法是改变已 经存在的数据文件的大小。改变数据文件大小的方式一 共有两种:设置数据文件为 自动 增长;手动改变数据文件的 大小。 1 . 设置数据文件为自动增长 在创建数据文件时,或者在 数据文件创建以后,都可以 将数据文件设置为自动增长 方式。如果数据文件是自动 增长的,当表空间需要更多 的存储空间时,O racle会以指定 的方式自动增大数据文件的 大小。 使用自动增长的数据文件具 有以下优势。 D B A 无须过多地干涉数据库的物 理存储空间分配。 □ 可以保证不会出现由于存储 空间不足而导致的应用程序 错误。 例如,下面的语句在创建表 空间U SE R 01时将数据文件USER01_ 01.DBF设置为自



300

动增长方式。 SQL> create tablespace userθl 2 datafile ,d:\oracledata\user01_01.dbf f size 10m 3 autoextend on 4 next 2m 5 maxsize 500m 6 extent management local; 表空间已创建。

其中,AUTOEXTEND指定 数据文件是否为自动增长。如果指定数据文件为自动增 长 ,则 通 过 N E X T 语句可以指定数据文件每次 增长的大小。M AXSIZE表示当数据文件 为自动增长时,允许数据文 件增长的最大限度。 如果数据文件已经创建,则 可以使用ALTER DATABASE语句为它应用 自动增长方 式 。例如,下面的语句将数据 文件USER03.DBF设置为自 动增长方式。 SQL> alter database 2 datafile ,d:∖oracledata∖user03.dbf 3 autoextend on 4 next 512k 5 maxsize 250m; 数据库已更改。

使 用 ALTERDATABASE语句也 可以取消已有数据文件的自 动增长方式。例如: SQL> alter database 2 datafile ,d:∖oracledata∖user03.dbf

第 12 管理表空间和数据文件 ------------- 上 3

autoextend off;

数据库已更改。

2 . 手动改变数据文件的大 小 除了自动增长方式外,D B A 还可以通过手动方式来 增大或减小已有数据文 件的大 小 。手动方式改变数据文 件的大小时,需 要 在 ALTER DATABASE语 句 中 使 用 RESIZE 子句。例如,下面的语 句将数据文件USER03 .DBF增 长 为 500MB。 SQL> alter database 2 datafile *d:∖oracledata∖user03.d bf , 3 resize 500m; 数据库已更改。

在 使 用 R E SIZ E子句缩小数据文件时 ,必须保证缩小后的数 据文件足够容纳其中已 有的数据。

f

1 2 . 3 . 4 改变数据文件的可 用性 与表空间类似,联机的 数据文件或临时数据文 件也可以被设置为脱机 状态。将数据

文件设置为脱机状态时 ,不会影响到表空间的 状态。但是反过来,将 表空间设置为脱机 状态时,属于该表空间 的数据文件将全部同时 进入脱机状态。 一种典型的情况,如 果 O racle在写入某个数据文 件时发生错误,则系统 会自动将这 个数据文件设置为脱机 状态,并且记录在警告 文件中。随后,D B A 在排除了故障后,需 要以手动方式重新将数 据文件恢复为联机状态 。 使 用 ALTER DATABASE语句,可以 改变表空间中单独的数 据文件的可用性。而使 用 ALTER TABLESPACE语句则可 以改变表空间的所有数 据文件的可用性。例如 ,下面 的语句将数据文件US ER03.DBF设置为脱机 状态。 SQL> alter database 2 datafile ,d:∖oracledata∖user03.dbf , offline; 数据库已更改。

在 使 用 ALTER DATABASE语句改变数 据文件的可用性时,数 据库必须运行在归档 模式下,因为脱机状态 的数据文件被丢失的可 能性很大。

b -1 2 3 5 在建立数据文件后,还 可以改变它们的名称或 位置。通过重命名或移 动数据文件, 可以在不改变数据库逻 辑结构的情况下对数据 库的物理存储结构进行 调整。 改变数据文件名称和位 置的操作分为两种情况 :要改变的数据文件属 于同一个表空 间;要改变的数据文件 分别属于多个表空间。在这两种情况下,分别 需要使用不同的语 句进行操作。

301

Oracle 11g中文版数据库管理、应用与开发标准教程

在改变数据文件的名称或位置时,O r a c le 只是改变记录在控制文件和数据字典中的数据 文件信息,实际上并不会改变操作系统数据文件的名称和位置。

1 . 改变属于单独表空间的数据文件 如果要改变属于某一个表空间的数据文件的名称和位置, 则可以按照如下步骤进行。 (1 ) 将包含数据文件的表空间设置为脱机状态。 将表空间设置为脱机状态是为了关闭该表空间所有的数据文件。 SQL> alter tablespace userθl offline normal; 表空间已更改。

(2 ) 在操作系统中重新命名或移动数据文件。 (3) 在 ALTER TABLESPACE语句中使用RENAME F IL E 子句, 在数据库内部修改 数据文件的名称。 例 如 , 在 操 作 系 统 中 将 数 据 文 件 U S E R 0 1 0 1 .D B F 和 U SER01_02.D BF从 D:\ORACLEDATA\目录移动至∣ J E:\ORADATA\ORCL\目录下,则可以使用如下语句在数据 库内部修改数据文件的位置。

302

SQL> 2 3 4 5 6 7

alter database rename file , d:\oracledata\user01_01.dbf , r , d: \oracledata\user01__02 .dbf , to , e:\oradata\orcl\user01_01.dbf , , 'e:\oradata\orcl\user01_02.dbf , ;

数据库已更改∙

-

:

T O 子句后指定的数据文件必须已经存在,ALTER DATABASE语句实际上不会创建 这些数据文件。另外,语句必须提供完整的文件路径和名称并指向正确的操作系统文件。

(4 ) 重新将表空间设置为联机状态。 SQL> alter tablespace userθl online; 表空间已更改。

可以通过查询D BA _D ATA_FILES数据字典视图,以显示数据文件的准确路径和名 称 。例如: SQL> SQL> 2 3

col file_name format a60 select file_name,file_id from dba_data_files where tablespace_name= ,USER01 1 ;

FILE_NAME

FILE_ID

E:\ORADATA\ORCL\USER01_01.DBF E:\ORADATA\ORCL\USER01 02.DBF

11 16

管理表空间和数 据文件------------- -

第 12 章

2 . 改变属于多个表 空间的数据文件 如果要改变名称 和位置的数据文 件分别属于不同 的表空间,则可 以按照如下步骤 进 行修改。 ( 1 ) 关闭数据库。 (2 ) 在操作系统中,将要改动的数据 文件复制到新的 位置,或者改变 它们的名称。 (3 ) 启动实例,加载 数据库。 ( 4 ) 在 ALTER DATABASE语 句中使用RENA ME F IL E 子句,在数据库 内部修改数 据文件的名称。 ( 5 ) 使用如下语句打 开数据库。 alter database open;

3

管 理 U N D O 表空间

U N D O 表空间用于存放 U N D O 数据。当 执 行 D M L 操 作 时 (INSERT、UPD ATE和 DELETE), O racle会将这些操 作的旧数据写入 到U N D O 段 。在 Oracle 9 i 前 ,管 理 UNDO 段是使用回退段 完成的。从 Oracle 9 i 开始,管 理 U N D O 数据不仅可以使 用回退段,还 可以使用 U N D O 表空间。因为管 理回退段比较复 杂,所 以 Oracle 1 1 g 已经完全弃用回退 段 ,并且使 用 U N D O 表空间来管理U N D O 数据。

•'r- _-_1_ 2 __._4_1____U_N_D __O_ _概 __述 _ _/-、 U N D O 数据也称为回退 数据,它用于确 保数据的一致性 。当 执 行 D M L 操作时,事 务操作前的数据 将被称为U N D O 记录。U N D O 段用于保存事务 所修改数据的旧 值,其中 存储着被修改数 据块的位置以及 修改前的数据。因为使用回退段 管理U N D O 数据比较复 杂 ,所 以 在 Oracle 11g中, 已经完全弃用了 回退段,并 且 D B A 可以使 用 U N D O 表空间 实现回退段所能 实现的所有功能 。通过 使 用 U N DO表空间,可 以实现回退事务 、确保事 务的读一致性和 事务恢复等功能 。 □ 回退事务 当用户执行D M L 操作修改数据时 ,U N D O 数据被存放到U N DO段 ,而新数据则被 存储在数据段中 。如果事务操作 存在问题,就需 要回退事务,以 取消事务变化。例 如 , 当要撤销事务对 数据表的修改时 ,可 以 使 用 ROLLBACK语 句回退该事务,这 时 Oracle 会 将 U N D O 段中相应的数据 写回到数据段中 。 □ 读一致性 用户检索数据库 数据时,O racle总是使用 户只能看到被提 交的数据,或者特定时间 点的数据,这样 可以确保数据的 一致性。读一致 性是由O ra c le自动提供的,并且该特征 通 过 U N D O 记录实现。例如 ,当 用 户 A 更 新 E M P 表时,U N D O 记录会被保存到 回退段 中,而新数据则 会存放到E M P 段中;假设此时 该事务未提交,并 且 用 户 B 要 查 询 EMP 表中的数据,而 该数据正是从U N D O 记录中取得的。 □ 事务恢复 事务恢复是实例 恢复的一部分,它 是 由 O racle自动完成的 。如果在数据库 运行过程

303

- --------------------- Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 中出现实例故障 ,那么当启动O racle时,后 台 进 程 SM ON会自动执行 实例恢复。执行实 例恢复时,O racle会重做所有 未应用的记录。然后打开数据库 ,回退未提交事 务。

常 用 的 UNDO 参 数 包 括 UNDO MANAGEMEN T、 UNDO_TABLESPACE 和 UNDO_RETEN TIONo其中,U NDO_MANAG EMENT参数用 于指定U N D O 数据的管理 方式。如果要使 用自动管理模式 ,必须设置该参 数为AUTO;如 果使用手动管理 模式, 必须设置该参数 为MANUAL„

因 为 SY STEM 回退段只能用于维 护SYSTEM 表空间上的事务操 作,所以该情况属 于异 常情况。在实际的 应用中,如 果 使 用 自 动 U N D O 管理模式,必 须 建 立 U N D O 表 空 间。

304

初始化参数UN DO_TABLESPA CE用于指定实 例所要使用的U N D O 表空间。使用自 动 U N D O 管理模式时,通 过配置该参数可 以指定实例所要 使用的U N D O 表空间。但是 一定要注意,设 置初始化参数U NDO_TABLES PACE时,必 须 确 保 U N D O 表空间已经存 在 ,否则将导致实 例启动失败。 UNDO_RETEN TION参 数 用 于 控 制 U N D O 数据的最大保留 时间,其 默 认 值 为 900 秒 。在 Oracle 11g中,系统会 自动收集相关的 统计数据,并估 算出所需要的撤 销能力, 然后进行自动调 节撤销空间。用 户也可以通过设 置参数UNDO_ RETENTION,为撤销表 空间设置保留撤 销记录时间的一 个底线值。这样系统就能够 在U N D O 表空间有足够空 间 的情况下,保留 撤销记录设置的 时间;而 当 U N D O 表空间不足时,系统相应地就保 留较 短的时间。 通 过 SHOW PARAMETER UNDO命令,可 以查询系统的U N DO参数设置状态情况, 具体如下: SQL> show parameter undo; NAME

TYPE

VALUE

undo_ management undo_ retention undo tablespace

string integer string

AUTO 900 UNDOTBS1

12.4.3

建 立 UNDO 表空间

使 用 自 动 U N D O 管理模式时,必 须建立并配置U N D O 表空间。建立数 据库后,还 可 以 使 用 CREATE UNDO TABLESPACE语 句 建 立 U N D O 表空间。需要注 意,U N D O 表 空间专门用于存 放U N D O 数据,并 且 在 U N D O 表空间上不能建 立任何数据对象 。 例如,下面的语 句将创建一个名 为UNDOTBS0 2的撤销表空间 。 SQL> create undo tablespace undotbs02 2 datafile 'd:\oracledat a\undotbs02_0 1.dbf' 3 autoextend on;

size 5m

管理表空间和数 据文件

表空间已创建。

为了进一步减 少在自动撤销 管理方式下D B A 的维护工作,可以将撤销表空间 的数 据文件设置为自 动增长方式。

. 与普通表空间一 样, 可以通过ALTER TABLESPACE语句对UNDO 表空间进行修改 。 但 是 UN DO表空间的大 部分设置都由O racle本身自动进 行管理,用户对 撤销表空间可以 执行的操作主要 包括以下几个。 □ 添加新的数据文 件。 □ 移动数据文件。 □ 修改数据文件 的OFFLINE和 ONLINE状态。 如果需要为U N D O 表空间增加更多 的存储空间,那么可以通过添 加新的数据文件 或 修改已存在的数 据文件的大小为 它增加存储空间 。 例如,下面的语 句为撤销表空 间UNDOTBS1 添加了一个新的 数据文件。 SQL> alter tablespace undotbsl 2 add datafile 'd:\oracledata\undotbs01_02.dbf' size 100m 3 autoextend on 4 next lm 5 maxsize unlimited; 表空间已更改。

也可以使用ALTER DATABASE语 句来修改撤销表 空间UNDOTB S01已有的数据文 件的大小,例如 : SQL> alter database 2 datafile , d:∖app∖Administrato r∖oradata∖orcl∖undotbs01.db f , 3 resize 500m; 数据库已更改。

在 数 据 库 的 运 行 过 程 中 , 可 以 切 换 使 用 另 一 个 撤 销 表 空 间 。 由于 U N D O JA B L ESPA C E是一个动态初 始化参数,所 以 可以通过ALTER SYSTEM 语句在 实例运行过程 中改变它的值 ,这样无须重新 启动数据库就 可以改变其所使 用的撤销表 空间。 例如,下面的语 句可以将数据库 所使用的撤销表 空间切换为UNDOTBS02o SQL> alter system set undo_tablespace = undotbs02; 系统已更改。 SQL> show parameter undo; NAME TYPE

VALUE

305

Oracle 1 1g中文版数据库管理、应用与开发标 准教程

undo_management undo_retention undo tablespace

string integer string

AUTO 900 UNDOTBS02

如果指定的表空间不是U N D O 表空间,或 者 指 定 的 U N D O 表空间正在被其他实例 使用,则进行切换时将产生错误。 在 成 功 切 换 U N D O 表空间后,任何新开始的事务都将在 新的U N D O 表空间中存放 撤销记录。但是在旧的撤销表空间中 可能还存储撤销记录,这是因为当前事 务仍然使用 旧 的 U N D O 表空间。这将持续到当该事务全部结 束之后,才 会 使用新的U N D O 撤销表 空间。

φ -- 12.4.6

设 置 UNDO记录保留的时间)

当一个事务成功提交后,它 的 U N DO记录将被标记为失效。U N D O 表空间也是以循 环方式写入的,在新事务开始时可能 会覆盖已经失效的U N D O 记录。因此,在执行某些 耗时较长的查询时,可能会由于查询 所需要的U N D O 记录被覆盖而出现错误,这种由于 U N D O 记录被覆盖而产生的错误称为“快照太旧”错误。如果出现了这种错 误,在自动

306

管理方式下,D B A 可以通过设置初始化参数UNDO_RE TENTION显式地指定U N D O 记 录的保留时间。 UNDO_EtETENTION参数也是一个动 态参数,在实例运行过程中可以通过 ALTER SYSTEM语句来修改。注 意 ,撤销记录的保留时间以秒为单位。例 如,下面的语句设置 保留的时间为3 0 分钟。 SQL> alter system set undo_retention = 1800; 系统已更改。 SQL> show parameter undo; NAME

TYPE

VALUE

undo_management undo_retention undo tablespace

string integer string

AUTO 1800 UNDOTBS02

该参数被修改后将立即生效。但是有一点需要注意,U N D O 记 录 在 U N DO表空间中 保留的时间并不一定会大于UNDO_R ETENTION参数所指定的时间,如果新的事务开始 时 ,U N D O 表空间已经被写满,则 新 事 务 的 U N D O 记录仍然会覆盖已经提交事务的 U N D O 记录。因此,如 果 设 置 的 UNDO RETENTION参数较大,那 么 必 须 保 证 UNDO 表空间具有足够的存储空间。

与普通表空间一样,利 用 DROP TABLESPACE语句可以删除U N D O 表空间。例如, 下面的语句将删除撤销表空间UNDOTBS01 = SQL> drop tablespace undotbsOl; 表空间已删除。

管理表空间和 数据文件 只 有 在 U N D O 表空间未被 数据库使用时 才能被删除它 。此外,如 果 在 U N D O 表空 间中包含有 任何未决定 事务的UN DO记录,则 不能使用DR OP TABLESPA CE语句删除 该撤销表空 间。 此外,即使 成功地使用 DROP TABLESPA CE语句删除了 U N D O 表空间,在被删除 的 U N D O 表空间中也 有可能包含 有未过期的 失效U N D O 记录。这时有 可能会丢失某 些 复杂查询所 需的U N D O 记录,从 而 导 致 产 生 “快照太旧”错 误。 在 利 用 DROP TABLESPA CE语 句 删 除 U N D O 表空间时 也可 以指 定INCLUDING CONTENTS AND DATAFILES子句,同时 删除U N D O 表空间中的内 容和对应的操 作系 统数据文件 。

由 于 U N D O 表空间的重 要性,O racle专门提 供了几个包 含U N D O 表空间信息的 数 据字典视图和 动态性能视 图,如 表 12-3所示。 驾

表 12-3

1包 包 含 U N D O 表空间的视图

视图 V$UNDOSTAT

说明 包 含 法 看 U N D O 表空间而统计 看息,用 于 对 U N D O 表空间进行后 视和 调整;D B A 可以利用这个 视图来估算U N D O 表空间所需的 大小,Oracle 则利用这个视 图来完成U N D O 表空间的自动 管理

V$ROLLSTAT

在 自 动 U N D O 管理方式下,可以利用该视 图来查询关于 U N D O 表空间 中 各 个 U N D O 段的信息

V$TRANSACT ION

包含关于各个 事务所使用的 U N D O 段信息 通过该视图可 以查询U N D O 表空间中每个 区所对应的事 务的提交时间

DBA_UNDO_EXTENTS

其中,最重要的是 V$UNDOST AT数据字典 视图,D B A 经常会使用 它来监视UNDO 表空间的使 用情况。每 间 隔 1 0 分钟,O racle将会根 据收集到的 U N D O 表空间信息作为 一条记录添加 到该数据字 典中,V$UN DOSTAT数据 字典可以记 录2 4 小时内的撤销 表空 间统计信息。 使 用 自 动 U N D O 管理模式时 ,O racle会 在 U N D O 表空 间 上 自 动 建 立 1 0 个 UNDO 段 。通过查询动 态性能视图 V$RO LLN A M E,可以显示 所有联机U N D O 段的名称;通过 查询动态性 能视图V $R OLLSTAT, 可 以 显 示 U N D O 段的统计信 息;通过对这两个视图 进行连接查 询,可以监 视特定U N D O 段的统计信 息。

B

实验指导

1 . 创建表空间 在 SQL*Plus环 境下创建各 种表空间,并 操作表空间 的状态。 ( 1 ) 创建一个表 空间EXER_ TABSPACE ,该表空间采 用本地化管理 方式,分配的初 始 空 间 为 1 0 M B ,使用空间配 额不受限制 ,对应的数据 文件名为∙TE STJΓBS01.D BF0 create tablespace exer_tabspace datafile , d:\oracle_data\test tbsθl.dbf' size 10m

307

--------------------- Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程 autoextend on extent management local;

( 2 ) 查看创建的表 空间信息。 select tablespace_ name z initial_extent,next_extent, extent_mana gement,allocation_type from dba_tablesp aces;

( 3 ) 创建本地化管 理的临时表空 间T E M P 0 2 ,分配的初始 大小为2 0 M B ,对应的临 时文件名为T EM P_TBS02.D BF,表空间的 最大配额为100MB,, create temporary tablespace temp02 tempfile , d:\oracle_d ata\temp_tb s02.dbf , size 20m reuse autoextend on maxsize 100m extent management local;

(4 ) 查看创建的临 时表空间参数 信息。 select * from v$tempfile;

308

( 5 ) 创 建 大 文 件 表 空 间 , 表 空 间 名 为 BIGFILE_TBS , BIG_FILE_T BS01.DBF,数 据文件的初始 大小为5MB

数据文件名为

o

create bigfile tablespace bigfile_tbs datafile 'd:\oracle data\big file_tbs01.dbf' size 5m;

( 6 ) 创建撤销表空 间U N D O 2 ,数据文件为U NDO_TBSO1 .DBF。 create undo tablespace undo2 datafile , d:\oracle_d ata\undo_tb s01.d bf , size 50m autoextend on extent management local;

( 7 ) 立即修改表空 间EXERJΓAB SPACE为脱机 状态。 alter tablespace exer_tabspace offline immediate;

( 8 ) 为表空间EXE R_TABSPAC E增加数据文 件。 alter tablespace exer_tabspace add datafile

, d :\oracle_da

ta\exer_tabspace02.dbf , size 20m;

( 9 ) 修改新增加的 数据文件为脱 机状态。 alter database datafile 'd:\oracle_data\exer_tabspace02.dbf' offline;

期思考与练习



一、填空题 1.表 空 间 的 管 理 类 型 可 以 分 为 。

2 . 在 Oracle的早期的版本中,对撤销信息









用 , 从 Oracle 9 i 后采用 方式管理撤销信息。



12 π⅛^ 早

管理表空间和数据文件 3 . 一个











、 联机

(ONLINE) 、只 读 ( READ ONLY)、

A . 该表空间处于联机状态

状态。

B . 该表空间处于脱机状态 C . 该表空间处于只读状态

4 . 在 创 建 U N D O 表 空 间 时 ,所 使用的表空 间









只允许使用



, 并且盘区的管理方式

方式。

D . 该 表 空 间 非 空 , 即 包含数据库对象 5

5 . 在 创 建 本 地 化 管 理 临 时 表 空 间 时 ,不得

. 在设置撤销表空间的自动管理功能时,

D B A 通过使用相关的初始化参数对自动撤销表

指 定 盘 区 的 管 理 方 式 为 , 临时表空间

空 间 进 行 配 置 。在 下 面 的 4 个 参 数 中 ,哪一个不

的盘区管理 统 一 使 用

是与自动撤销管理功能相关的参数? (



方式。

二 、填空题

A.

UNDO_MANAGEMENT

1 . 哪一个表空间不能切换为脱机状态?

B.

UNDO_TABLESPACE



C.

UNDO_RETENTION

D.

TRANSACTIONS

A . 临 时 表 空 间 TEMP B . 用 户 表 空 间 USER

6



. 在 设 置 自 动 撤 销 管 理 时 ,下 列 哪 一 个 参

C . 索 引 表 空 间 INDEX

数 用 于 设 置 所 使 用 的 撤 销 表 空 间 ?哪 一 个 参 数 设

D . 系 统 表 空 间 SYSTEM

置撤销数据的保留时间? (

2 . 下 列 关 于 脱 机 表 空 间 的 描 述 中 ,哪一项 是正确的? (



A . 任何表空间都可以被置为脱机状态 B . 可 以 利 用 ALTER DATABASE 语句 将脱机表空间恢复为联机状态

C . 在 将 表 空 间 设 置 为 脱 机 状 态 时 ,属

7

A.

UNDO_MANAGEMENT

B.

UNDO_TABLESPACE

C.

UNDO_RETENTION

D.

ROLLBACK_SEGMENTS

. 在只读表空间中可以执行以下哪些操

作? (



于该表空间的数据文件仍然处于联

A.

CREATE TABLE

机状态

B.

ALTER TABLE

D . 如 果 将 表 空 间 设 置 为 脱 机 状 态 ,在

C.

INSERT

下 一 次 启 动 数 据 库 时 ,不 会 对 该 表

D.

SELECT

空间的数据文件的可用性进行检查

3 . 假 设 某 个 表 空 间 只 具 有 一 个 大 小 100MB

8

. 在 以 下 哪 些 表 空 间 中 不 能 执 行 CREATE

TABLE 操 作 ? (



的 数 据 文 件 ,现 在 需 要 将 该 数 据 文 件 的 大 小 修 改

A.

为 1 0 M B ,下 列 操 作 方 法 中 哪 一 项 是 正 确 的 ?

B.

U N D O 表空间



C.

EXAM PLE 表空间

D.

U SER S 表空间



A . 删除数据文件后再重建它 B . 使 用 带 有 R E S IZ E 子 句 的 ALTER DATABASE DATAFILE 语句 C . 在 ALTER DATABASE DATAFILE 语 句 中 使 用 S ize 子句

D . 将 数 据 文 件 的 AUTOEXTENT 参数



SYSTEM 表空间

三 、选择题

1 . 简要介绍什么是自动撤销管理以及自动 撤销管理有哪些好处。

2 . 简要介绍本地化管理方式表空间中对段 和盘区的管理方式。

设 置 为 T R U E , 这样数 据 文 件 会 自

3. 什 么 是 大 文 件 表 空 间 ?

动逐渐 缩 减

4. 如 何 创 建 非 标 准 数 据 块 表 空 间 ?

4 . D BA 在使用下面的语句删除表空间时返 回了错误信息,

5. 将 表 空 间 转 变 为 只 读 状 态 ,然 后 检 测 以 、 下操作。 □ 在该表空间上创建表TL

DROP TABLESPACE USER02;

□ 在 T1表插入新数据。 □ 查 询 T 1表中的数据。

导致错误的原因可能是下列哪一项?

□ 删 除 T1表。

309

第 13章 用 户 权 限 与 安 全 当储户到银行存款、取 款时,出于安全方面的 考虑,储户必须提供账 号和密码,只 有账号和密码正确时才 能取款。同样,当 访 问 O racle数据库时,为了确 保数据库的安全 性 ,用户也必须提供用户 名和密码,然后才能连 接到数据库。另外,为了防止合法用户 的非法访问,O racle提供了权限、角 色机制, 以防止用户对数据库进 行非法操作。所有 这些,共同构成了 O racle数据库的安全机 制。 本章将详细介绍管理数 据库用户的方法, 以及如何向用户授予权 限、限制用户的非 法访问。 本章学习要点: 用户与模式

>

PROFILE资源保护

创建用户

>

管理系统权限

修改用户

>

管理对象权限

管理用户会话

>

预定义角色

资源配置文件PROFILE PROFILE密码保护

>

管理自定义角色

13.1) 用户和模式 O racle数据库的安全保 护流程可以分为3 个步骤。首先,用户向 数据库提供身份识 别信息,即提供一个数 据库账号。接下来用户 还需要证明他们所给出 的身份识别信息是 有效的,这是通过输入 密码来实现的,用户输 入的密码经过数据库的 核对确认用户提供 的密码是否正确。最后 ,假设密码是正确的,那么数据库认为身份识 别信息是可信赖的。 此时,数据库将会在基 于身份识别信息的基础 上确定用户所拥有的权 限,即用户可以对 数据库执行什么操作。因此,为了确保数据库 的安全,首要的问题就 是对用户进行管理。 这里所说的用户并不是 数据库的操作人员,而 是定义在数据库中的一 个名称,更准 确地说它是账户,只是 习惯上称其为用户。它 是 O racle数据库的基本访 问控制机制,当 连 接 到 O racle数据库时,操作 人员必须提供正确的用 户名和密码。 连接到数据库的用户所 具有权限是不同的。O ra c le 提 供 了 一 些 特 权 用 户 (SYSDBA 或 SYSOPER), 这类用户主要用于执行 数据库的维护操作,如启动数据库、关闭数据库、 建立数据库,以及执行备份和恢复等 操作。SYSDBA和 SYSOPER的区别在于 :SYSDBA 不 仅 具 备 SYSOPER的所有权限 ,而且还可以建立数据 库, 执行不完全恢复。 在 Oracle 11g 中,O racle提供了默认的特 权用户S Y S ,当以特权用户身份登 录数据库时,必 须 带 有 AS SYSDBA 或 AS SYSOPER 选 项 。例如: SQL> conn ∕as sysdba 已连接。 SQL> grant sysdba to system; 授权成功。 SQL> conn system/password as sysdba

用户权限与安全 已连接。

与 用 户 密 切 关 联 的 另 一 个 概 念 是 模 式 ,模 式 也 称 为 方 案 (Schema) 。模式或方案实 际 上 是 用 户 所 拥 有 的数 据 库 对 象 的 集合 。在 O racle 数 据 库 中 ,对 象 是 以 用 户 来 组 织 的 , 用 户与 模 式 是 一一对 应 的 关 系 ,并 且 两 者 名 称 相 同 。 如 图 1 3 -1 所 示 ,SY STEM 用 户 拥 有 的 所 有 对 象 都 属 于 SY STEM 模 式 ,而 SCOTT 用 户 拥 有 的 所 有 对 象 都 属 于 S C O T T 模 式 。 当 访 问 数 据 库 对 象 时 ,需 要 注 意 如 下 一 些 事项。 □ 在 同 一 个 模 式 中 不 能 存 在 同 名 对 象 ,但 是 不 同 模 式 中 的 对 象 名 称 则 可 以 相 同 。 □ 用 户 可 以直接访问其他模式 对 象 ,但如果要访 问 其 他 模 式对 象,则 必 须 具 有 对 象 权 限 。例 如 ,用 户 S C O T T 可以直接查 询 其 模 式 中 的 E M P 表 ,但如 果 用 户 H R 要 查 询 SC O T T 模 式 中 的 E M P 表 时 ,则必须在

E M P 表 上 具 有 SE L E C T 对象 权限。 □

311

当用户要访问其他模式对象 时 ,必 须 附 加 模 式名 作 为 前 缀 。



13-1

用户与模式

1岁 管 理 用 户 O racle 数 据 库提 供 了 对 用 户 非 常 有 效 的 管 理 方 式 。管理员可以对用户 账户设置各种 安 全 参 数 , 以 防 止 授 权用 户 、非 授 权 用 户 对 数 据 库 进 行 非 法 访 问 。可以设置的安全参 数 主要包括用户名/口令 、用户默认表空间、用户临时表空间、空间存取限额和用户 配置文件。

φ -- 1 3 . 2 . 1 创建用户 创 建 一 个 新 的 数 据 库 用 户 是 使 用 CREATE U SE R 语 句 完 成 的 ,该 语 句 一 般 是 由 DBA 用 户 来 执 行 ;如果 要 以 其 他 用 户 身 份 创 建 用 户 ,则 要 求 用 户 必 须 具 有 CREATE U S E R 系 统权限。 每 个 用 户 在 连 接 到 数 据 库 时 ,都 需 要 进 行 身 份 验 证 。身份验证可以通过 操作系统进 行 ,也 可 以 通 过 数 据 库 进 行 ,或 者 通 过 独 立 的 网 络 服 务 器 进 行 。数据库验证是指使 用数 据 库 来 检 查 用 户 、密 码 以 及 连 接 用 户 的 身 份 ,该 方 式 也 是 最 常 用 的 用 户 验 证 方 式 ,因此 本 书 重 点 介 绍 数 据 库 验 证 方 式 。采 用 数 据 库 验 证 具 有 如 下 优 点 。 □

用 户账 号 及 其 身 份 验 证 全 部 由 数 据 库 控 制 ,不 需要 借 助 数 据 库 外 的 任 何 控 制 。



使 用 数 据 库 验 证 时 , O ra c le 提 供 了 严 格 的 密 码 管 理 机 制 ,加 强 了 密 码 的 安 全性。

如 果 使 用 数 据 库 验 证 ,则创 建 用 户 时 必须 提 供 连 接 密 码 ,并且密码必须是单 字节字 符 。例 如 ,下 面 的 语 句 创 建 了 一 个 用 户 D E V E L O PE R , 并 为 该 用 户 指 定 了 登 录 密 码 、默 认 表 空 间 、临 时 表 空 间 。

Oracle 11g中文版数据库 管理、应用与开发 标准教程

SQL> connect system/password 已连接。 SQL> create user developer identified by developer 2 4

default tablespace userθl quota 10m on userθl

5

temporary tablespace temp;

3

用户已创建。

上面的语句创建 了一个名为DEV ELOPER的用户。其中,子 句 IDENTIFIED B Y 指 定用户密码,该 密码是用户的初 始密码,在用户 登录到数据库后 可以对其进行修 改。 DEFAULT TABLESPACE子 句为用户指定默认 表空间,这 样 在 建 立 数据 库 对 象(表 、索 引和簇)时,如 果 不 指 定 TABLESPACE子 句,O racle会自动在默 认表空间中为这些 对 象分配空间。TEMPORARY TABLESPACE子 句用于为用户指定 临时表空间,当用户所 执 行 的 S Q L 语句需要进行排序 操作时,若临时数 据的大小超过P G A 工作区,则会在该 表空间上建立临时 段。Q U O T A 子句为用户指定表 空间配额,即用户 对象在表空间中可 占用的最大空间。

312 使 用 过 Oracle 1 0 g以及早期版本的用 户需要注意,1 1 g 中的用户密码是区分 大小写的。

在创建用户时需要 注意,O racle不允许使用 其他类型的表空间 作为临时表空间, 同 样 ,也不允许使用临 时表空间作为默认 表空间。否则会出 现如下错误: SQL> create user developer02 identified by developer 2 3

default tablespace USER01

4

quota 128m on users

5

temporary tablespace USERS;

create user atg02 * 第 1 行出现错误: ORA-10615: Invalid tablespace type for temporary tablespace

在创建用户时,还 可 以 增 加 PASSWORD E X PIR E子句,这可以强 制用户在每一次 登录数据库后必须 修改密码。例如: SQL> create user developer02 identified by developer 2 4

default tablespace USER01 quota 128m on users

5

temporary tablespace TEMP

6

password expire;

3

用户已创建。

第 13 ⅛ 用户权限与 安全--------------- 章

j-

SQL> connect deve1oper02 ∕deve1oper ERROR: ORA-28001: the password has expired

更 改 developer0 2 的口令 新口令: 重新键入新口 令:

在 执 行 CREATE U SE R 创建用户后,需要注意如下 事项。 □ 初始建立的用 户没有任何权 限,不能执行 任何数据库操 作。

□ 如 果建立用户时 不指定TEMPORARY TABLESPA CE子句,O racle会将数据库 默认的临时表 空间作为用户 的临时表空间 。 □ 如果建立用户 时不指定DEFAULT TABLESPAC E子句, O racle会 将 USERS表空 间作为用户的 默认表空间。 □ 如果建立用户 时没有为表空 间指定Q U O T A 子句,则用户 在特定表空间 上的配 额 为 0 , 用户将不能在 相应表空间上 建立数据对象 。 因为初始建立 的用户没有任 何权限,所以 为了使用户可 以连接到数据 库,必须授予 其 CREATE SESSIO N权限。当采 用数据库验证 方式时,必须 通过用户名和 密码连接到 数据库。例如 : SQL> connect developer/developer ERROR: ORA-01045: user DEVELOPER lacks CREATE SESSION privilege; logon denied 警 告 :您 不 再 连 接 到 ORACLE。 SQL> connect system/admin 已连接。 SQL> grant create session,create table to developer; 授权成功。 SQL> conn deve1oper∕d eve1oper; 已连接。

当要在表空间 上建立数据对 象时,用户必须具有 相应的空间配 额,或 者 UNLIMITED TABLESPA CE系统权限 。建 立 DEVELOPE R用户时,由 于没有为其在 USER03表空间 上指定空间配 额,所 以该用户在 USER03表空 间上的空间配 额为0 , 即该用户不能使用 USER03表空 间。例如: SQL> create table test2(col int) tablespace user03; create table test2(col int) tablespace user03 * 第 1 行出现错误: ORA-01950: 对 表 空 间 ,USER03 , 无权限

这里有一个技 巧,如果要收 回某用户创建 数据库对象的 权限,可以通 过修改其所有 表空间中的 配额为。来实 现,这样用户 已经创建的数 据库对象仍然 被保留,但是 无法再 创建新的数据 库对象。

313

-O ra c le 1 1 g 中文版数据库管理、应用与开发 标准教程

φ -- 1 3 . 2 . 2 修 改 用 户 • 在创建用户后,还允许对其进行修改,修改用户信息是使用ALTER U SER命令完成 的。一般情况下,该 命 令 是 由 D B A 执行的,如果要以其他用户身份 修改用户信息,则 必须 具 有 ALTER U SE R 系统权限。对用户的修改包括:登录密码、用户默认表空间、临 时表空间、磁盘的限额等。

用户名是不可以修改的,除非删除后 重建。

1 . 修改密码 为了防止其他人员窃取用户密码 ,并以该用户的身份连接到数据 库执行非法操作, D B A 或用户应该定期改变用户密码。需要注意,普通用户可以执行ALTER U SE R 修改 其自身密码,而 D B A 用户可以执行该命令修改任何用 户的密码。下面的语句将修改 DEVELOPER用户的密码。

314

SQL> connect developer/developer; 已连接。 SQL> alter user developer identified by developer; 用户已更改。

2 .修改表空间配额 表空间配额用于限制用户对象在 表空间上可占用的最大空间。如 果用户对象已经占 据了表空间配额所允许的最大空 间,将不能在该表空间上为用户 对象分配新的空间。此 时如果执行了涉及空间分配的S Q L 操作,将会显示如下错误信息: ORA-01536:space quota exceeded for tablespace

, USERS

当用户耗尽了空间配额时,为了 使用户操作可以继续进行,必 须 由 D B A 为其分配 更多配额。示例如下: SQL> connect system/password 已连接。 SQL> alter user developer quota 10 on userOl; 用户已更改。

3

. 锁定用户账户

为了禁止特定的数据库用户访 问数据库,D B A 可 以 锁 定 用 户 账 户 。下面以锁定 DEVELOPER为例,说明如何使 用ATLER U SER命令锁定用户账户 。 SQL> alter user developer account lock; 用户已更改。

锁 定 用 户 DEVELOPER后 ,该用户将无法访问数据库。此 时如果以该用户账户的身 份连接到数据库,将会显示如下 错误信息: SQL> conn deve1oper∕deve1oper

用户权限与安全 ERROR: ORA-28000: the account is locked

4 . 解锁用户账户 为了使数据库用户 可以访问数据库,D B A 可以解锁用户账户 。下面的语句将解 锁 DEVELOPER用户 账户。 SQL> alter user developer account unlock; 用户已更改。 SQL> conn deve1ope r∕deve1ope r; 已连接。

5

.修改用户的默认 表空间

用户的默认表空间 也可以通过ALTER U SE R 语句来完成。例如 : SQL> alter user developer 2 default tablespace EXAMPLE; 用户已更改。

修改用户的默认表 空间后,先前已经 创建的表仍然存储 在原表空间中。如 果再创建 数据对象,则新创 建的对象将存储在 新的默认表空间中 。 .修改用户的临时 表空间 修改用户的临时表 空间时需要注意,新的临时表空间必 须是专用的临时表 空间,不

6

允许使用其他类型 的表空间。例如: SQL> alter user developer 2 temporary tablespace temp; 用户已更改。

φ -- 1 3 . 2 . 3 删 除 用 户 i 删除一个用户时,系统会将该用户账 号以及用户模式的 信息从数据字典中 删除。用 户被删除后,用户创建的所有数 据库对象也被全部 删除。删除用户可以使用 DROP USER 语句。如果用户当 前正连接到数据库 ,则不能删除该用 户,必须等到该用 户退出系统后 再删除。 另外,如果要删除 的用户模式中包含 有模式对象,则必 须在DROP U SE R 子句中指 定 CASCADE关键字 ,表示在删除用户时 ,也将该用户创建的 模式对象全部删除 。例 如 , 删 除 用 户 S C O T T 时,由于该用户已 经创建了大量的模 式对象,则在删除 该用户时,系 统将自动提示增加 CASCADE选项,否则将返回如下错 误: SQL> drop user scott 2 ∕ drop user scott * 第 1 行出现错误:

315

Oracle 1 1g中文版数据库管理、应 用与开发标准教程 ORA-01922: 必须指定 CASCADE 以 删 除 'SCOTT'

在删除用户账户前,必须仔细 检查该用户是否还有具有使用 价值的模式对象. 一种安全 的做法是为用户加锁,而不是 删除用户。

⑦ 资 源 配 置 PROFILE 访 问 O racle数据库时,必须提供 用户名和密码,然后才能 连接到数据库。为了防止 其他人员窃取用户密码,D B A 必须充分考虑用户密码的 安全性,以防止非法人员连接到 数据库执行非法操作。对 于大型数据库管理系统而 言,数据库用户众多,并且不同用户 担负不同的管理任务,为 了有效地利用服务器资源 ,还应该限制不同用户的 资源占用。

r - 13.3.1

316

PROFILE 概念」

PR O FIL E 作为用户配置文件,它是 密码限制、资源限制的命 名集合。PR O FIL E 文 件 作 为 Oracle安全策略的重要组 成部分,利用它可以对数据 库用户进行基本的资源限 制, 并且可以对用户的密码进 行管理。 在安装数据库时,O racle会自动建立名为DE FAULT的默认配置文件。如果没有为 新创建的用户指定DEFA ULT文件,O racle将自动为它指定DE FAULT配置文件。初始 的 DEFAULT文件没有进行 任何密码和资源限制。使 用 PR O FIL E文件时需要注意如下 事项。 □ 建 立 PROFILE文件时,如果只 设置了部分密码和资源限 制选项,其他选项会自 动使用默认值,即 使 DEFAULT文件中有相应 选项的值。 □ 建立用户时,如果不指定 PROFILE选项,Oracle会 自 动 将 DEFAULT分配给相 应的数据库用户。 □ 一个用户只能分配一个P ROFILE文件。如果要同 时管理用户的密码和资源 ,那 么在建立PROFILE时应该 同时指定密码和资源选项 。 □ 使 用 P R O FIL E 管理密码时,密码管理选 项总是处于被激活状态,但如果使用 PROFILE管理资源,必须要激活资源限制.

φ -- 13.3.2

使 用 PR O FILE管理密码":

当操作人员要连接到O racle数据库时,需要提供 用户名和密码。对于黑客 或某些人 而 言 ,他们可能通过猜想或反 复试验来破解密码。为了 加强密码的安全性,可以使用 PR O FIL E 文件管理密码。PR O FIL E 文件提供了 一些密码管理选项,它们 提供了强大的 密码管理功能,从而确保密码的安全。为了实现密码限制,必须首先建立PROFILE 文件。 建 立 PR O FILE文 件 是 使 用 CREATE PR O FILE语句完成的,一般情 况下,该语句是由 D B A 执 行 的 ,如 果 要 以 其 他 用 户 身 份 建 立 P R O F IL E 文 件 ,则要求该用户必须具有 CREATE PROFILE 系统权限。

第 13 音 * 用户权限与安 全-----------使 用 PR O FILE文件可以 实现如下4 种密码管理:账 户锁定、密码的 过期时间、密 码历史和密码的 复杂度。 1 . 账户锁定 账户的锁定策略 是指用户在连续 输入多少次错误 密码后,O racle会自动锁定用户的 账户,并且可以 规定账户的锁定 时间。O racle为锁定账 户提供了以下两 个参数。 □

该 参 数 限 制 用 户 在 登 录 到 O ra c le 数据库时允 许失败的次数 。一旦某用户尝 试登录数据库的 次数达到该值, 则系统会将该用

FAILED_LOGIN_ATTEMPTS 户账户锁定。

PASSWORD LOCK TIME 用于指定账户被 锁定的天数。 例如,下面创建 的PROFILE文 件设置连续连接 失败次数为3 , 超过该次数后 ,账户 将 被 锁 定 1 0 天 ,并 使 用 ALTER U SER语 句 将 PROFILE文件 分配给用户DE VELOPER □

o

SQL> create profile lock__account limit 2 failed_login_attempts 3 3 password_lock_time 10; , 配置文件已创建 SQL> alter user developer profile lock_account ; 用户已更改。 一

当建立LOCK_ ACCOUNT文件 ,并将该PROF ILE文件分配给 用户DEVELO PER后 , 如果以账户DE VELOPER身份 连接到数据库,并且连续连接 失败3 次后,Oracle将自动 锁定该用户账户 。此时,即使为 用户账户DEV ELOPER提供正 确的密码,也无法连接到 数据库。 在 建 立 LOCK_ACCO UNT文件时, 由 于 指 定 PASSWORD_ LOCK_TIME的参数为 1 0 , 所以账户锁定 天数达到1 0 天后,O racle会自动解 锁账户。如 果 建 立 PROFILE文件 时没有提供该参 数,将自动使用 默认值UNLIM ITED。这种情 况下,需 要 D B A 手动解锁 用户账户。 2 . 密码的过期时间 密码的过期时间 是指强制用户定 期修改自己的密 码,当密码过期 后,O racle会随时 提醒用户修改密 码。密码宽限期 是指用户账户密 码到期之后的宽 限使用时间。默认情况 下 ,建立用户并为 其提供密码之后 ,密码会一直生 效。为了防止其 他人员破解用户账户 的密码,可以强 制普通用户定期 改变密码。为了 加强用户定期改 变密码,O racle提供了 如下参数。 该参数用于设 置用户密码的 有效时间,单 位为天 数 。超过这一段时 间,用户必须重 新设置口令。



PASSWORD_LIFE_TIME



PASSWORD_G RACE_TIME

设 置 口 令 失 效 的 “宽限时间”。如果口令达到

PASSWORD_ LIFE_TIME设 置 的 失 效 时 间 ,设 置 宽 限 时 间 后 ,用户仍然可以 使用。 为了强制用户定 期改变密码,两 者应该同时进行 设置。下 面 创 建 一 个 PR O FIL E 文 件 ,以控制用户的 密码有效期为 1 0 天 ,密码宽限期为 2 天 。 SQL> create profile password_life_time limit 2 password_life time 10

_

317

Oracle 1 1 g 中文版数据库管理、应用与 开发标准教程 3

password_grace_time 2;

配置文件已创建

当 建 立 PASSWORD一LIFEJΠME LIM IT配置文件,并 将 该 PROFILE文件分配给用 户 DEVELOPER后 ,如果 用户 DEVELOPER在 1 0 天之内没有修改密码,则会显示如下 警告信息: ORA-28002:the password will expire within 2 days

如 果 在 第 1 0 天没有修改密码,那 么 在 第 1 1 天 、第 1 2 天连接时,仍然会显示类似 的 警告信息。如 果 第 1 2 天后仍然没有修改密码,那 么 当 第 1 3 天连接时,O racle会强制用 户修改密码,否则不允许 连接到数据库。 3 . 密码历史 密码历史用于控制账户密 码的可重用次数或可重用 时间。使用密码历史参数 后, O racle会将密码修改信息存 放到数据字典中。这样, 当修改密码时,O racle会对新、旧 密码进行比较,以确保用 户不会重用过去已经用过 的密码。关于密码历史有 如下两个 参数。

318



PASSW ORD_REUSE_TIM E指定密码可重用的时间,单位为天。



PASSWORD_REUSE_MAX

设 置 口 令 在 能 够 被 重 新 使 用 之 前 ,必须改变的

次数。 在 使 用 密 码 历 史 选 项 时 ,只 能 使 用 其 中 的 一 个 参 数 , 并 将 另 一 个 参 数 设 置 为 UNLIMITED» 例如,在 下 面 创 建 的 PR O FILE文件中,强制该用户 在密码终止1 0 天之 内不能重用以前的密码。 SQL> create profile password_history limit 2 password_life_time 10 3 password_reuse_time 10 4 password_reuse_max unlimited 5 password_grace_time 2; 配置文件已创建

当 创建PASSWORD_HISTO RY配置文件并将其分配给 用户后,如 果 在 前 1 2 天没有 修改用户密码,那 么 在 第 1 3 天连接数据库时,Oracle会 强制用户修改密码。但是如 果此 时仍然使用过去的密码,则密码修改将不成功。 4 . 密码的复杂度 在 PR O FIL E 文件中,可以通过指定的 函数来强制用户的密码必须 具有一定的复杂 度 。例如,强制用户的密码不 能与用户名相同。使用校验 函数验证用户密码的复杂 度时, 只需要将这个函数的名称 指定给PROFILE文 件 中 的 PASSWORD VERIFY FUNCTION 参数,O racle就会自动使用该函数 对用户的密码内容和格式 进行验证。 在 Oracle 1 1 g 中 ,验 证 密 码 复 杂 度 功 能 具 有 新 的 改 进 。⅛ $ORACLE_HOME/ rdbm s/adm in目录下创建了一个新的 密码验证文件UTLPWDM G.SQL, 其中不仅提供了 先前的验证函数VERIFY _FUNCTION,还提供了一 个新建的VER1FY_FUNCTION」 1G 函数。并且在脚本末尾添加了如下语句:

用户权限与安全 A L T E R PROFILE DEFAULT LIMIT PAS SWORD_ L I F E _ T I M E

180

P A S S W O R D _ G R A C E _ T 工ME 7 PASSWORD _ R E U S E _ T I M E UNLIMITED PAS S W O R D _ R E U S E _ M A X U N L I M I T E D FAIL E D _ L O G I N _ A T T E M P T S

10

PAS SWORD__LOCK_T IME 1 P A S S W O R D _ V E R I F Y _ F U N C T I O N verify_function__llG;

这部分脚本,将该函数附加到配置文件 DEFAULT 中,这样,D B A 只需要运行该脚 本 以 创 建 1 1 g 版的密码检查函数,该脚本将通过将自身附加到默认配置文件中来启用密 码验证功能。在脚本文件中提供了大量的注释,可以打开该脚本查看对密码复杂度的 控制。 需要注意,当使用密码校验函数时,该密码校验函数不仅可以是系统预定义的校验 函数,还可以是自定义的密码校验函数。 自定义校验函数必须符合如下规范: f unct ion__name ( u s e r i d _ p a r a m in varchar2 (30), p a s s w o r d _ p a r a m in v a r c h a r 2 (30) r o 1 d_password._param in varchar2 (30) ) return Boolean

319

其中,USERID_PARAM 用于标识用户名,PASSWORD_PARAM 用于标识用户的新 密码,OLD_PASSWORD_PARAM 用于标识用户的旧密码。如果函数返回值为 TRUE, 则表示新密码可以使用;如果函数返回值为 F A L S E , 则表示新密码不能使用。

如果要禁用密码校验函数, 可以将PASSWORD_VERIFY_FUNCTION参数设置为NULL.

仪- 1 3 .3 .3 使 用 PROFILE 管理资源; 在大而复杂的多用户数据库环境中,因为用户众多,所以系统资源可能会成为影响 性能的主要“瓶 颈 为 了 有 效 地 利 用 系 统 资 源 ,应根据用户所承担任务的不同为其分配 合理的资源。PROFILE 不仅可用于管理用户密码,还可用于管理用户资源。需要注意, 如 果 使 用 PROFILE 管理资源,必 须 将 RESOURCE_LIMIT 参 数 设 置 为 T R U E 以激活资 源限制。由于该参数是动态参数,所以可以使用 ALTER SYSTEM 语句进行修改。 SQL> show p a r a m e t e r resource_limit NAME

TYPE

VALUE

r e s ource_ limit

bool e a n

FALSE

SQL> alter system set resource_limit=true;

系统已更改*



利 用 PROFILE 配置文件,可以对以下系统资源进行限制。

Oracle 11g中文版数据库管理、应用与开发标准教程 □

C P U 时间

为了防止无休止地使用C P U 时间, 限制用户每次调用时使用的CPU

时间以及在一次会话期间所使用的C P U 时间。 □ 逻辑读

为了防止过多使用系统的I/O 操作,限制每次调用及会话时读取的逻辑

数据块数目。 □ 用户的并发会话数 □ 会话空闲的限制当一个 会 话 空 闲 的 时 间 达 到 限 制 值 时 ,当前事务被回滚,会 话被终止并且所占用的资源被释放。 □ 会话可持续的时间如果一个会话的总计连接时间达到该限制值,当前事务被 回滚,会话被终止并释放所占用的资源。 □ 会话所使用的S G A 空间限制 大部分资源限制都可以在两个级别进行:会话级和调用级。会话级资源限制是对用 户在一个会话过程中所使用的资源进行限制;而调用级资源限制是对一个S Q L 语句在执 行过程中所使用的资源进行限制。 当一个会话或S Q L 语句占用的资源超过PROFILE文件中的限制时,O racle将终止 并回退当前的事务,然后向用户返回错误信息。如果受到的限制是会话级的,在提交或 回退事务后用户将话将被终止;而受到调用级限制时,用户会话还能够继续进行,只是 当前执行的S Q L 语句将被终止。

320

下 面 是 PROFILE文件中对各种资源限制的参数。 □

SESSION_PER_USER 用户可以同时连接的会话数量。如果用户的连接数达 到该限制,则再试图登录时将产生一条错误信息。



C P U _P E R _SE SSIO N 限制用户在一次数据库会话期间可以使用的C P U 时间, 单位为百分之一秒。 当达到该时间值后,系统就会终止该会话。如果用户还需 要执行操作,则必须重新建立连接。



CPU_PER_CALL

该参数用于限制每条SQ L语句所能使用的C P U 时间。参数

值是一个整数,单位为百分之一秒。 □

LOGICAL_READS_PER_SESSION限制每个会话所能读取的数据块数量。包 括从内存中读取的数据块和从磁盘中读取的数据块。



LOGICAL_READS_PER_CALL



PRIVATE_SGA



C O N N E C T _T IM E 限制每个用户连接到数据库的最长时间,单位为分钟,当

限制每条SQ L 语句所能读取的数据块数。

在共享服务器模式下, 该参数限定用户的一个会话可以使用的

内 存 S G A 区的大小,单位为数据块。在专用服务器模式下,该参数不起作用。 连接时间超出该设置时,该连接终止。例如,如果 设 置 CO NN ECTJΠ M E为 20 分钟,则当用户连接到数据库2 0 分钟后,无论用户是否在该会话中执行了操作, 系统都会终止该用户的连接。 □

IDLE_TIME

该参数限制每个用户会话连接到数据库的最长时间.超过该空闲

时间的会话,系统会终止该会话。例 如 ,某用户已经登录到数据库并且空闲了 2 0 分钟,如 果 ID L E J IM E 设 置 为 1 5 分钟,则该用户的连接在第1 5 分钟过去 后已经被断开。 □

COMPOSITE_LIMIT 该参数是一项由多个资源限制参数构成的复杂限制参 数 ,利用该参藐可以对所有混合资源限定作用设置。

例如,下面在创建PROFILE文件时,对用户可以访问的系统资源进行如下限制。

用户权限与安全 □ 用户最多只能建立 5 个数据库会话. □ 每个会话持续连接 到数据库的最长时 间为1 6 个小时。 □ 保 持 3 0 分钟的空闲状态后 会话被自动断开。 □ 会话 中 每条 SQ L 语句最多只能读取 1000个数据块。 □ 会 话 中 每 条 SQ L 语 句最 多 占 用 10 0 个单 位的 C P U 时间。 根据上面的资源限 制要求,创 建 PROFILE文件如下 : SQL> create profile resource_limit limit 2 sessions_per_user 5 cpu_per_session unlimited 3 4 cpu_per_call 100 5 connect_time 960 6 idle_time 30 7 logical_reads_per_session unlimited 8 logical__reads_per__call 1000; 配置文件已创建

在 O racle中,PROFIL E文件也是一种数 据资源。D B A 也可以使用相应的 语句对其 进行管理,包括修 改配置文件、删除 配置文件、激活/禁用配置文件。 1 . 修 改 PR O FIL E 文件 在 创 建 PROFILE文件之后 ,还可以使用ALTER PROFILE语句修改 其中的资源参数 和密码参数。例如 ,下面的语句对P ROFILE文 件 的 RESOURCEJLIM ΓΓ进行修改。 SQL> alter profile resource_limit limit 2 cpu_per_session 15000 3

sessions_per_user 5

4

cpu_perecall 500

5

password__life_time 30

6

failed_login_attempts 5;

配置文件已更改

对 配 置 文 件 所 做 的 修 改 只 有 在 用 户 开 始 新 的 会 话 时 才 会 生 效 。另 外 ,如果使用 ALTER P R O F IL E 语 句 对 DEFA U LT配 置 文 件 进 行 了 修 改 ,则所有配置文件 设置为 DEFAULT的用户 都会受到影响。 2 . 删 除 PR O FIL E 文件 使 用 DROP PROFILE语句可以 删除PROFILE文件 。如果要删除的配 置文件已经被 指定给了用户, 则必须 在 DROP PROFILE语句中使 用CASCADE关键 字。 例如,下面的语句 将删除PASSWORD HISTORY配置文 件。 SQL> drop profile password_history; 配置文件已删除。

如果为用户指定的 配置文件被删除,则 O racle将自动为用户 重新指定DEFAUL T配

321

Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 置文件。

∙ -*13.3.5

显示 PROFILE 信息

在 PROFILE文件 被创建后,其信 息被存储在数据 字典中。通过查询这些数据字典, 可以了 解PROFILE文 件的信息。 1 . 显 示 用户 的 PR O FIL E信息 建立或修改用户 时,可以为用户分 配PROFILE文 件。如果没有为用 户分配PROFILE 文件,O racle会 自 动 将 DEFAULT分配 给用户。通过查 询数据字典视 图DBAJUSER S, 可以显示用户 使用的PROFI LE文件。例如 ,下面的语句将 显示用户DEV ELOPER所使 用 的 PROFILE文件 。 SQL> select profile 2 from dba_users 3 where username= , DEVELOPER , ;

2 . 显 示 P R O FIL E 的密码和资源限制信息 建立或修改PR OFILE文件时,Oracle会 将 PROFILE参数 存放到数据字典 中。通过

322

查 询 D B A _PR O FILES,可 以 显 示 PROFILE的密 码限制、资源限 制信息。例如,下面的 语句将显示RE SOURCE_LIM IT文件的密码和 资源限制信息。 SQL> SQL> 2 3

column limit format a20 select resource_name,resource_type,limit from dba_profiles where profile= , RESOURCE_LIM IT , ;

RESOURCE_NAME

RESOURCE

LIMIT

COMPOSITE_LIMIT SESSIONS_PER_USER CPU_PER_SESSION CPU_PER_CALL LOGICAL READS PER SESSION LOGICAL READS PER CALL IDLE_TIME CONNECT__TIME PRIVATE_SGA FAILED_LOGIN_ATTEMPTS PASSWORD_LIFE_TIME PASSWORD_REUSE_TIME PASSWORD__REUSE__MAX PAS SWORD_VERIFY_FUNCTION PAS SWORD_LOCK_TIME PASSWORD GRACE TIME

KERNEL KERNEL KERNEL KERNEL KERNEL KERNEL KERNEL KERNEL KERNEL PASSWORD PASSWORD PASSWORD PASSWORD PASSWORD PASSWORD PASSWORD

DEFAULT 5 15000 500 UNLIMITED 1000 30 960 DEFAULT 5 30 DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT

已选择16行。

从上面的信息可 以看出,用户配 置文件实际上是 对用户使用的资 源进行限制的参 数

用户权限与安全 集 。一般来说,为 了有效地节省系 统硬件资源,在 设置配置文件中 的限制参数时,通常 会 设置SESS1ON_PER_USER和 IDLE√ΠME,以防止多个用户使用同一个用户账户连接, 并限制会话的空 闲时间,而对于 其他限制参数不 进行设置。



管理权限 刚建立的用户没 有任何权限,这 也就意味着该用 户不能执行任何 操作。如果用户要

执行特定的数据 库操作,则必须 具有系统权限;如果用户要访问 其他模式中的对 象,则 必须具有相应的 对象权限。

权 限 (PR IV IL E G E )是指执行 特 定类 型 的S Q L 语句或访问其他 模式对象的权利 。 O racle的权限可以 分成两类:系统 权限和对象权限 。 系统权限是指执 行特定类型SQ L 语句的权利。它用于控制用户 可以执行的一个 或一 组数据库操作,例如,当 用 户具 有 CREATE TABLESPACE权 限时,可以在其模式中创 建表;当用户具 有CREATE ANY TABLE权限时,可以在任何模式 中创建表。系统权限 是针对用户而设 置的,用户必须 被授予相应的系 统权限,才可以 连接到数据库并 进行相 应的操作,如 图 13-2所示。

数据库服务器

图 13-2

一系统权限

对象权限是指在 对象级控制数据 库的存取和使用 的机制,即访问 其他用户模式对 象 的权力。例如,如 果 H R 用 户 要 访 问 SCOTT.EMP表 ,则 必 须 在 SCOTT.EMP表上具有 对象权限。对象 权限一般是针对 用户模式对象的 ,如 图 13-3所示。

SCOTT 数据库服务器

系统权限

用户

C

图 13-3



匚口

一对象权限

此外,O racle数据库还允 许传递权限,即 允许已经具有权 限的用户将其权 限授予其 他用户,从而使 数据的存取更加 灵活。

Oracle 1 1 g 中文版数据库管理 、应用与开发标准 教程

系统权限是指执行 特定类型SQ L 语句的权利。一般情况下,系统权限需要授予 数据 库管理人员和应用 程序开发人员。数 据库管理人员还可 以将系统权限授予 其他用户,并 允许用户将该系统 权限再授予另外的 用户。同时,也可 以将系统权限从被 授权用户中 收回。 1 . 系统权限的分类 O racle提供了 2 0 0 多种系统权限,每 一种系统权限分别 能使用户进行某种 或某一类 特定的操作。数据 字典视图SYSTEM _PRIVILEGE_MA P中包括了 O racle数据库中的所 有系统权限,通过 查询该视图可以了 解系统权限的信息 。 SQL> c o n n e c t s y s te m /p a s s w o rd 已连接。

SQL> s e l e c t c o u n t (*) fro m s y s te m _ p r iv ile g e _ r n a p ; COUNT(*) 206

324

数据库管理员可以 将系统权限授予用 户、角色、PU BLIC公共用户组。一般情况下, 系统权限只能授予 值得信任的用户, 以免系统权限被滥 用,而危及到数据 库的安全性。

P U B L IC 公共用户组是在创建数 据库时被自动创建的用 户组。该用户组有什么 权限,数 据库中所有用户就有什 么权限。可以利用这个 特点,将公共权限授予 数据库中所有的用户。

对于数据库管理员 而言,如果要对数据 库中的对象进行管 理, 所以必须具有如表 13-1 所示的系统权限。 式 ? 表 13-1

, D BA 系 统 权 限 ( 数据库对象管理部分)

系统权限

权限功能

ANALYZE ANY

允许对任何模式中的任 何表、聚簇或者索引执 行分析,查找其中 的迁移记录和链接记录

CREATE ANY CLUSTER

在任何用户模式中创建 聚簇

ALTER ANY CLUSTER

在任何用户模式中更改 聚簇

DROP ANY CLUSTER

在任何用户模式中删除 聚簇

CREATE ANY INDEX

在数据库中任何表上创 建索引

ALTER ANY INDEX

在任何模式中更改索引

DROP ANY INDEX

在任何模式中删除索引

CREATE ANY PROCEDURE

在任何模式中创建过程 、函数和包

ALTER ANY PROCEDURE

在任何模式中更改过程 、函数和包

DROP ANY PROCEDURE

在任何模式中删除过程 、函数或包

EXECUTE ANY PROCEDURE

在任何模式中执行或者 引用过程

GRANT ANY PRIVILEGE

将数据库中任何权限授 予任何用户,这 是 D B A 授予系统权限的 基本要求

用户权限与安 全 .续表 系统权限

权限功能

ALTER ANY ROLE

修改数据库中任 何角色

DROP ANY ROLE

删除数据库中任 何角色

GRANT ANY ROLE CREATE ANY SEQUENCE

允许用户将数据 库中任何角色授 予数据库中其他 用户 在任何模式中创 建序列

ALTER ANY SEQUENCE DROP ANY SEQUENCE

在任何模式中更 改序列 在任何模式中删 除序列

SELECT ANY SEQUENCE

允许使用任何模 式中的序列

CREATE ANY TABLE

在任何模式中创 建表

ALTER ANYTABLE

在任何模式中更 改表

DROP ANY TABLE COMMENT ANY TABLE SELECT ANY TABLE

允许删除任何用 户模式中的表 在任何模式中为 任何表、视图或 者列添加注释 查询任何用户模 式中基本表的记 录

INSERT ANY TABLE UPDATE ANY TABLE

允许向任何用户 模式中的表插入 新记录 允许修改任何用 户模式中表的记 录

DELETE ANY TABLE LOCK ANY TABLE

允许删除任何用 户模式中表的记 录 对任何用户模式 中的表加锁

FLASHBACK ANY TABLE

允许使用AS O F 子句对任何模式 中的表、视 图执行一个S Q L 语 句的闪回查询

CREATE ANY VIEW DROP ANY VIEW

在任何用户模式 中创建视图 在任何用户模式 中删除视图 在任何用户模式 中创建触发器

CREATE ANY TRIGGER ALTER ANY TRIGGER

在任何用户模式 中更改触发器

DROP ANY TRIGGER

在任何用户模式 中删除触发器

ADMINISTER TRIGGER

允 许创 建 ON DATABASE触发 器。在 能 够创 建ON DATABASE 触发器之前,还必 须先拥有CREATE TRIGGER或 CREATE ANY TRIGGER 权限

DATABASE

CREATE ANY SYNONYM DROP ANY SYNONYM

在任何用户模式 中创建专用同义 词 在任何用户模式 中删除同义词

如果数据库管 理员需要对数 据库进行维护 ,则必须具有 如表 13・2所示的系统权 限。 芸

f

表 13-2

. DBA 系 统 权 限 (数据库维护部分 )

系统权限

权限功能

ALTER DATABASE

修改数据库的结 构权限,如打开 数据库、管理日 志文件等

ALTER SYSTEM

修改数据库系统 的初始化参数

DROP PUBLIC SYNONYM

删除公共同义词

CREATE PUBLIC SYNONYM

创建公共同义词

CREATE PROFILE

创建资源配置文件

ALTER PROFILE

更改资源配置文 件

DROP PROFILE

删除资源配置文 件

CREATE ROLE

创建角色

ALTER ROLE

修改角色

DROP ROLE

删除角色

CREATE TABLESPACE

创建表空间

325

Oracle 11g中文版数据库管理、应用与开发标准教程 续表 系统权限

权限功能

ALTER TABLESPACE

修改表空间

DROP TABLESPACE

删除表空间,包括表、索引和表空间的聚簇

MANAGE TABLESPACE

管理表空间,使表空间处于ONLINE (联 机 ) 、OFFLINE ( 脱机) 、 BEGIN BACKUP (开始备份) 、END BACKUP (结束备份)状态

UNLIMITED TABLESPACE

不受配额限制地使用表空间

CREATE SESSION

允许用户连接到数据库

ALTER SESSION

修改用户会话

ALTER RESOURCE COST

更改配置文件中的计算资源消耗的方式

RESTRICTED SESSION

在数据库处于受限会话模式下连接到数据库

CREATE USER

创建用户

ALTER USER

更改用户

BECOME USER

当执行完全装入时,成为另一个用户

DROP USER

删除用户

SYSOPER (系统操作员权限)

STARTUP SHUTDOWN ALTER DATABASE MOUNT/OPEN ALTER DATABASE BACKUP CONTROLFILE ALTER DATABASE BEGIN/END BACKUP

326

ALTER DATABASE ARCHIVELOG RECOVER DATABASE RESTRICTED SESSION CREATE SPFILE/PFILE SYSDBA (系统管理员权限)

SYSOPER的所有权限,并 带 有 WITH ADMIN O PTION子句

SELECT ANY DICTIONARY

允 许 查 询 以 “ DBA_” 开头的数据字典

对于数据库开发人员而言,他们需要创建所有的数据库模式对象,例如,创建基本 表 、视图、同义词等,但是不能修改数据库结构。表 13-3列出了数据库开发人员应具有 的权限。 招

表 13-3

τ数据库开发人员的权限

系统权限

权限功能

CREATE CLUSTER

在自己模式中创建聚簇

DROP CLUSTER

删除自己模式中的聚簇

CREATE PROCEDURE

在自己模式中创建存储过程、函数和包

DROP PROCEDURE

删除自己模式中的存储过程、函数和包

CREATE DATABASE LINK

创建数据库链路权限,通过数据库链路允许用户存取远程的数据库

DROP DATABASE LINK

删除数据库链路

CREATE SYNONYM

创建私有同义词

DROP SYNONYM

删除同义词

CREATE SEQUENCE

创建开发者所需要的序列

CREATE TIGGER

创建触发器的权限

CREATE TABLE

创建表的权限

CREATE VIEW

创建视图的权限

CREATE TYPE

创建对象类型的权限

用户权限与安全

第 13 章

2 . 系统权限的授权 一般情况下,授予系 统 权 限 是 由 D B A 完成的;如果要以其他用户身份授予系统权 限,则要求该用户必须具有GRANT ANY PRIVILEGE系统权限,或在相应系统权限上 具 有 WITH ADMIN OPTION选项。向用户授予权限的GRANT语句的语法如下: grant system_priv [f system_priv,...] to { PUBLIC ∣ role ∣ user }[,{user ∣ role[PUBLIC}]... [with admin option]

其中,SYSTEM_PRIV用于指定系统权限,如果指定多个系统权限,那么各系统权 限之间用逗号隔开;U S E R 用于指定被授权的用户;R O L E 用于指定被授权的角色,如 果要指定多个用户或角色,它们之间用逗号隔开。另 外 ,在授予系统权限时可以附加 WITH ADMIN OPTION选项,使用该选项后,被授权的用户、角色还可以将相应的系统 权限授予其他用户、角色。 例如,以下语句使用G RAN T语句向用户DEVELOPER授 予 CREATE SESSION, CREATE TABLE 和 CREATE VIEW 权限,并且前两个权限使用 WITH ADMIN OPTION 选项。 SQL> grant create session,create table to developer 2 with admin option; 授权成功。 SQL> grant create view to developer; 授权成功。

将系统权限CREATE SESSION授予 用 户 DEVELOPER后 ,该用户将可以登录到数 据库。由于用户DEVELOPER在系统权限CREATE SESSION和 CREATE TABLE上具 有 WITH ADMIN OPTION选项,所以可以将这两个权限授予其他用户。另外,由于在 系统权限CREATE V IEW 上不具备WITH ADMIN OPTION选项, 所以用户DEVELOPER 不 能 将 CREATE V IEW 权限授予其他用户。 3

. 显示系统权限

Oracle提供了一些数据字典,以记录数据库中各种权限信息。表 13-4列出了与系统 权限相关的数据字典视图。 患; 表 1 3 -4

τ 系统权限信息的数据字典视图

数据字典视图

描述

DBA_SYS_PRIVS

包含了数据库管理员拥有的所有系统权限信息

SESSION_PRIVS

包含了当前数据库用户可以使用的权限信息

SYSTEM PRIVILEGE MAP

包含了系统中所有的系统权限信息

如果想查看用户拥有的系统权限,可以查询DBA_SYS_PRIVS数据字典视图。该数 据字典视图的结构如下: SQL> desc dba_sys_privs; 名称 — 一

是否为空?

类型

327

Oracle 1 1 g 中文版数据库 管理、应用与 开发标准教程 GRANTEE PRIVILEGE ADMIN OPTION

NOT NULL NOT NULL

VARCHAR2(30) VARCHAR2(40) VARCHAR2(3)

其中,GRANTEE表 示拥有权限的 用户或角色名 ,PRIVILEGE 表示相应的系统权限, ADMIN_OPTION 表示是否使用 WITH ADMIN OPTION 选项。 如果想了解当 前会话可以使 用的权限,可 以 查 询 SESSION_P RIVS数据字 典视图。 该数据字典视 图仅一列,记 录用户的权限 。例如,以 SYSTEM用 户登录到数据 库后,查 询会话可以使 用的权限如下 : SQL> select * from session_privs; PRIVILEGE ALTER SYSTEM AUDIT SYSTEM CREATE SESSION ALTER SESSION

328

4 . 收回系统权限 一般情况下,收 回系统权限 都是由D B A 完成的,如果 要以其他用户 身份收回系统 权 限 ,要 求 该 用 户 必 须 具 有 相 应 的 系 统 权 限 及 其 转 授 系 统 权 限 ( WITH ADMIN OPTION) o 收回系统权限 是使用REV OKE语句完 成的。 revoke system_priv [r system__pr iv]... from { PUBLIC ∣ role ∣ user }[r {user ∣ role ∣ public}]...

例如,下面的 语句将收回用 户DEVELO PER的创建会 话和创建基本 表的权限。 SQL> revoke create session,create table from developer; 撤销成功。

用户的系统权 限被收回后,经过传递获得 权限的用户不 受影响。例如 ,如 果 用 户 A 将系 统 权限 a 授予了 用户 B , 用 户 B 又将系统权 限a 授予 了 用 户 C 。那么,当删除用户 B 或从用 户B 收回系统权 限a 后 ,用 户 C 仍然保留着系 统权限a , 如 图 13-4所示。

收回权限前



A

Θ

©

收回权限后

C

图 13-4

一系统权限的传递及其收回

用户权限与安全

u:

I 0 . 4τ . 0

¾ ~**∙⅞ι ⅜φ⅜TJ^∣4M 目





4ζ,rτι R总





对象权限指访 问其他用户模 式对象的权利 。在 O racle数据库中 ,用户可以直接访问 其模式对象,但如果要访问 其他用户的模 式对象时,必 须具有相应的 对象权限。 1 . 对象权限的分 类 根据不同的对 象类型,O racle数据库设 置了不同类型 的对象权限。对象权限及对 象 之间的对应关 系如表13-5所 示。 %

表 13-5

一 对 象 、对象权限的对应 关系 ALTER DELETE EXECUTE INDEX INSERT READ

RJEFER. ENCE

SELECT UPDATE

DIRECTORY FUNCTION PROCEDURE



PACKAGE SEQUENCE



TABLE VIEW



√ √



√ √

其 中 ,' w " 表示某种对象 所具有的对象 权限,空格表示 该对象没有某 种权限。例如, 对于基本表 TA BLE,具有 ALTER、DELETE、INDEX, INSERT> REFERENCES . SELECT、 UPDATE权 限 ,而 没 有 EXECUTE权限 。 多种权限组合 在一起时,可以 使用A L L 关键字,表示该 对象的全部权 限,对于不同 的对象,A L L 组合的权限数 量是不相同的 。对 于 表 TA B LE而言,A L L 表 示 ALTER. DELETE. INDEX、INSE RT、REFEREN CES、SELECT> UPDATE 权 限 ;对于存储过程, A L L 只 代 表 EXECUTE权限 。 2 . 授予对象权限 对象权限由该 对象的拥有者 为其他用户授 权,非对象的拥 有者不得向其 他用户授予 对象权限。将 对象权限授出 后,获权用户 可以对对象进 行相应的操作 ,没有授予的权 限 不得操作。从 O racle外 开始,D B A 用户可以将任 何对象权限授 予其他用户。授予对象权 限所使用的G RANT语句的 形式如下: grant { object_priv [ (column__list) ] [z object_priv[ (column_list)]]... ∣ ALL [PRIVILEGES] ON [ schema.]object TO { user ∣ role ∣ PUBLIC} [,{user ∣ role ∣ public)] [with grant option]

其中,OBJECT_PRI V是对象权限,COLUMN_LIST用于标识权 限所对应列的 列表, SCHEMA表示 模式名,U SER 表示被授权的 用户,RO LE表示被授权 的角色。对象权限 不仅可以授予 用户、角色,也可 以授 予 PUBLIC。将对 象权限授予PU B LIC 后 ,会使所 有用户都具有 该对象权限。授予对象权限 时,可 以 带 有 WITH GRANT OPTION选项 , 若使用该选项 ,被授权用户可 以将对象权限 转授给其他用 户。

329

Oracle 1 1 g 中文版数据库管理、应用与开发标准 教程

需要注意,WITH GRANT OPTION选项不能授予角色。

例如,以下的示例向用户DEVELOP ER授 予 了 对 E M P表 的 SELECT权限。 SQL> grant select on scott.emp 2 to developer; 授权成功。 SQL> conn deve1oper∕deve1oper 已连接。 SQL> select ename z job,sal 2 from scott.emp 3 where deptno=10;

330

ENAME

JOB

SAL

MARY ATG CLARK KING MILLER

CLERK CLERK MANAGER PRESIDENT CLERK

1000 1200 2550 5100 1400

在直接授予对象权限时,用户可以访 问对象的所有列。在向用户授予对象 权限时, 还可以控制用户对模式对象列的访问 ,即列权限。需要注意,只 能 在 INSERT、UPDATE 和 REFERENCES上授予列权限。 例如, 将 更 新 S A L 列的权限授予DEVELOPER用户后, 该用户将只能更新S A L 歹U。 SQL> grant update(sal) on scott.emp to developer; 授权成功。 SQL> conn deve1oper∕deve1oper 已连接。 SQL> update scott.emp 2 set sal=sal*l.1 3 where deptno≈10∕ 已更新5 行。

3 . 显示对象权限 授予对象权限时,Oracle会将对象权 限的信息存放到数据字典中。表 13-6列出了与 对象权限相关的数据字典视图。 甥

表 13-6

, 对象权限信息的数据字典视图

∣数据字典视图

描述

DBA_TAB_PRIVS

显示所有用户或角色的对象权限信息

DBA_COL_PRIVS

显示所有用户或角色的列权限信息

ALL_COL_PRIVS_MADE

显示对象所有者或授权用户授出的所有列权 限

ALL_COL_PRIVS_RECD

显 示 用 户 或 PUBLC组被授予的列权限

ALL_TAB_PRIVS_MADE

显示对象所有者或授权用户所授出的所有对 象权限

ALL_TAB_PRIVS_RECD

显示用户所具有的对象权限

用户权限与安全 例如,下面的语句将查询 DBA_TAB_PRIVS 显 示 DEVELOPER 用户被授予的所有 对象权限。 SQL> col grantor format alθ SQL> col object format al5 SQL> col privilege format alθ SQL> select grantor,owner ∣ ∣ , ., ∣∣table_name oject,privilege 2 from dba_tab_privs 3

where grantee= , DEVELOPER , ;

GRANTOR

OJECT

PRIVILEGE

SCOTT

SCOTT.EMP

SELECT

其中,GRANTOR 表示授权用户,O W NER 表示对象所有者,TABLE_NAM E 为数 据库对象,PRIVILEGE 表示相应的对象权限,GRANTEE 表示被授权的用户或角色。 4 . 收回对象权限

一般情况下,收回对象权限是由对象的所有者 完成的。如果以其他用户身份收回 对 象 权 限 ,则要求该用户必须是权限授予者。收 回 对 象 权 限 的 R E V O K E 语句的形式

331

如下: revoke { object_priv [λ object_priv]... ∣ ALL [PRIVILEGES]

}

ON [ schema.]object FROM { user ∣ role ∣ PUBLIC}; [cascade constraints];

收回对象权限时需要注意,授权者只能从自己授 权的用户那里收回对象权限。如果 被授权用户基于一个对象权限创建了过程、视图 ,那么当收回该对象权限后,这些过程、 视图将变为无效。 例如,下面的语句收回 DEVELOPER 用户的对象权限。 SQL> revoke select on scott.emp from developer; 撤销成功。 SQL> connect developer/developer 已连接。 SQL> select * from scott.emp; select * from scott.emp * 第 1 行 出现错误: ORA-01031:权限不足

在收回对象权限时,经过传递获得对象权限的用 户将会受到影响,如 图 1 3 -5 所 示 。 如果 用 户 A 将对象权限 a 授予了用户 B , 用 户 B 又将对象权限 a 授予 了 用 户 C 。那么, 当删除用户 B 或 从 用 户 B 收回对象权限 a 后 ,用 户 C 将不再具有对象权限 a , 并且用户 B 和 C 中与该对象权限有关的对象都变为无效。

Oracle 11g中文版数 据库管理、应 用与开发标准 教程

收回权限前

A

A

收回权限后

C

图 13-5

一对象权限的传递 及其收回

塔管理角色

332

O racle的权限 非常繁多,这 就 为 D B A 有效地管理数 据库权限带来 了困难。另外 ,数 据库的用户经 常有几十个、几百个,甚至 成千上万。如 果管理员为每 个用户授予或 者撤 销相应的系统 权限和对象权 限,则这个工 作量是非常庞 大的。为简化 权限管理,Oracle 提供了角色的 概念。

•— -—-一1一一3~一5一―1一一 角 色 概一一 念 -,、 一— 一—的 一一一 一一 角色是具有名 称的一组相关 权限的组合,即将不同的权 限组合在一起 就形成了角色 。 可以使用角色 为用户授权, 同样也可以从 用户中收回角 色。由于角色 集合了多种权 限, 所以当为用户 授予角色时,相当于为用户 授予了多种权 限。这样就避 免了向用户逐 一授 权 ,从而简化了 用户权限的管 理。 , 例如,在 图 13-6中,D B A 需 要 为 3 个用 户 授 予 5 个不∣ ⅛ 的权限,在未使用角色时, 需要为每个用 户授予5 个不同的权限 ,3 个用户一共 需要执行1 5 次才能完成。采用角色 后 ,可 以 将 这 5 个不同的权限 组合成一个角 色,然后将该 角色分别授予 上述3 个用户。 另外,如果需 要为用户增加 或减少权限,则只需要增加 或减少角色的 权限即可实现 。

图 13-6

.使用角色管理 权限



13 章

用户权限与安全----------在为用户授予角色时,既可以向用户授予系统预定义的角 色,也可以授予自定义角 色 。在创建角色时,可以为角色设置应用安全性,即为角色 设置密码进行保护,这样只 有提供正确的密码才允许修改或设置角色。

. - T 3 . 5 . 2 预定义角色 系统预定义角色就是在安装数据库后, 由系统自动创建的一些角色,这些角色已经 由系统授予了相应的权限。管理员不需要先创建预定义角 色,就可以将它们授予用户。 下面介绍这些常用的系统预定义角色的作用。 1. CONNECT 角色 CO N N EC T角色是在建立数据库时,由 脚 本 S Q L .B S Q 自动建立的角色。它是授予 最终用户的最基本的权限,它所具有的系统权限如下。 建立簇。



CREATE CLUSTER



CREATE DATABASE LINK

建立数据库连接。

建立序列。



CREATE SEQUENCE



CREATE SESSION



CREATE SYNONYM



CREATE VIEW

建立视图。



CREATE TABLE

建立表。

2.

RESOURCE 角色

建立会话。 建立同义词。

RESOURCE角色是在建立数据库时,由 脚 本 SQ L.B SQ 自动建立的角色,该角色是 授 予 开 发 人 员 的 建 立 数 据 库 用 户 后 ,一 般 情 况 下 只 要 给 用 户 授 予 CO N N ECT和 RESOURCE 角色就足够了。RESOURCE 角色还具有 UNLIMITED TABLESPACE 系统 权限。 □

CREATE CLUSTER

建立聚簇。 建立过程。



CREATE PROCEDURE



CREATE SEQUENCE



CREATE TABLE



CREATE T R I G G E R 建立触发器。



CREATE TYPE

3.

D B A 角色

建立序列。

建立表。 建立类型。

D B A 角色具有所有系统权限和WITH ADMIN O P T IO N 选项。默 认 D B A 用户为 S Y S T E M ,该用户可以将系统权限授予其他用户。需要注意,D B A 角 色 不 具 备 SYSDBA 和 SYSOPER特 权 ,而 SYSDBA特权自动具有D B A 角色所有的权限。 4.

EXP_FULL_DATABASE

EXP_FULL_DATABASE角色是安装数据字典时执行脚本 CATEX.SQL创建的角色, 该角色用于执行数据库导出操作。该角色具有的权限和角 色如下。 备份任何表。



BACKUP ANY TABLE



EXECUTE ANY P R O C E D U R E 执行任何过程、函数和包。



SELECT ANY TABLE 查询任何表。 EXECUTE ANY TYPE 执行任何对象类型。



333

--------------------- Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 □

ADMINISTER_RESOURCE_M ANAGER

管理资源管理器 。

EXECUTE_CATALOG_ROLE 执行任何 PL/SQL 系统包。 SELECT_CATALOG_ROLE 查询任何数据字 典。 5. IMP_FULL_DATABASE 角色

□ □

IMP FULL DATABASE角 色 用 于 执 行 数 据 库 导 入 操 作 ,它包含了 EXECUTE_ CATALOG_ROLE, SELECT_CATALOG_ROLE 角色和大量的系 统权限。 EXECUTE_CATALOG_ROLE 角色 该角色提供了对 所有系统PL/SQ L包 的 EXECUTE对象 权限。 7. DELETE_CATALOG_ROLE 角色 6.

该角色提供了系 统审计表SYS、A U D S上 的 DELETE对象权 限。 SELECT_CATALOG_ROLE 角色 该角色提供了对 所有数据字典( DBA_XXX)上 的 SELECT对象权 限。 9. RECOVERY_CATALOG_OWNER 角色 该角色为恢复目 录所有者提供了 系统权限,该角 色所具有的权限 和角色如下。 8.

□ □ □

334

□ □ □ □ □ □

建立会话。 ALTER S E S S I O N 修改⅛ i 舌 球 设 置 。 CREATE SESSION

CREATE SYNONYM 建立同义词。 CREATE V I E W 建立视图。 CREATE DATABASE LINK 建立数据库连接 。 CREATE TABLE 建立表。 建立簇。 CREATE SEQUENCE 建立序列。 CREATE T R I G G E R 建立触发器。 CREATE CLUSTER

CREATE PROCEDURE 建立过程、函数 和包。 最后,通过查询数据字 典D B A _R O LES,可以显示数 据库中全部的角 色信息。例如:



SQL> select role r password_required from dba_roles; ROLE

PASSWORD

CONNECT RESOURCE DBA

NO NO NO

已选择 5 1 行。

φ-- 13.5.3 自定义角色是在 建立数据库之后 由D B A 用户建立的角色 。该类角色初始 没有任何 权限,为了使角 色起作用,可以 为其授予相应的 权限。角色不仅 可以简化权限管 理,还 可以通过禁止或 激活角色控制权 限的可用性。 1 . 建立角色 如果预定义的角 色不符合用户的 需要,数据库管 理员还可以根据 自己的需求创建 更

13 JgE .

用户权限与安全 多的自定义角色。创建角色是使有 CREATE ROLE 语句完成的,一般情况下,该语句由 D B A 执行,如果要以其他用户身份建立角色,则要求该用户必须具有 CREATE ROLE

系统权限。使 用 CREATE ROLE 语句创建角色时,可以指定角色的验证方式是非验证方 式还是数据库验证方式。 如果角色是公用角色或用户的默认角色,可以采用非验证方式。建立角色时,如果 不指定任何验证方式,表示该角色使用非验证方式,也可以通过指定 NOT IDENTIFIED 选项指定角色为非验证方式。例 如 : SQL> create role public_role not identified; 一 角色已创建。

数据库验证是使用数据库来检查角色、密码的方式。采用这种验证方式时,角色名 及密码被存放在数据库中。激活角色时,必须提供密码。对于用户所需的私有角色而言, 建立角色时应为其提供密码。例如 : SQL> create role private_role identified by private; 角色已创建。 ~

2 . 角色授权

在角色建立时,它并不具有任何权限,为了使角色可以完成特定的任务,必须为其 授予系统权限和对象权限。 为 角 色 授 权 与 为 用 户 授 权 完 全 相 同 。但 是 需 要 注 意 , 系 统 权 限 UNLIMITED TABLESPACE 和 对 象 权 限 的 WITH GRANT O PTIO N 选项不能授予角色;不能用一条 G RANT 语句同时授予系统权限和对象权限。

例如,下面的语句将系统权限和对象权限授予 PUBLIC_ROLE 和 PRIVATE ROLE 角色。 SQL> grant create session to public_role with admin option; 授权成功。 SQL> grant select on scott.emp to public_role; 授权成功。 SQL> grant insert,update,delete on scott.emp to private_role; 授权成功。

因为将系统权限 CREATE SESSION 授予角色 P U B L IJR O L E 时 附 带 WITH ADMIN O PTION 选项,所以具有该角色的用户可以将 CREATE SESSIO N 权限授予其他用户或

角色。 为角色授予权限后,可以将角色分配到用户。一般情况下,分 配 角 色 是 由 D B A 完 成的,如果以其他用户的身份分配角色,则要求该用户必须具有 GRANT ANY ROLE 系 统权限或角色上具有 WITH ADMIN OPTION 选项。例如: SQL> grant public_role,private_role to developer 2 with admin option; 授权成功

3

. 激活和禁止角色

激活角色是指使角色具有的权限生效,禁止角色是指使角色具有的权限临时失效。 将系统权限或对象权限直接授予用户后,用户可以直接执行这些权限所对应的 S Q L 操

--------------------- Oracle 1 1 g 中文版数据库管理、应 用与开发标准教程 作 ;将角色分配给用户后 ,会间接地将角色所具 有的权限授予用户。使 用角色不仅可以 简化权限管理,还可以 控制权限的可用性。 由于用户可以具有多个 角色,因此,可以指定某角色在用户登 录数据库时自动激活, 这就是默认角色。如果 使用角色进行权限限制 ,那么应该将公用角色 设置为默认角色。 设置默认角色一般是由 D B A 完成的,如果要以其他 用户身份设置用户的默 认角色,则 要求该用户必须具有ALTER U S E R 系统权限。为用户设置 默认角色的语法如下: alter user user_name default role {role[z role]...( all [except role[,role]...]

∣ none}

例如,下面的语句设置 用户DEVELOPER的默 认角色为PUBLIC_ROLE» SQL> alter user developer default role public role; 用户已更改。

为用户设置了默认角色 后,当以该用户身份登 录时会自动激活默认角 色。因为用户 DEVELOPER的默认角 色为PU B LIC _R O LE,所以当以该用户身份 登录时,只会激活角 色 PUBLIC_ROLE,即 用 户 DEVELOPER在初始登 录时可以执行角色PUB LIC_ROLE具 有的权限操作。例如:

336

SQL> conn deve1oper∕deve1oper 已连接。 SQL> select ename λ job,sal 2 from scott.emp 3 where ename= ,BLAKE , ; ENAME

JOB

SAL

BLAKE

MANAGER

2850

这也意味着,用 户 DEVELOPER在初始登 录时不能执行角色PRIVATE R O L E 具有 的权限操作。 在 SQL*Plus中激活或禁止 角色是使用SET R O L E 语句完成的,而在其他 应用环境 中可以使用过程DBMS_SESSION.SET_ROLE()激活或禁止角色。在激活角色时,如果角 色未使用任何验证方式 ,则可以直接激活角色 。例如: SQL> set role public_role; 角色集 SQL> exec dbms__session.set_rol e(,public- role , ); P L / S Q L 过程已成面完成。

4

.修改和删除角色

修改角色是由语句ALTER R O LE完成的, 对角色的修改主要就是 设置角色是否为验 证方式。 例如,修 改 角 色 PRIVATE_ROLE不使用 任何验证方式,可 以 使 用 如 下 的 ALTER R O LE语句形式: SQL> alter role private_role not identified;

第 13 ⅛ 用户权限与安全--------------- 角色已丢弃。

同样,也可以修改非 验证方式的角色为验 证方式。例如: SQL> alter role public_role identified by public; 角色已丢弃。 -

删除角色是使用DROP R O L E 语句完成的。一般情 况下,删 除 角 色 由 D B A 执行, 如果要以其他用户身 份删除角色,则要求 该用户必须具有DROP ANY R O L E 系统权限, 或者在角色上具有WITH ADMIN OPTION选 项 。例如: SQL> drop role private__role; 角色已删除。

5 . 显示角色信息 在建立角色时,O racle会将角色信息存 放到数据字典中。表 13-7列出了一些关于角 色信息的数据字典视 图。 笔

表 13-7

一存储角色信息的数据字典视图

数据字典视图

描述

DBA_ROLES DBA_ROLE_PRIVS USER_ROLES ROLE_ROLE_PRIVS ROLE_SYS_PRIVS ROLE_TAB_PRIVS SESSION ROLES

记录数据库中所有的角色 记录所有已经被授予用户 和角色的角色 包含已经授予当前用户的 角色信息 包含角色授予的角色信息 包含为角色授予的系统权 限信息 包含为角色授予的对象权 限信息 包含当前会话所包含的角 色信息

如果要查看数据库中 所有的角色,可 以 查 询 DB A _R O LES数据字典视图。DBA_ R O L E S的结构信息如下: SQL> desc dba_roles; 名称

ROLE PASSWORD REQUIRED

是否为空?

类型

NOT NULL

VARCHAR2(30) VARCHAR2(8)

其中,PASSWORD_ REQUIRED列记录角 色是否使用了验证方 式。 如果要查看某个用户 所拥有的角色,可以 查 看 DBA_ROLE_PRIVS数 据字典视图。 DBA_ROLE_PRIVS的 结构信息如下: SQL> desc dba_role_privs 名称

GRANTEE GRANTED__ROLE ADM工N_OPT工ON DEFAULT ROLE

是否为空?

NOT NULL

类型

VARCHAR2(30) VARCHAR2(30) VARCHAR2(3) VARCHAR2(3)

337

--------------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教 程 其中,GRANTEE列记录被授予角色的 用户或角色名,GRANTED_ROLE表示授予 角色的角色名 ,ADMIN OPTION表示授予角色时是否使用了 WITH ADMIN OPTION选 项 ,DEFAULT_ROLE表示是否为用户的 默认角色。

册实验指导 1 . 用户账号 本练习将创建一个用户EX ERC ISE_U SER ,并为其分配相应的系统权限或角色,以 便可以在数据库中执行相应的操作。 ( 1 ) 使 用 SYSTEM 身份连接到数据库。 ( 2 ) 创建用户账号EX ERC ISE_U SER ,其 口 令 为 e x e rc is e ,默认表空间为USERS, 临时表空间为T E M P ,对表空间没有配额限制。 create user exercise_user identified by exercise default tablespace users temporary tablespace temp quota unlimited on users;

338

(3 ) 创建一个用户配置文件EXERCISE_P ROFILE,包含的资源及口令限制如下。 □ 该用户最多可以建立3 个并发的会话连接。 □ 用户执行语句使用的C P U 最 长 时 间 为 1 0 分钟。 □ 空闲时间超过1 5 分钟后,断开与用户的连接。 □ 限制用户每次调用SQ L 语句时,能够读取的数据库块数为100。 □ 限制用户在登录到Oracle数据库时允许 失败的次数为3 。 create profile exercise_profile limit sessions_per_user 3 cpu_per_call 1000 idle_time 15 logical_reads_per_call 100 failed_login_attempts 3; 'j ♦ 、 一⅛ 3

( 4 ) 为 用 户 EX ER C ISE JJSE R指定资源配置文件PROFILE。 alter user exercise_user profile exercise profile;

(5 ) 向用户授予连接数据库系统权限。 grant create session to exercise user;

( 6 ) 向用户授予对对象HR.EMPLOYEES的 SELECT权限,并 以 EXERCISE_USER 身份连接到数据库,查 询 EMPLOYEES表 。 grant select on hr.employees to exercise_user; connect exercise_user/exercise; select * from hr.employees;

(7 )撤销向用户EXERCISE USER授予的系统权限,取而代之向用户 授予CONNECT



13 用户权限与安全



角色。 revoke select on hr.employees from exercise_user; revoke create session from exercise_user; grant connect to exercise user;

£3 思考与练习 一 、填空题 1 . 如果要获取数据库 中创建的配置文件 的 信 息 ,可以通过查询数据 字典视图 O 2 . 在 O ra c le 数据库中的权限可 以分为两 类 ,即 和 。 是 指在系统级控制数据库的存取和使用机制, 是指在模式对象上 控制存取和使用的

A.

default tablespace users B . default temporary tablespace temp C. quota 100M on users; D.

机制 。

A. 是具有名称的一组 相关权限

3

. 的组合。

. 连接到数据库的最 低系统预定义角色 是

4

B.

CRATE ANY TABLE

C.

RESOURCE

D.

DBA



权限。

账号

二 、选择题

B . 无法通过资源配置 文件来限制用户

I . 假 设 用 户 U SER 1的默认表空间为 U SERS,他在该表空 间的配额为10M B,则 USER1

资源 C.

D B A 可以通过资源配置 文件来改变 用户密码

D.

D B A 可以通过资源配置 文件来设置

在 U S E R S 表空间中创建基本 表时,他应具有什 么权限? (



A.

CREATE TABLE

B.

CREATE USER

C.

UNLIMITED TABLESPACE

D.

UNLIMITED TABLESPACE

2 . 下列哪一项资源不 能在用户配置文件 中 限定? ( ) A . 各个会话的用户数 B . 登录失败的次数

3

CREATE TABLE

5 . 下列关于资源配置 文件的描述中,哪一 . 在用户连接到数据 库后,可以查询数据项是正确的? ( ) 视 图 , 了解用户 所 具有 的 系 统 A . 无法通过资源配置 文件来锁定用户

5 字

identified by oracle

. 如果想要在另一个 模式中创建表,用户 最少应该具有什么 系统权限? ( ) 4

密码的过期时限 . 假 设 用 户 A 将 SELECT ANY TABLE权 限授予用户B , 并 且 使 用 ADMIN OPTION选 项 ; 6

用 户 B 又 将 SELECT ANY TABLE权限授予了用 户 C 。那 么 当 D B A 收 回 用 户 A 的 SELECT ANY TABLE权限后,下列中还有哪些用 户将失去这个 权限? ( ,



A . 只 有 用 户 B 失去

C . 使 用 C P U 时间

B . 只 有 用 户 C 失去

D . 使 用 S G A 区的大小

C . 用 户 B 与 用 户 C 都失去 D . 没有任何用户失去

. 检 查 下 面 的 S Q L 语 句 ,哪一项是错误

的? (



alter user tempuser

7 . 通 过 查 询 数 据 字 典 视 图 SESSION. P R I V S ,能够获得下列哪项 信息? ( ) A . 授予当前用户的所 有对象权限

identified by oracle default tablespace users default temporary tablespace

B . 授予当前用户的所 有系统权限 C . 授予当前用户的所 有对象权限和系

temp

D . 当前会话所具有的 所有对象权限和 系统权限

quota 100M on users;

统权限

339

Oracle 1 1g中文版数据库管理、应用与开发 标准教程 三 、简答题

□ 并发会话个数:2 。

1 . 资源配置文件可以对系统的哪些资源进

□ 连接时间: 1 小时。

行限制?

□ 空闲时间: 10 分钟。

2 . 简述向用户授予系统权限时,使 用 WITH GRANT OPTION 选项的作用。

(2 ) 激活资源限制。 ( 3 ) 将该资源配置文件分配给用户 SCOTT., ( 4 ) 以 SCOTT 用 户 建 立 3 个并发会话,检

3 . 简述角色的优点。 4 . 使 用 PROFILE 管理资源。 (1) 以 SYSTEM 用户连接到数据库,然后 建立 PROFILE o

查显示信息。

( 5 ) 显示资源配置文件选项。

第 14章 导 出 与 导 入 在数据库的 应用过程中 ,经常需要 将一个数据 库中的数据 移动到另一 个数据库,或 从外部文件 直接提取数 据到数据库 中。为此,O racle提供了 几种常用的 工具。最常用的 就 是 E xport和 Im port工具,使用这两个 命令行工具 可以在O racle数据库 之间进行数 据 的导入/导出操作,也可以利用 Export/Imp ort工具对数 据库进行逻 辑备份。另 外 在 Oracle 11g中还可 以使用数据 泵( Data Dump Export), 使 D B A 或应用开发 人员可以将 数据库的 元 数 据 (对象定义)和数据快速 移动到另一 个O racle数据库 中。而 SQL*Load er工具可 以用来从非 O racle数据库 或其他任何 能够生成A SC II文本文件 的数据源加 载数据。本章 将对这些常 用的数据导 出与导入工 具进行介绍 。 本章学习要 点: > 了 解 EX PD P和 IM PD P的作用 > 使用数据泵 导出工具E XPDP

A 使用EXPD P和 IMPDP移动表空间 > 使 用 SQL*Load er加载外部 数据

> 使用数据泵 导入工具IMPDP



1

EXPDP 和 IMPDP 简介

数据泵导出 是Oracle 1 0 g 新增加的功 能,它 使 用 工 具 EX PD P将数据库 对象的元数 据 ( 对象结构)或数据导出 到转储文件 中。而数据 泵导入则是 使用工具I M PDP将转储 元 件中的元数 据及其数据 导入到O racle数据库 中。假 设 E M P 表被意外删 除,那么可 以使 用 IM PD P工具 导 入 E M P 的结构信息 和数据。 使用数据泵 导出或导入 操作时,可 以获得如下 好处。 □ 数据泵导出 与导入可以 实现逻辑备 份和逻辑恢 复。通过 使 用 E X P D P ,可以将数 据库对象备 份到转储文 件中;当表被意外 删除或其他 误操作时, 可 以 使 用 IMPDP 将转储文件 中的对象和 数据导入到 数据库中。 □ 数据泵导出 和导入可以 在数据库用 户之间移动 对象。例如 ,使 用 EX PDP可以将 SC O T T模式中的 对象导出存 储在转储文 件中,然 后 再 使 用 IM P D P将转储文 件 中的对象导 入到其他数 据库模式中 。 □ 使用数据泵 导入可以在 数据库之间 移动对象。 □ 数据泵可以 实现表空间 的转移,即将一个数 据库的表空间移动到另一个数据库中。 在 Oracle 11g中, 进行数据导 入或导出操 作时,既可 以使用传统 的导出导入 工具EXP 和 IM P 完成,也可 以使用数据 泵EXPDP 和 IMPDP。但 是,由于工 具EX PDP和 IMPDP 的速度优于 E X P 和 I M P , 所以建议在 Oracle 11g中 使 用 EX PDP执行数 据泵导出,使用 工 具 IM PDP执行数 据导入。 使用数据泵 导出导入和 传统的导出 导入工具时 ,还应该注 意如下事项 。 □ E X P 和 IM P 是客户端的 工具程序,它们既可以 在客户端使 用,也可以 在服务器 端使用。 □

EX PD P和 IM PD P是服务器 端的工具程 序,它们只 能在O racle服务器 端使用,

Oracle 11g中文版数据库管理、应用与开发标 准教程 而不能在Oracle客户端使用。 □

1号

IM PDP只 适 用 于 EX PD P导出的文件,而不适用于E X P 导出的文件。

EXPDP 导出数据

Oracle提 供 的 EXPDP可以将数据库对象的元数据或 数据导出到转储文件中。 EXPDP 可以导出表、用户模式、表空间和全数 据库4 种数据。

.-1 4 2 1

调用 EXPDP

?

E X P D P 是服务器端工具,这意味着该工具只 能在O racle服务器端使用,而不能在 O racle客户端使用。通过在命令提示符窗口中输入EXPDP H E L P命令,可 以 查 看 EXPDP 的帮助信息,从中可以看到如何调用E X PD P导出数据,具体如下: C :∖>expdp help=y Export: Release 11.1.0.6.0 - Production on 星 期 四 , 05 6 月, 2008 16:24:22

342

Copyright (c) 2003 z 2 0 0 7 Λ Oracle. All rights reserved. 数据泵导出实用程序提供了一种用于在O r a c l e 数据库之间传输 数据对象的机制。该实用程序可以使用以下 命令进行调用: 不 例 :expdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott. dmp 您可以控制导出的运行方式。具体方法是:在 *expdp• 命令后输入 各种参数。要指定各参数,请使用关键字: 格 式 : expdp KEYWORD=value 或 KEYWORD= (valuelz value2, ...z valueN) 示 例 : expdp scott/tiger DUMPFILE=scott. dmp DIRECTORY=dmpdir SCHEMAS= scott 或 TABLES=(T1:P1,T1:P2) z 如果 Tl 是分区表 U S E R I D 必须是命令行中的第一个参数。

数据泵导出包括导出表、导出模式、导 出表空间和导出全数据库4 种模式。需要注 意 ,EX PDP工具只能将导出的转储文件存放在 DIRECTORY对 象 对 应 的 O S 目录中,而 不 能 直 接 指 定 转 储 文 件 所 在 的 O S 目录。因此,使 用 E X P D P 工具时,必须首先建立 DIRECTORY对 象 ,并且需要为数据库用户授予使用DI RECTORY对象的权限。例如: SQL> create or replace directory dumpedir 2 as , F:∖0racle llg∖dump , ; 目录已创建。 SQL> grant read,write on directory dump_dir to scott; 授权成功。

上面的语句建立了目录对象D U M P _ D IR ,并 且 为 SCOTT用户授予了使用该目录的 对象权限。

第 14 导出与导入 1 . 导出表 导出表是指将一个 或多个表的结构及 其数据存储到转储 文件中。普通用户只能导出 自 身 模 式 中 的 表 ,如 果 要 导 出 其 他 模 式 中 的 表 ,则 要 求 用 户 必 须 具 有 EXP_FULL_ DATABASE角 色 或 D B A 角色。在导出表时 ,每次只能导出一 个模式中的表。 例如,下面的语句 将导出SCOTT模 式 中 的 D E PT和 E M P 表 。 C:∖>expdp scott/tiger dIRECTORY=dump_dir dumpfile=tab.dmp tables= deρtr emp; Export: Release 11.1.0.6.0 - Production on 星 期 四 , 05 6 月 , 2008 16:37:18 Copyright (c) 2003, 2007, Oracle. All rights reserved. 连接至U: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 Productio With the Partitioning, OLAP, Data Mining and Real Application Testing options 启动 n SCOTT" .n SYS_EXPORT_TABLE_01" : scott∕******** dIRECTORY=dump_dir dumpfi tab.dmp tables=dept,emp; 正 在 使 用 BLOCKS方法进行估计... 处理对象类型 TABLE_EXPORT ∕TABLE ∕TABLE_DATA 使 用 BLOCKS方法的总估计: 64 KB 处理对象类型 TABLE_EXPORT∕TABLE∕TABLE 处理对象类型 TABLE_EXPORT∕TABLE∕INDEX/ INDEX 处理对象类型 TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT 处理对象类型 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS 处理对象类型 TABLE_EXPORT ∕TABLE ∕STAT ISTIC S∕TABLE_STAT ISTICS , . 导出了 ,,SCOTT', .',DEPTn 5.960 KB 5 行

上述 命 令 将D E PT 和 E M P表的相关信息存 储到转储文件TA B.DMP中,并且该转储 文件位 于 DUMP」D R 目录对象所对应的 O S 目录中。 2 . 导出模式 导出模式是指将一 个或多个模式中的 所有对象结构及数 据存储到转储文件 中。导出 模式时,要求用户 必须具有D B A 角 色 或 EXP FULL DATABASE角色 。 例如,下面的语句 将导出SYSTEM和 SCOTT模式中的 所有对象。 C :∖>expdp system/password directory=dump_dir dumpfile=schema.dmp schemas= system,scott; Export: Release 11.1.0.6.0 - Production on 星期四,05 6 月,2008 16:58:58 Copyright (c) 2003z 2007, Oracle. All rights reserved. 连 接 至 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 Production With the Partitioning, OLAP, Data Mining and Real Application Testing options

343

Oracle 1 1 g 中文版数据库管理 、应用与开发标准 教程 启 动 ,,SYSTEM" .n SYS_EXPORT_SCHEMA_01 n : system/******** directory= dump_dir dumpfi le=schema.dmp schemas=systemf scott; 正 在 使 用 B L O C K S 方法进行估计・•・ 处理对象类型 SCHEMA_EXPORT∕TABLE ∕TABLE_DATA 使 用 B L O C K S 方法的点估计: 320 KB 处理又寸象类型SCHEMA_EXPORT/USER 处理对象类型 SCHEMA_EXPORT/SYSTEM_GRANT 处理对象类型 SCHEMA_EXPORT/ROLE_GRANT 处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE 处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

执行上面的语句,将 在 SYSTEM模 式 和 SCOTT模式中的所 有对象存储到转储 文件 SCHEMA.DMP中 。并且该转储文件 位于DU M P_DIR目录对象所 对应的O S 目录中。 3 . 导出表空间 导出表空间是指将 一个或多个表空间 中的所有对象及数 据存储到转储文件 中。导出 表空间要求用户必 须具有D B A 角 色 或 EXP_FULL_DAT ABASE角色。例如 :

344

C :∖>expdp system/admin directory=dump_dir dumpfile=tablespace.dmp tablespaces=example Export: Release 11.1.0.6.0 - Production on 星 期 四 , 05 6 月 , 2008 17:12:0β Copyright (c) 2003, 2007 z Oracle. All rights reserved. 连 接 到 :Oracle Database 11g Enterprise Edition Release 11.1 .0 .β. 0 Production With the Partitioning, OLAP z Data Mining and Real Application Testing options 启动 Π SYSTEM H .n SYS_EXPORT_TMLE SPACE_01 n : system/******** directory= dump_dir du mpfile=tablespace.dmp tablespaces=example 正 在 使 用 B L O C K S 方法进行估计... 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA 使 用 B L O C K S 方法的总估计: 50.68 MB 处理对象类型 TABLE_EXPORT/TABLE/TABLE

4 . 导出全数据库 导出全数据库是指 将数据库中的所有 对象及数据存储到 转储文件中,导出数据库要 求用户必须具有D B A 角 色 或 EXP_FULL_DAT ABASE角色。需要 注意,导出数据库时, 不会导出 SYS、ORDSYS> ORDPLUGINS, CTXSYS、MDSY S, LBACSYS 以及 XDB 等模式中的对象。例如: C:∖>expdp system/manager directory=dump_dir dumpfile=full.dmp full=y;

导出与导入

φ - 14.2.2

EXPDP 命 令 参 数 ]

在 调 用 EXPD P工具导出数据 时,可以为该工 具附加多个命 令行参数。事实 上,只 要通过在命令 提示符窗口中 输入EXPDP HELP命令,就 可以了解EXP DP各个参数的信 息 。下面将介绍 EXPDP工具的 常用命令行参 数及其作用。 1. CONTENT 该参数用于指 定要导出的内 容,默认值为 A LL。语法如下 : CONTENT={ALL ∣ DATA ONLY ∣ METADATA ONLY}

当 设 置 CONTENT参 数 为 A L L 时,将导出对象 定义及其所有 数据;当设置该选项 为 DATA_ONLY时,只导出对象 数据;当设置 该选项为METADATA_ONLY时,只导出 对象定义。例 如: C : ∖>expdp s c o t t ∕t i g e r DIRECTORY=du m p_dir DUMPFILE=dum p_f i l e . dmp c o n t e n t = METADATA ONLY;

2. DIRECTORY 该参数指定转 储文件和日志 文件所在的目 录。语法如下:

345

D IR E C T O R Y = d ir e c to r y _ o b je c t

其中,DIREC TORYJ3BJEC T用于指定目录 对象的名称。需要注意, 目录对象是使 用 CREATE DIRECTORY语 句建立的对象 ,而 不 是 O S 目录。示例如下 : C A > e x p d p s c o t t / t i g e r DI REC TORY=dump_d i r DUMP F IL E = d u m p _f i l e . dump

3. DUMPFILE 该参数用于指 定转储文件的 名称,默认名 称为EXPDAT.DMP。语法如下: DUMPFILE=[ d i r e c t o r y o b j e c t : ] f i l e

name [ , . . . ]

其中,DIRECTORY_OBJECT用于指定目录 对象名,FILE _NAME用于指 定转储文 件名。需要注意,如果不指定DIRECTORY_O BJECT,导出工 具会自动使用 DIRECTORY 选项指定的目 录对象。示例 如下: C ι∖ > e x p d p s c o t t / t i g e r DIRECTORY=du m p_dir DUMPFILE=dum p f i l e . dmp

4. EXCLUDE 该参数用于指 定执行导出操 作时要排除的 对象类型或相 关对象。语法如下: E X C L U D E = o b je ct t y p e [ : name c la u s e ]

[ ,...]

其中,O B JE C T JY P E 用于指定要排 除的对象类型 ,N A M E /L A U S E 用于指定要排 除的具体对象 。需要注意,E XCLUDE和 INCLUDE不能 同时使用。示 例如下: C Λ > e x p d p s c o t t / t i g e r DIRECTORY=du m p_dir D U M P F IL E = d u m p _file . dup EXCLUDE= VIEW

5. FILESIZE 该参数用于指 定导出文件的 最大大小,默 认 为 0 (表示文件大小 无限制) 。语法如下:

Oracle 11g中文版数据库管理、应用与开发标准教程 FILESIZE=integer

如果要将数据库及其数据导出到多个文件中,必须设置该参数。示例如下: C :∖>expdp scott∕tiger DIRECTOTY=dump_dir DUMPFILE=dump_file.dmp filesize=3M

6. FLASHBACK_TIME 该参数用于指定导出特定时间点的表数据。语 法如下: FLASHBACK TIME=" TO TIMESTAMP(time value)"

7. FULL 该参数用于指定数据库模式导出,默 认 为 N 。语法如下: FULL={Y | N}

其中,当设置该选项为Y 时,表示执行数据库导出。需要注意,执行数据库导出时, 数据库用户必须具有EXP_FULL_DATABASE角 色 或 D B A 角色。示例如下: C A > e x p d p scott/tiger DIRECTORY=dump dir DUMPFILE=full.dmp FULL=Y

346

8. INCLUDE 该参数用于指定导出时要包含的对象类型及相 关对象。语法如下: INCLUDE = object type[:name c l a u s e ] [,...]

其中,OBJECT_TYPE用于指定要导出的对象类型,NAME一CLAUSE用于指定要导 出的对象名。需要注意,INCLUDE和 EXCLUDE选项不能同时使用。 9. JOB_NAME 该参数用于指定要导出作业的名称,默认 名 称 为 SYS_XXX»语法如下: JOB NAME=jobname

二 :—



10. LOGFILE 该参数用于指定导出日志文件的名称,默认名 称为EXPORT.LOG。语法如下: LOGFILE=[directory object:]file name

11. PARALLEL 该参数用于指定执行导出操作的并行进程个数 ,默 认 值 为 1。语法如下:

通过执行并行导出操作,可以加快导出速度。 12. QUERY 该参数用于指定过滤导出数据的WHERE条件 。语法如下: QUERY=[schema.] [table name:] query clause

其中,SCHEMA用于指定模式名,TABLE N A M E 用于指定表名,QUERY CLAUSE 用于指定条件限制子句。 需要注意,QUERY参数不能与CONNECT=METADATA_ONLY> EXTIMATE ONLY、TRANSPORT TABLESPACES 等参数同时使用。示例如下:

导出与导入

第 14 章

C:∖>expdp scott/tiger directory=dump_dir dumpfie1=dump_fi1e .dmρ tables= emp query='where deptno=20,

13. STATUS 该参数用于指定显示导出 作业进程的详细状态,默 认 值 为 0 。语法如下: STATUS=integer

INTEGER用于指定显示导 出作业状态的时间间隔,单位为秒。指定该参数后 ,每隔 特定时间间隔会显示作业 完成的百分比。 14. TABLES 访参数用于指定表模式导 出。语法如下: TABLES=[schema name.]table name[:partition name] [,..・]

其中,SCHEMA_NAME 用于指定模式名,TABLE _NAME用于指定要导出的 表名, PARTITION_NAME用于 指定要导出的分区名。 15. TABLESPACES 该参数用于指定要导出表 空间列表。 16. TRANSPORT_TABLESPACES 该参数用于指定执行表空 间模式导出。导出表空间 时,要求数据库用户必须 具有 EXP_FULL_DATABASE 角色或 DBA 角色。

廿

IMPDP导入数据

1M PDP是服务器端的工具,该工具只能在O racle服务器端使用,不 能 在 O racle客 户端使用。与 E X PD P相似,数据泵导入时,其 转储文件被存放在DIREC TORY对象所 对 应 的 O S 目录中,而不能直接指定 转储文件所在的O S 目录。

φ-_- _1 __ IMPDP 参 数 -、 __4._3_.1 同样,在 调 用 IM PD P工具导入数据时,也可以 为该工具附加多个命令行 参数。通过 在命令提示符窗口中输入 IMPDP HELP命令,就可 以 了 解 IM PD P的各个参数信息。其 中,大部分参数与E X PD P的参数相同,本节将主要 介绍IM PDP所特有的参数。 1. REMAP_DATAFILE 该参数用于需源数据文件 名转变为目标数据文件名 ,在不同平台之间移动表 空间时 可能需要该参数,以避免 数据文件重名。语法如下 : REMAP DATAFILE=source datafie:target datafile

2.

REMAP_SCHEMA

该参数用于将源模式中的 所有对象装载到目标模式 中。语法如下: REMAP SCHEMA=source schema:target schema

3.

REMAP_TABLESPACE

该参数用于指定导入时更 改表空间名称。在 10g版本出现以前,这一操作非常复杂。

347

Oracle 11g中文版数据库 管理、应用与开发 标准教程 首先,因为没有 写操作权限,必 须移除原始表空 间的限额,然后 再设置表空间。在导入 过程中,原始表 空间中的对象可 以存储在设置后 的表空间中。当 任务完成后,必 须进行 将表空间恢复到 原来的状态。在 10g中导入时,REMAP_TABLESPACE参数的设 置大大 简化了该操作,这样只需要对目 标表空间进行限 额,而不需要其 他条件。语法如 下: REMAP TABLESPACE=sou rce t a b le s p a c e : t a r g e t t a b le s p a c e

4. REUSE_DATAFILES 该参数用于指定 建立表空间时是 否覆盖已存在的 数据文件,默 认 为 N 。语法如下: REUSE DATAF工LES={Y ∣ N}

5. SKIP_UNUSAB LE_INDEXES 该参数用于指定 导入时是否跳过 不可使用的索引 ,默 认 为 N 。 6. SQLFILE IMPDP允 许 导 出 D M P 文件来创建D M P 文件中包含对象 的D D L 脚本,以便之后使 用 。该参数用于指 定将导入的D D L 操作写入到SQL 脚本中。语法如 下: SQ LFILE = [ d i r e c t o r y .o b j e c t : ] f i l e name

348

在 IMPDP中使用该 参数时,可以从D M P 文件中提取对象 的D D L 语句, 这 样 IMPDP 并不把数据导入 数据库中,只是 创 建D D L 语句文件。示例 如下: C : ∖>impdp s c o t t / t i g e r DIRECTORY=dum p_dir DUM PFILE=tab.dmp SQLFILE= s q l f i l e . sq l

7. STREAMS_CONFIGURATION 该参数用于指定 是否导入元数据 ,默认值为 Y 。 8. TABLE_EXISTS_ACTION 该参数用于指定 当表已经存在时 导入作业要执行 的操作,默 认 为 SKIPo TABLE E XISTS ACTION={SKIP ∣ APPEND ∣ TRUNCATE ∣ FRPLACE }

当 设 置 该 参 数 为 S K IP 时 ,导入作业会跳 过已存在表处理 下一个对象;当设置为 APPEND时,会 追加数据;设 置 为 TRUNCATE时,导入作业会截断 表,然后为其追加 新数据;当设置 为REPLACE时,导入作业会删除 已存在表,然后 重建表并追加数 据。

TRUNCATE选项不 适用于簇表和NET WORK L IN K 选 项 o

9. TRANSFORM 该 参 数 用 于 指 定 是 否 应 用 于 适 用 对 象 的 元 数 据 转 换 ,有效的转换关键字为: SEGMENT_ATTRIBUTES. STORAGE > OID 和 PCTSPACE。语法 如下: TRZkNSFORM=transform name: v a lu e [ : o b j e c t type]

其中,TRANSFO RM_NAME用于 指定转换名,SEGMENT_ATTRIBUTES用于标识 段属性( 物理属性、存储属 性、表空间、日志等 信息),STORAGE用于标识段存储属性, VALUE用于指定 是否包含段属性 或段存储属性,OBJECT_TYPE用 于指定对象类型 。示

导出与导 入 例如下: C:∖>impdp scott/tiger directory=dump dumpfile=tab.dmp transfo rm= segment attribu tes:n :table

10. TRANSPORT_DATAFILES 该参数用 于指定移 动空间时 要被导入 到目标数 据库的数 据文件。语法如下: TRANSPORT_DATAFILES=datafile_name

其中,DATAFILE_NAM E 用于指定 被复制到 目标数据 库的数据 文件。示例如下: C:∖>impdp system/password directory=dump dumpfile=tts.dmp transport_ datafil es= , ∕userθl /data/t bs.f ,

14.3.2 ,调用 IMPD P-、

___ ____ __ ________ __ __ ____ ✓

与 EXPDP 类 似 ,调 用 IM PDP 时只需要 在命令提 示符窗口 中输入 IM PDP 命令即可

。 同样,IM PDP 也可以进 行 4 种类型的 导入操作 :导入表 、导入用 户模式、导入表空 间和 导入全数 据库。 1 . 导入表

导入表是 指将存放 在转储文 件中的一 个或多个 表的结构 及数据装 载到数据 库中,导 入表是使 用 TABLE S 参数完成 的。普通 用户只可 以将表导 入到自己 的模式中 ,但如果 以 其他用户 身份导入 表,则要 求该用户 必须具有 IMP_FU LL_DAT ABASE 角色或 D B A 角色。 导入表时 ,既可以 将表导入 到源模式 中,也可 以嘉表导 入到其他 模式中。 例如,下 面的语句将表DEPT>EMP分别导入到其自身模式SCOTT 和模式 SYSTEM

中。

C :∖>impdp scott/tiger DIRECTORY=dump_dir dumpfile=tab.dmp tables= dept,emp C: ∖>impdp system/admin DIRECTORY=dump__dir dumpf ile≈tab. dmp tables=scott. dept,scott.emp REMAP_S CHEMA=S COTT:SYSTEM

其中,第 一种方法 表示将 D E PT 和 E M P 表 导 入 到 SCOTT 模式中,第二种方 法表示 将 DE PT 和 EM P 表 导 入 到 SYSTEM 模式中。

如果要将 表导入到 其他模式 中,则 必 须 指 定 REMAP_ SCHEMA 参数 。

2

. 导入模式

导入模式 是指将存 放在转储 文件中的 一个或多 个模式的 所有对象 装载到数 导入模式 时需要使 用 SCHEM AS 参数。普 通用户可 以将对象 导入到其 自身模式据库中, 、 中,但如 k 果以其他 用户身份 导入模式 时,则要 求该用户 必须具有 IMP_FU LL_DAT ABASE 角色或 D B A 角色。导 入模式时 ,既可以 将模式的 所有对象 导入到源 超式中,也可以将 模式的所 有对象导 入到其他 模式中。 例如,下面的语 句将 SCOTT 模式中的 所有对象 分别导入 到其自身 模式 SCOTT 和模 式 SYSTEM 中.

349

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 C:∖>impdρ scott/tiger directory=dump_dir dumpfile=schema.dmp schemas= scott C :∖>imρdp system∕ρassword di rectory=dump_di r dumpfile=schema.dmp schemas=scott remap_schema=scott:system

如上所示,第 一 种 方 法 表 示 将 S C O T T 模式中的所有对象导入到其自身模式中,第 二种方法表示将SCOTT模式中的所有对象导入SYSTEM模式中。

如果要将模式中的所有对象导入到其他模式中,则 必 须 指 定 REMAP_SCHEMA 参数.

3 . 导入表空间 导入表空间是指将存放在转储文件中的一个或多个表空间中的所有对象装载到数据 库中,导入表空间时需要使用TABLESPACE参数。例如,下面的语句将EXAM PLE表 空间中的所有对象都导入到数据库中。 C:∖>impdp system/password directory=dump_dir dumpfile=tablespace.dmp tablespaces=example

4 . 导入全数据库 导入全数据库是指将存放在转储文件中的所有数据库对象及相关数据装载到数据库 中,导入数据库是使用F U L L 参数设置的。 需要注意,如果导出转储文件时要求用户必须具有EXP FULL DATABASE角色或 D B A 角色,则导入数据库时要求用户必须具有IMP_FULL_DATABASE角 色 或 D B A 角 色 。例如: C:\>Impdp system/password DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=y

r

动走空间 __1_4_3_A___稔__ _______ √

使 用 EX PDP和 IM PDP还可以实现移动表空间,即将表空间从一个数据库移动到另 一个数据库中。在 Oracle 10g前 ,移动表空间只能在相同的操作系统平台之间进行。在 Oracle 1 1 g 中,不仅允许在相同平台之间移动表空间,而且允许在不同平台之间移动表 空间。通过查询动态性能视图V$TRANSPORTABLE_PLATFORM,可以显示在哪些OS 平台之间可以移动表空间。例如: SQL> select platform_name from v$transportable_platform; PLATFORM_NAME Solaris[tm] 0E (32-bit) Solaris[tm] 0E (64-bit) Microsoft Windows 工A (32-bit) Linux IA (32-bit) AIX-Based Systems (64-bit) HP-UX (64-bit)

第 14 导出与导入 HP Tru64 UNIX HP-UX IA (64-bit) Linux 工A (64-bit) HP Open VMS Microsoft Windows IA (64-bit) IBM zSeries Based Linux Linux 64-bit for AMD Apple Mac OS Microsoft Windows 64-bit for AMD Solaris Operating System (x86) IBM Power Based Linux HP IA Open VMS Solaris Operating System (AMD64) 已选择19行。

在 Oracle 10g前 , 移动表空间是使用传统导出导入工具E X P和 IM P实现的。 从 Oracle 11g开始,不仅可以使用传统导出导入工具E X P 和 IM P 移动表空间,还可以使用数据泵 导出导入工具EX PD P和 IM PD P移动表空间,并且使用数据泵导出导入工具EX PD P和 IM PD P的速度更快。移动表空间具有以下一些限制。 □ 源数据库和目标数据库必须具有相同的数据库字符集和民族字符集,通过查询 数据 字 典 视 图 NLS_DATABASE_PARAMETERS, D B A 用户可以取得数据库字 符集 NLS_CHARACTERSET 和民族字符集 NLS_NCHAR_CHARACTERSET. □ 不 能将表空间移动到具有同名表空间的目标数据库中。这可以通过使用ALTER TABLESPACE RENAME语句修改源数据库或目标数据库表空间的名称来实现。 □ 不能 移 动 SYSTEM表 空 间 和 S Y S 用户对象所在的表空间。 □ 如果要将表空间移动到其他O S 平台,必须将初始化参数COMPATIBLE设置为 10.0以上。 在两个数据库之间移动表空间的具体操作步骤如下。 (1)确定自包含表空间集合。 自包含表空间集合是指具有关联关系的表空间集合。移动表空间时,如果两个表空 间之间存在关联关系,必须同时移动这两个表空间。 假设表空间A 包 含 表 E M P ,表 空 间 B 包 含 E M P表 的 索 引 E M P _ P K ,如果要移动表 空 间 B , 则必须同时移动表空间A , 此时表空间A 和 B 为自包含表空间集合。违反自包 含表空间集合的最常见情况如下。 □ 索 引在表空间集合内,但是索引指向的表在表空间之外。 □ 分区表的部分分区在迁移表空间之外。 □ 完整性约束的参考对象在迁移表空间之外。 □ 表中包含的L O B 对象存储在表空间集合之外。 移动表空间之前,为了确保特定的表空间集合可以被移动,必须首先检查表空间集 合是否为自包含,通过执行包D B M S J T S 中 的 TRANSPORT_SET_CHECK过程,可以 检查一个表空间集合是否是自包含的。 DBMS_TTS.TRANSPORT_SET_CHECK过程的语 法如下: dbms_tts.transport_set_check(ts_list in varchar2,

351

--------------------- Oracle 1 1 g 中文版数据 库管理、应 用与开发标 准教程 incl_constrations in BOOLEAN, full_closure in BOOLEAN DEFAULT FALSE);

其中,第一 个参数是表 空间名称的 列表;第二 个参数表示 是否检查完 整性约束;第 三个参数表 示检查迁移 表空间集合 内参考集合 外的同时,反过来检查 迁移表空间 集合外 的表空间是 否引用了集 合内的对象 ,一般情况 下为默认值 FALSE。 执 行 该 过 程 后 ,系统会将违反自包含表空间集合的信息写入到临时表 TRANSPO RT_SET_V IOLATION S中。查询该 临时表时,如果没有返 回任何信息 ,则说 明表空间集 合是自包含 的,否则会 返回违反自 包含表空间 集合的详细 信息。需要 注意, 执 行 DBMS_TT S包要求用 户必须具有 EXECUTE _CATALO G_ROLE角 色。 例如,下面 的语句将检 查表空间E XAM PLE是否为 自包含的表 空间集合。 SQL> connect ∕ as sysdba 已连接。

SQL> execute dbms_tts.transport_set_check (,EXAMPLE, true); r PL/SQL 过程已成功完 晟“ SQL> select * from transport_set_violations; 未选定行

352

( 2 ) 设置要移动 的表空间为 READ ONLY状态 。 确定自包含 表空间集合 后,为了生 成要移动的 表空间集合 ,必须首先 将所有移动 的 表空间转变 为只读状态 ,以确保其 内容不会发 生改变。例 如: SQL> alter tablespace example read only; 表空间已更改 。

( 3 ) 导出表空间 。 将表空间切 换到只读状 态后,就可 以使用数据 泵导出工具 导出要移动 的表空间集 合 了。需要注 意,在导出 移动表空间 集合时,要 求 用 户 必 须 具 有 EXP_FULL_DATABASE 角 色 或 D B A 角色。例如 : C:∖>expdp system/password directory=dump_dir dumpfile=transport.dmp transport_tablespaces=example Export: Release 11.1.0.6.0 - Production on 星期五, 06 6 月, 2008 15:17:07 Copyright (c) 2003, 2007, Oracle. All rights reserved. 连接至I 」: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -

Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 启动 "SYSTEM" .n SYS_EXPORT_TRANSPORTABLE_01H : system/******** directory=dump_dir dumpfile=transport.dmp transport_tablespaces=example 处理对象类型 TRANSPORTABLE_EXPORT∕PLUGTS_BLK 处理对象类型 TRANSPORTABLE_EXPORT/TYPE/TYPE_SPEC 处理对象类型 TRANSPORTABLE_EXPORT∕TABLE 处理对象类型 TRANS PORTABLE_EX PORT ∕GRANT ∕OWNER_GRANT ∕OBJECT GRANT

导出与导入 处理对象类型 处理对象类型 处理对象类型 处理对象类型 处理对象类型 处理对象类型

TRANSPORTABLE_EXPORT∕INDEX TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT TRANSPORTABLE_EXPORT/INDEX_STATISTICS TRANS PORTABLE__EXPORT ∕COMMENT TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT TRANSPORTABLE_EXPORT ∕TRIGGER

SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 的转储文件集为 : F:\ORACLE 11G ∖DUMP ∖TRANSPORT.DMP ********************************************************************** 可 传 输 表 空 间 E X A M P L E 所需的数据文件: D:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLEOl.DBF 作 业 "SYSTEM" ."SYS_EXPORT_TRANSPORTABLE_01"已于 15:18:55 成功完成

( 4 )传送导出文件和数据文件。 生成转储文件后,可以使用任何复制工具将转储文件和自包含表空间集合的数据文 件传送到目标数据库所在机器的合适位置。 在所有导出表空间集合的数据文件已经复制到指定位置后,将原数据库中的表空间 设 置 为 READ W RITE状态。 (5 )导入表空间到目标数据库中。 将转储文件和表空间的数据文件传送到目标数据库后,就可以使用数据库泵导入工 具 IM PD P将 表 空 间 EXAM PLE导入到目标数据库中了。如果目标数据库存在同名表空 间,则需要执行ALTER TABLESPACE RENAM E语句修改表空间名称。 C: ∖>impdp system/password directory=dump_dir dumpfile=transport.dmp transport_datafles=d:∖oracle ∖example.dbf rename schema=soctt:hr

执行上述命令后,就 会 将 EXAMPLE表空间插入到目标数据库中,因为该表空间处 于只读状态,为了在该表空间上执行D M L 和 D D L 操作,还应该将该表空间转变为可读 写状态。例如: SQL> alter tablespace example read write; 表空间已更改。



SQL*Loader导入外部数据

上面介绍的数据泵和EX P/IM P工具仅可以实现一个O racle数据库与另一个Oracle 数据库之间的数据传输,而 SQ L*Loader工具则可以实现将外部数据或其他数据库中的 数据添加到O racle数据库中。例如,将 A C CESS中的数据加载到O racle数据库。

. - ΦΦ4∙4

SQL *Loader 概述

O racle提供的数据加载工具SQL*Loader可以将外部文件中的数据加载到O racle数 据库,SQL*Loader支 持 多 种 数 据 类 型 (如日期型、字符型、数据字型等),即可以将多 种数据类型加载到数据库。

353

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 使 用 SQ L*Loader导入数据时,必 须 编 辑 一 个 控 制 文 件 (.C T L ) 和一个数据文件 (.D A Γ )o 控制文件用于描述要加载的数据信息,包括数据文件名、数据文件中数据的存 储格 式 、文件中的数据要存储到哪一个字段、哪些表和列要加载数据、数据的加载方 式等。 根据数据的存储格式,SQL*Loader所使用的数据文件可以分为两种,即固定格式存 储的数据和自由格式存储的数据。固定格式存储的数据按一定规律排列,控制文件通过 固定长度将数据分割。自由格式存储的数据则是由规定的分隔符来区分不同字段的数据。 在 SQL*Loader执行结束后,系统会自动产生一些文件。这些文件包括日志文件、 坏文件以及被丢掉的文件。其中, 日志文件中存储了在加载数据过程中的所有信息,坏 文件中包含了 SQL*Loader或 O racle拒绝加载的数据;被丢掉的文件中记录了不满足加 载条件而被过滤掉的数据,用户可以根据这些信息了解加载的结果是否成功。 在 使 用 SQL*Loader加载数据时,可以使用系统提供的一些参数控制数据加载的方 法 。调 用 SQL*Loader的命 令 为 SQLLDR, SQLLDR命令的形式如下: C: ∖>sqlldr

φ~~ 1 4 .4 .2 加载数据 354 使 用 SQL*Loader加载数据的关键是编写控制文件,控制文件决定要加载的数据格 式 。根据数据文件的格式,控制文件也分为自由格式与固定格式。如果数据文件中的数 据是按一定规律排列的,可以使用固定格式加载,控制文件通过数据的固定长度将数据 分割。如果要加载的数据没有一定格式,则可以使用自由格式加载,控制文件将用分隔 符将数据分割为不同字段中的数据。 1 . 自由格式加载 本示例将使用自由格式加载T X T 文件。 ( 1 ) 创建一个空表结构,以存储要加载的数据。这里创建了一个基表EMPLOYEES, 其结构如下: SQL> create table employees 2 empno number(4), 3 ename varchar2(20)r 4 job varchar2 (20)r 5 sal number(7z 2) r 6 deptno number(4) 7 ); 表已创建。

( 2 ) 整理数据文件EM PLO Y EES.TX T,整理后的格式如下: 198 199 200 201 202 203 204

OConnell Grant Whalen Hartstein Fay Mavris Baer

SH_CLERK SH_CLERK AD_ASST MK_MAN MK_REP HR_REP PR REP

2860.00 2860.00 4840.00 14300.00 6600.00 7150,00 11000.00

50 50 10 20 20 40 70

导出与导入 205 206

Higgins Gietz

AC_MGR AC ACCOUNT

13200.00 130.00

110 110

( 3 )编辑控制 文件EM PLOYEE S.CTL,确 定加载数 据的方式 。创建的控 制文件的格 式如下: load

data

infile into

, f :∖ employee

table

(empno ename

s.txt ,

employees_copy

position (01:04) integer external, position (05:16) char z

job

position (17:27) char, position (28:36) decimal external, deptno position (40:45) integer external) sal

其中,IN FIL E 指定源数 据文件,INTO T A B L E 指定添加 数据的目 标基本表 ,还可 以使用关 键字APPE ND表示向 表中追加 数据,或使用关 键字REPL ACE覆盖 表中原来的 数据。加载 工具通过 POSITIO N控制数据 的分割, 以便将分割 后的数据添 加到表的各 个 列中。 ( 4 )调 用 SQL*Loa der加载数 据。 在命令行 中设置控 制文件名 ,以及运行 后产生的日 志信息文件 。 C:∖>sqlldr system/admin control= f:∖employees.ctl log=f:\emp_log

( 5 )检查日志 文件确认是 否有错误 数据。 检查日志 文件,以 确认数据加 载是否成功 。可以根据 日志文件 中的提示 信息,修改 产生错误 的原因。 2 . 固定格式 加载E x c e l数据 Excel保存 数据的一 种格式就 为“ CSV (逗号分隔 )”,该文件类 型通过指定 的分隔符 隔离各列的 数据,这就为通 过SQL*L oader工具 加载E xcel中的数 据提供了可 能。本示例 将 通 过 SQL*Loa der加 载 E xcel数据。 (1)打 开 E x c e l ,输 入 如 表 14-1所示 的数据。 招

表 14-1

.输 入 到 Excel 中 的 数 据 ( 1)

10

Administration Marketing

20 30

Purchasing

1 40 50 60

Human Resources Shipping IT

( 2 )保 存 E xcel文 件 为 DEPART MENTS.C SV,注意保 存文件的 格式为“ CSV (逗号 分隔”'。 (3 )创建一 个与E xcel数据相 对应的表 。 SQL> create table departme nts_copy ( 2 deptno number(4), 3 dname varchar2 (20)); 表已创建。

( 4 )编辑控制 文件D E P T .C T L ,内容如下:

355

--------------------- Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 load data infile , f :∖departments.c sv , append into table departments fields terminated by , , , ( deptno z dname)

其 中 FIELDS TERMINATED B Y 指 定 数 据 文 件 中 的 分 隔 符 为 逗 号 数 据 的 加 载 方 式 为 A P P E N D ,表示在表中追加 新数据。 (5 )调 用 SQL*Loader来加 载数据。 C:∖>sqlldr system/admin control=f:∖department.ctl

加载数据后,用 户可以连接到S Q L * P lu s,查询基本表D E P T ,查看是否有数据 。

学实验指导 1 . 调 用 E X P 和 IM P备份数据库 本练习将使用E X P 工具按用户模式 方式对SCOTT模 式中的对象进行 备份,并使用 该备份恢复被用 户删除的表。

356

(1)在命令提示符 窗口中输入命令 ,启 动 E X P 工具按用户模式 方式备份SCOT T模 式中的对象。 exp userid=scott∕tiger file=e:\oracl e_data\scott_ 2008_6_2.bak log= e :\oracle_data \scott.log

( 2 )模拟一个故障 ,删 除 表 E M P 中的所有数据。 delete emp;

( 3 )使 用 IM P 工具按用户模式 方式恢复E M P 表中的数据。 imp userid= scott∕tiger ignore=y fromuser=scott touser=scott file= e :\oracle_data\scott_2008_6_2.bak

用户可以使用同 样的方法调用E XPDP和 IM PDP工具, 完成对数据库的 备份与恢复。 2 . 调 用 SQ L *L oader导入外部数 据 本 练习将使用SQL *Loader工具导入 外部数据到数据 库。 (1)打 开 E x c e l,输 入 如 表 14-2所示的数据 。 安? 表 14-2

τ 输 入 到 Excel中 的 数 据 ( 2)

120

急救中心

110

报警中心

1 114 1 119

号码百事通 火警中心

( 2 )保 存 E xcel文件为“应急电话.CSV” , 注意保存文件的 格式为“CSV (逗号分隔)”。 (3 )创 建 与 E xcel数据相对应 的表。 create table应 急 电 话 ( num number(4), name varchar2(90)) ;

导出与导入 (4 ) 创 建 控 制 文 件 “应急电话.C TL”。 lo a d d a ta i n f i l e , :\ 应 急 电话 ∙CSW a p p e n d i n t o t a b l e 应急电话 f i e l d s te rm in a te d by , , , (num,name)

( 5 ) 调 用 SQL*Load er来加载数 据。 c : ∖> s q l l d r s y s te m /p a s s w o r d c o n t r o l = f : ∖βZ⅛⅛^iS. c t l

学思考与练习 一 、填空题

1 . 数据泵的导出与导入可以实现逻辑备 份和逻辑恢复 。通 过 使 用 , 可以将数 据库对象备份 到转储文件中 ;当表被意外删除或 其他误操作时 ,可以使用

3 . 如果某用户执 行 DELETE 操作时误删了 EM P 表中的所有数 据,为了使用数据 泵导入工具 IM P D P 导入其数据,应该使用 哪个 选项 设置 ? (



将转储文件

A. B. C. D.

中的对象和数 据导入到数据 库。

2 . 数 据 泵 导 出 时 ,可 以 按 导 出 表 、 、

和导出全数据库4 种

方 式。

3 . 使 用 SQL*Loader导入数据时,必须编 辑

和数据文件( .DAT) 。 4 . 使 用 EXPORT 导出数据时,可以根据需 要 按 3 种不同的方式 导出数据。 方式 就是导出一个 指定的基本表 ,包括表的定 义、表 中的数据、 以 及 在 表 上 建 立 的 索 引 、约 束 等 。 方式是指导出 属于一个用户 的所有对 象 ,包括表、视图 、存储过程、序列等。 方式是指导出 数据库中所有 的对象。 二 、选择题

4 .使 用 传 统 导 出 工 具 E X P 导 出 SCOTT 用 户 的 所 有 对 象 时 ,应该选择下列哪一 项? (



A. EXP B. EXPDP C. IMPDP D . 全部都可以 . 使 用 数 据 泵 导 出 工 具 E X P D P 导出

2 SCOTT 用户的所有对 象时,应该选择以下 哪个选 项? (



A. B. C. D.

TABLES SCHEMAS TABLESPACES FULL=Y



A. TABLES C. OWNER

B. SCHEMAS D. FULL=Y

三、简答题

1 . 使 用 数 据 泵 导 出 工 具 EX PD P 执行导出 操作。 □ 以 SC O T T 用 户 身 份 导 出 表 D E P T 和

EMP 的结构和数据 到文件 TAB.DMP中. □ 以 SYSTEM 用户 身份导出 SCOTT 模式

1 . 以 下 哪 个 O racle 工具可以在客 户端使 用? (

CONTENT=ALL CONTENT=DATA_ONLY CONTENT=METADATA_ONLY CONTENT= DATA

中的所有对象 到文件 SCOTT.DMP中. □ 以 SYSTEM 用 户 身 份 导 出 表 空 间

USERS 的 所 有 对 象 到 文 件 DATA01.DMP 中“ □ 以 SY STEM 用户身份导出 数据库的所 有 对 象到 文件 DATABASE.DMP中。 2 . 简述数据泵导 出工具和传统 导出工具之 间的区别。

3 . 简 述 如 何 使 用 SQL*Loade r 导入外部 数 据。

357

第 15章 备 份 与 恢 复 任何数据库在长期使用 的过程中,都会存在一 定的安全隐患,例如 ,由于数据库的 物理结构被破坏,或由 于机器硬件故障而遭到 破坏。对于数据库管理 员而言,这不能仅 寄希望于计算机操作系 统的安全运行,而要建 立一整套的数据库备份 与恢复机制。任何 人为的或自然灾害出现 ,导致数据库崩溃、物理 介质损坏等故障时,管 理员都可以及时 恢复系统中重要的数据 ,尽可能地避免数据损 失,使用数据库正常运 行。如果没有可靠 的备份和恢复机制,就 可能造成系统瘫痪、数 据丢失等后果。本章将介 绍数据库备份与 恢复的概念,以及如何 使用 R A M N 进行备份与恢复。 本章学习要点: >

O racle 数据库备份概述

A

R M A N 进行完全数据库恢复

>

备份原则

A

R M A N 进行各种不完全数据库

>

备份和恢复策略

>

恢复 管 理 器 RMAN

>

R M A N 备份

” 工)

恢复 >

维 护 RMAN

备份与恢复概述

为了保证数据库的高可 用性,O racle 数据库提供了备份与恢 复机制,以便在数据库 发生故障时完成对数据 库的恢复操作,避免损 失重要的数据资源。 丢失数据可以分为物理 丢失和逻辑丢失。物理 丢失是指操作系统的数 据库组件( 例 如数据文件、控制文件 、重做日志以及归档日 志)丢失。引起物理数据 丢失的原因可能 是磁盘驱动毁损,也可 能是有人意外删除了一 个数据文件或者修改关 键数据库文件造成 了配置变化。逻辑丢失 就是例如表、索引和表 记录等数据库组件的丢 失。引起逻辑数据 丢失的原因可能是有人 意外删除了不该删除的 表、应用出错或者在 DELETE 语句中使用 不 适 当 的 W HERE 子句等。毫无疑问,O racle 能够实现物理数据备份 与逻辑数据备份。 虽然两种备份模式可以 互相替代,但是在备份 计划内有必要包含两种 模式,以避免 数据丢失。物理数据备 份主要是针对如下文件 备份。 □ 数据文件。 □ 控制文件。 □ 归档重做日志。 物理备份通常按照预定 的时间间隔运行以防止 数据库的物理丢失。当 然,如果想保 证能够把系统恢复到最 后一次提交时的状态,必须以物理备份为基础 ,同时还必须有自 上次物理备份以来累积 的归档日志与重做日志 。 备份一个 Omcle 数据库有 3 种标准方式:导出、脱机备份和联机备份。导出方式是数据 库的逻辑备份,其他两种备份方式都是物理文件备份。在 Oracle 中,E X P 和 EXPDP 工具就 是用来完成数据库逻辑备份的,若要恢复需要调用IM P 或 IMPDP 导入先前的逻辑备份文件。 O racle 中 的 导 出 工 具 ( EXPDP 和 EXP)可以读取数据库,并把其 中的数据写入到二

第 备份与恢复 进制形式的 转储文件中 。可以导出 整个数据库 、指定的用 户模式或指 定的表。在导出期 间 ,可以选择 是否导出与 表相关的数 据字典信息 ,如 权 限 、索引和与 其相关的约 束条 件等。 在对数据库 进行导出备 份时,可以 进行完全导 出备份,也 可以进行增 量导出备份 。 增量导出有 两种不同类 型:INCREMENTAL (增量备份)和 CUMNLATIVE (累积备份)。 INCREME NTAL导出 将导出上次 导出后修改 过的全部数 据,而 CUMNLA TIVE导出将导 出上次全导 出后修改过 的数据。E X P 和 EX PD P还可以用 来压缩数据 段碎片。 将数据导出 后,就可 以 通 过 IM P 或 IM PD P工具将其 导入。已导 出的数据不 必导入 到同一个数 据库中,也 不必导入到 生成导出转 储文件相同 的模式中。如果导入一 个全导 出的整个导 出转储文件 ,则所有数 据库对象— —

包括表空间 、数据文件 和用户都会 在导

入时创建。 物理备份就 是复制数据 库中的文件 ,而不管其 逻辑内容如 何。由于使用操作系统的 文件备份命 令,所以这 些备份也称 为文件系统 备份。O racle支持两 种不同类型 的物理文 件备份:脱 机备份和联 机备份。 当数据库正 常关闭时,对数据库的 备份称为脱 机备份。关 闭数据库后 ,可以对如下 文件进行脱 机备份。 □ 所有数据文 件。 □ 所有控制文 件。 □ 所有联机重 做日志文件 。 □ 参 数 文 件 (可 选 择 ) 。 当数据库关 闭时, 对所有这些 文件进行备 份可以得到 一个数据库 关闭时的完 整镜像。 以后可以从 备份中获取 整个文件集 ,并使用该 文件集恢复 数据库。除 非执行一个 联机备 份 ,否 则 当 数 据 库 打 开 时 ,不 允 许 对 数 据 库 执 行 文 件 系 统 备 份 。 当数据库处于 ARCHIVE LOG模式 时,可以对 数据库进行 联机备份。联机备份时 需要先将表 空间设置 为备份状态 ,然后再备 份其数据文 件,最后再 将表空间恢 复为正常状 态。 数据库可以 从一个联机 备份中完全 恢复,并且 可以通过归 档的重做日 志恢复到任 意 时刻。数据 库打开时,可以联机备 份如下文件 。 □ 所有数据文 件。 □ 归档的重做 日志文件。 □ 控制文件。 联机备份具 有两个优点 :第一,提 供了完全的 时间点恢复 ;第二,在 文件系统备 份 时允许数据 库保持打开 状态。因此 ,即使在用 户要求数据 库不能关闭 时也能备份 文件系 统 。保持数据 库打开状态 ,还可以避免 数据库的S G A 区被重新设 置。避免内 存重新设置 可以减少数 据库对物理 I/O 数量的要求 ,从而改善 数据库性能 。 为了简化数 据库的备份 与恢复,O racle提供了 恢复管理器 执行备份和 恢复。

RMAN 概述 R M A N 是 随 O racle服务 器软件一同 安装的O racle工具 软件,它专 门用于对数 据库 进行备份、修复和恢复 操作。如 果 使 用 RM A N作为数据 库备份与恢 复工具,那么所有的 备份和恢复 操作都可以 在R M A N 环 境 下 使 用 R M A N 命令完成,这样可以 减少D B A 在

359

Oracle 1 1 g 中文版数据库管理、应用与开 发标准教程 对数据库进行备份与恢复时产 生的错误,提高备份与恢复的 效率。

∙ - - t 15.2.1

RMAN 组 件 、

_ _________________________________________________________ ______ J

R M A N 是执行备份和恢复操作的客户 端应用程序。最 简 单 的 R M A N 只包括两个组 件 :RM A N命令执行器与目标数据库。D B A 就 是 在 RM A N 命令执行器中执行备份与恢 复操作,然 后 由 R M A N 命令执行器对目标数据库进行 相应的操作。在比较复杂的RMAN 中会涉及到更多的组件,图 15-1显示了一个典型的RM A N 运行时所使用的各个组件。

360

1. RMAN 命 令 执 行 器 (RMAN EXECUTABLE) RM A N 命令执行器提供了对RM A N 实用程序的访问,它 允 许 D B A 输入执行备份和 恢复操作所需的命令,D B A 可以使用命令行或图形用户界 面(G U D 与 R M A N 交互。 开 始 一 个 RM A N 会话时,系统将 为 RM A N 创建一个用户进程,并 在 O racle服务器上启 动两个默认进程,分别用于提 供与目标数据库的连接和监视 远程调用。除此之外,根据 会话期间执行的操作命令,系 统还会启动其他进程。 启 动 R M A N 最简单的方法是从操作系统中 运行R M A N ,不为其提供连接请求参数。 在 运 行 R M A N 之后,再设置连接的目标数据 库等参数。不指定参数启动R M A N 的具体 步骤如下。

命令,可以查看当前R M A N 的配置,具体如下:

团 圆

运行

( 1 ) 在 操 作 系 统 上 选 择 【开始】|【运 行 】命令,当 【运 行 】对话框出现时,在 如 图 1 5 -2 所示的对话框中输 入 R M A N ,然 后 单 击 【确 定 】按钮。 ( 2 )在 出 现 RMAN>提示符窗口后,输 入 SHOW ALL

入 程 序、义 件 采 螳 或 I n tu τ x ∙t 资 18的名 g L Z Z7 ∕ 称 ,1ιnd0 . . 篇为您打并首二 打





[

Q

V

⅜⅞

] |

取清

] [ 朋 ® … ]

运行RAMN命令 图 15-2 一

恢复管理器:Release 11.1.0.6.0 - Production on 星期二 5 月 8 09:15:27 200 Copyright (c) 1982z 2007, Oracle. All rights reserved. RMAN> show all;

备份与恢复

第 15 章

使用目标数据库控 制文件替代恢复目 录 RMAN- 00571; ========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-03002: show 命 令 (在 01/08/2008 09:16:42 ± ) 失败 RMAN-06171: 没有连接到目标数 据库

在 运 行 R M A N 时,还可以指定 连接的目标数据 库、连接用户等 参数。例如,在 【运 行 】对 话 框 中 输 入 RAMN TARGET SYSTEM/NO CATALOG,指 定当前默认数 据库为 R M A N 的目标数据库。 输 入 SHOW A L L 命令显示当前 的配置,因 为 R M A N 连接到了一个 目标数据库,所 以显示了几个配 置信息。具体如 下: RMAN> show all; 使用目标数据库控 制文件替代恢复目 录 db_unique_na me为 O R C L 的 数 据 库 的 R M A N 配置参数为: CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default CONFIGURE BACKUP OPTIMIZATION OFF; # default

2 . 目 标 数 据 库 (TARGET DATABASE) 目标数据库也就 是要执行备份、转储和恢复的数 据库。R M A N 将使用目标数据 库的 控制文件来收 集关于数据库 的相关信息,并 使用控制文件 来存储相关的 R M A N 操作信 息 。另外,实际的 备份和恢复操作 是由目标数据库 中的进程执行的 。 3 . RMAN 恢 复 目 录 (RMAN RECOVER CATALOG) 恢复目录是R M A N 在数据库上建立 的一种存储对象 ,它 由 R M A N 自动维护。当使 用 R M A N 执行备份和恢 复操作时,R M A N 将从目标数据库 的控制文件中自 动获取信息, 包括数据库结 构、归档日志、数据文件备份信 息等,这些信息 都将被存储到 恢复目录中。 4 . RMAN 资 料 档 案 库 (RMAN REPOSITORY ) 在 使 用 R M A N 进行备份与恢复 操作时,需要使 用到的管理信 息和数据称为 RMAN 的资料档案库。R M A N 的资源档案库可 以完全保存在目 标数据库的控制 文件中,也可以 保存在一个可选 的恢复目录中 。资料档案库包 括如下信息。 □ 备份集备份操作输出的所有文件。 □ 备份段备份集中的各个文件。 □ 镜像副本数据文件的镜像副本。 □ 目标数据库结构 目标数据库的控 制文件、 日志文件和数据 文件信息。 □ 配置信息 在覆盖备份集 之前应该将备份 集存储多长时间 、 自动信息等。 5 . 介 质 管 理 子 系 统 (MEDIA MANAGEMENT SUBSYSTEM ) 主要由第三方提 供的介质管理软 件和存储设备组 成,R M A N 可以利用介质管 理软件 将数据库备份到 类似磁带的存 储设备中。 6 . 备 用 数 据 库 (STANDBY DATABASE) 备用数据库是对 目标数据库的一 个精确复制,通 过不断地对应用 由目标数据库生 成 归档重做日志 ,可以保持它与 目标数据库的同 步。R M A N 可以利用备份来 创建一个备用 数据库。 7 .恢复目录数据 库 用来保 存 R M A N 恢复目录的数据 库,它是一个独 立于目标数据 库的Oracle数据 库。

361

Oracle 1 1 g 中文版数据 库管理、应 用与开发标 准教程

•--1 5 .2 .2 ^r L

RMAN 通 道 -、 一《 .一一

R M A N 具有一套配 置参数,这类 似于操作系 统中的环境 变量。这些默认配置将被自 动应用于所 有的RM AN会话, 通 过 SHOW A L L 命令可以查 看当前所有 的默认配置 。 DBA 可以根据自 己的需求,使 用 CONFIGUR E命 令 对 R M A N 进行配置。与此相反,如果要 将某项配置 设置为默认 值,则可以 在CONFIG URE命令中 指定CLEA R关键字。 对 R M A N 的配置主要 针对其通道 进行。R M A N 在执行数据 库备份与恢 复操作时, 都要使用服 务器进程,启动服务器 进程是通过 分配通道来 实现的。当 服务器进程 执行 备份和恢复操作时,只有一 个RMAN会话与分配的服务器进程进行通信,如 图 15-3所示。

362

图 15-3

,通道的使用

一个通道是 与一个设备 相关联的,R M A N 可以使用的 通道设备包 括磁盘( DISK) 和磁带( TAPE)。通道的分配 可以分为自 动分配通道 和R U N 命令手动分 配通道。通常情 况下,D B A 将 R M A N 配置为在执 行BACKUP 、RESTORE等 命令的时候 自动分配通 道。 但是,在更 改通道设备 时,大 多 数 D B A 都会手动分 配需要更改 的通道。实 际上,如果 没有指定通 道,那么将 使用RM A N 存储的自动 分配通道。 1 . 手动分配通 道 手动分配通 道时,必 须 使 用 R U N 命令。在 R M A N 中,R U N 命令会被优 先执行,也 就是说,如 果 D B A 手动分配了 通道,则 RM A N 将不再使用 任何自动分 配通道。 R U N 命令的格式 为: RUN 1命%:

1

当 在 R M A N 命令执行器 中执行类似 于BACKUP > RESTORE或 DELETE等 需要进 行 磁 盘 I /O 操作的命令 时,可以将 这些命令与 ALLOCATE CHANNEL 命令包含在 一个 R U N 命令块内部 。利 用 ALLOCATE CHANNEL 命令为其手 动分配通道 。 例如,下面的 语句手动分 配了一个名 称为C H 1 的通道,通过这个通 道创建的文 件都 具有统一的 名称格式F:\ORACLE-B ACKUP\%U _%C.BAK,随 后利用这个 通道对表空 间 SYSTEM和 USERS进行 备份。

第 15 章 备 份 与 恢 复 --------------- 三

RMAN> run{ 2> allocate channel chi device type disk 3> format= , f :\oracle_bac kup\%u_%c.ba k , ; 4> backup tablespace system,users channel chi; 5> }

释放的通道:ORA_D] : SK_ : L 释放的通道:ORA_D 工SK_2 释放的通道:ORA_D1SK_3 分配的通道: c h f 通 道 chi: S I D = 1 3 2 设备类型=D 工SK 启动 backup 于 09-5 月 -08 通 道 c h i : 正在启动全部数据文件备份集 通 道 c h i : 正在指定备份集内的数据文件 输入数据文件:文件号=00001 名称= D :∖APP ∖USER ∖ORADATA ∖ORCL ∖SYSTEM01.DBF 输入数据文件:文件号=00004 名称= D :∖APP ∖USER ∖ORADATA ∖ORCL ∖USERS01.DBF 通 道 c h i : 正在 启动 段 1 于 09-5 月 -08 通 道 c h i : 已 完 成 段 1 于 09-5 月 - 0 8 , 有 2 个副本和标记 TAG20080109T102841 段 handle=F:\ORACLEBACKUP\03J5NDQP_l comment=NONE 段 hand.le=F:\ORACLEBACKUP\03J5NDQP_2 comment=NONE 通 道 c h i : 备份集已完成,经过时间 :00:01735 完成 backup 于 09-5 月 -08 启动 Control File and SPFILE Autobackup 于 09-5 月 -08 段 handle=D:\APP\USER\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\2008_01_ 09\O1_MF_S_643545027_3R8 DGFG5_.BKP comment=NONE

完成 Control File and SPFILE Autobackup 于 09-5 月 -08 释放的通道: chi

在 RMAN 中执行每一条 BACKUP、CO PY, RESTORE, DELETE 或 RECOVER 命 令时,要求每 个命令至少使 用一个通道。 2 . 自动分配通道 在下面两种情 况下,由于没 有手动为R M A N 命令分配通道 ,R M A N 将利用预定义 的设置来为命 令自动分配通 道。 □ 在 R U N 命令块外部使 用BACKUP、RESTORE、D E LETE命令。 □ 在 R U N 命令块内部执 行BACKUP等 命令之前,未 使 用 ALLOCATE CHANNEL 命令手动分配 通道。 例如: RMAN>backup tablespace users; 2>run {restore tablespace examples;}

在使用自动分 配通道时,RM A N 将根据下面这 些命令的设置 自动分配通道 。 □ □ □ □

CONFIGURE DEVICE TYPE SBT/DISK PARALLELISM N o CONFIGURE DEFAULT DEVICE TYPE TO DISK∕SBT o CONFIGURE CHANNEL DEVICE TYPE o CONFIGURE CHANNEL N DEVICE TYPE o

363

Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 CONFIGURE DEVICE TYPE…PARALLELISM n 命令定义了 RMAN 使用的通道数 量 。例 如 ,下面的命令分 配了3 个磁盘通道和2 个磁带通道。 RMAN>configure device type disk parallelism 3; RMAN>configure device type sbt parallelism 2;

在指定自动通道 数量时,各 个 通 道 的 取 名 格 式 为 ORA_DEVICE TYPE_N。其中 , DEVICETYPE 为设备类型,N 为通道号。例如 ,在上面分配商 通道中,各虚道 的名称依 次为 ORA DISK 1、ORA DISK 2 、ORA DISK 3、ORA SBT 1 和 ORA SBT 2 。另夕卜, 管理员可以运行 SHOW DEVICE T Y PE命令查看并行 度的默认设置。 命 令 CONFIGURE DEFAULT DEVICE TYPE TO DISK/SBT用于 指定自动通道的 默 认设备。例如, 当数据库使用磁 盘备份时,可以 进行如下设置: RMAN>configure default device type to disk;

命 令 CONFIGURE CHANNEL DEVICE TY PE用于设置自动 通道的参数。例 如: RMAN>configure channel device type disk format= , ∕backup∕%U , maxpiecesize 200M; RMAN>configure channel device type sbt format='∕store∕%U.dbf , maxpiecesize 200M;

364

其中,FORM AT参数用于指 定备份集的存储 目录及格式,M AXPIECESIZE 指定每 个备份集的最大 字节数。 也可指定某一个 通道的配置,例 如,设置 通 道 ORA_SBT_2的 参数。 RMAN>configure channel 2 device type sbt format='%s_%t .dbf , maxpiecesize 200M

清除自动分配通 道设置,将通道 清除为默认状态 。清除命令的格 式如下。 □ □

CONFIGURE DEVICE TYPE DISK CLEAR o CONFIGURE DEFAULT DEVICE TYPE CLEAR。



CONFIGRUE CHANNER DEVICE TYPE DISK/SBT CLEAR. 3 . 通道配置参数 无论是自动通道 还是手动通道,每一个通道都可 以设置一些参数 ,以控制通道备份

时备份集的大小 。通道配置参数 包括如下几个。 □

FILESPERSET 参数

该 参 数 用 于 限 制 B A C K U P 时备份集的文件 个数。例如 ,分配一个自动 通道,并限 制该通道每两个 文件备份成为一 个备份集。 RMAN>backup database filesperset=2;



#指定每两个文件 备份为一个备份集

CONNECT 参数

CONNECT参数 用于设置数据库 实例,R M A N 充许连接到多个 不同的数据库实 例上。 例如,定义了 3 个磁盘通道,分 别连接 3 个数据库实例O rach O rac2和 Orac30 RMAN>configure channel 1 device type disk connect='sys∕passwc80racl' ; RMAN>configure channel 2 device type disk connect='sys∕ passwcΘOrac2 , ; RMAN>configure channel 3 device type disk connect= ,sys/passwc@0r ac3 , ;



15 I 备 份 与 恢 复 --------------- ^ □ FORMAT 参数 FORM AT参数用于设 置备份文件存 储格式以及存 储目录。在 定 义 FORM AT的格式 时,可 以 在 BACKUP语句 中定义,也可 以在通道CHA NNEL语句中 定义。例如: RMAN>backup database format '∕oracle∕backup∕%U, ;

或者如下: run{ allocate channel allocate channel allocate channel backup database;

chi device type ch2 device type ch3 device type

disk format , ∕diskl∕%d^a ckups∕%U , ; disk format , /disk2/%d_backups/%U'; disk format , /disk3/%d_backups/%U,;

}

FORMAT格式 化字符串以及 各字符的意义 如表15-1所示 。 =: : ⅜ 15-1

I 字符串

τ

FORMAT 格式字符串

说明

字符串

说明

%c

表示备份段中的文件备份段号

%d

指定数据库名

%D

以 D D 格式显示日期

%M

以 M M 格式显示月份

%Y

以 Y Y Y Y 格式显示年度

%F

结合数据库标识DBID 、日、月、年及 序列构成的唯一的自动产生的名称

%n

字符串在数据库 名右边添加若干 字 母 构 成 8 个字符长度的字符串,如 oral 1 g 自动形成为o ra ll g XXX

%p

文件备份段号,在备份集中的备份文件 片编码,从 1 开始每次增加 1

%s

备份集号,此数字是控制文件中随备 份集增加的一个计数器,从 1 开始

%t

指定备份集的时间戳,是一个 4 字节值 的秒数值。%t 与%s 结合构成的唯一的 备份集名称

%T

指定年、 月、日, 格式为 YYYYMMDD

%u

指定备份集编码 及备份集创建的 时间 构成的 8 个字符的文件名称

%U

指定 一 个 便 于 使 用 的 由 % u_%p_%c 构成的确保不会 重复的备份文件 名 称,RM A N 默认使用%U 格式

%%

指定字符串"%",如%% Y 表示为%Y

□ 参 数 RATE 参 数 RATE用于设 置通道的I /O 限制。 自动分配通道时,可以按如下方法设置: configure channel 1 device type disk rate 200k; configure channel 2 device type disk rate 300k;

MAXSETSIZ E 参数 参 数 MAXSETSIZ E用于配置备份 集的最大尺寸 。



RMAN> configure maxsetsize to 1G;

□ MAXPIECESIZE 参数 默认情况下一 个备份集包含 一个备份段,通过配置备份 段的最大值,可以将一个备 份集划分为几 个备份段。MAXPIECES IZE参数用于配 置备份段的最 大大小,设置自动通

365

Oracle 1 1 g 中文版数据 库管理、应用与开发标 准教程 道的方法如下: RMAN> configure channel device type disk maxpiecesize 500M;

R M A N 的操作命令 非常简单,也 无特定的技 巧,只需要理 解各个命令 的含义,就可 以灵活使用 。本节将介绍 一些RM A N 中的基本命 令,以及如何 利用这些基 本命令来完 成 各种操作。 1 . 连接到目标 数据库 在 使 用 R M A N 时,首先需 要连接到数 据库。如 果 R M A N 未使用恢复 目录,则可以 使用如下形 式的命令连 接到目标数 据库: $rman nocatalog $rman target sys∕nocatalog' $rman target ∕ connect target sys∕ρassword©网络连接串

366

如 果 目 标 数 据 库 与 R M A N 不在同一台 服务器上时 ,必 须 使 用 “@网 络 连 接 串 ”的 方法。 如 果 为 RM A N 创建了恢复 目录,则可以按如 下几种方法 连接到目标 数据库。如果目 标数 据库 与R M A N 不在同一个 服务器上,则需要添加 网络连接串 。 $rman target /catalog rman∕rmanΘrman $rman target sys/change_on_install catalog rman/rman connect catalog sys/passwd@网络连接串

在 RM A N 连接到数据 库后,还需要注册 数据库。注册数据库 就是将目标 数据库的控 制文件存储 到恢复目录 中,同一个 恢复目录只 能注册一个 目标数据库 。注册目标数 据库 所使用的语 句为REGIS TER D A TA B A SE,例如: C:∖>rman target system/admin catalog rman/manager 恢复管理器: Release 11.1.0.6.0 - Production on 星期五 5 月 9 16:06:33 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. 连逐到目标数 据库:ORCL (DBID=1168250550) 连接到恢复目 录数据库 RMAN> register database; 注册在恢复目 录中的数据库 正 在 启动 全部 恢复 目录 的 resync 完 成 全 部 resync

到这里为止 ,RM A N 恢复目录与 目标数据库 已经连接成 功。如果要取 消已注册的 数 据库信息,可 以 连 接 到 R M A N 恢复目录数 据库,查 询 数 据 库 字 典 D B , 获 取 DB_KEY 与 DB」D , 再 执 行 DBMS_RCV CAT.UNRE GISTERDA TABASE命令 注销数据库 。 C :∖>sqlplus rman/manager

备份与恢复 SQL*Plu s: Release 11.1.0.6.0 - Production on 星期五 5 月 9 16:14:54 2008 Copyright (c) 1982, 2007, Oracle. All rights reserve d.

连接到: Oracle Database 11g Enterprise Edition Release 11.1.0. 6.0 - Production With the Partitioning, OLAP, Data Mining and Real Applica tion Testing options SQL> select * from db; DB_ID

DB__KEY

CURR_DBINC_KEY

1 1181003783 2 SQL> exec dbms_r cvcat.u nregis terdata base(1, 1181003783); P L / S Q L 过程已成面完成。

为了维护 恢复目录 与目标数 据库控制 文件之间 的同步, 在 RM A N 连接到目 标数据库 之后,必 须 运 行 RESYNC CATAL OG命令 ,将目标 数据库的 同步信息 输入到恢 复目录。 RMAN>resync catalog;

如果目标 数据库中 的表空间 、数据文 件发生改 变,则必 须进行一 次同步化

过程。除 手动同步 外,还可 以增加参 数CONTROL FILE RECOR D_KEE P_TIME 设置同步 时间, 该参数默 认为7 天 ,即 每 7 天系统自 动同步一 次。 2 . 启动与关 闭目标数 据库 在 R M A N 中对数据 库进行备 份与恢复 ,经常需 要启动和 关闭目标 数据库。 RM A N 也提供了 一些与S Q L 语句完全 相同的命 令,利用 这些命令 可以在R 启动或关 闭数据库 。启动和 关闭数据 库的命令 包括:

因此, M A N 中直接

RMAN>shutdown immediate; RMAN>startup; RMAN>startup mount; RMAN>startup pfile= 'd:∖apρ∖oracle∖product ∖initora llg.ora , ; RMAN>alter database open;

§

使 用 RMA N备份数据库

使 用 R M A N 备份为数 据库管理 员提供了 更灵活的 备份选项 。在 使 用 RM A N 进行备 份时,D B A 可以根据 需要进行 完全备份 (FULL BA CK U P)与增量 备份(IN CREME NTAL BACKU P)、联机 备份和脱 机备份。

R M A N 可以进行 的两种类 型的备份 ,即 完 全 备 份 (FULL B A C K U P )和增量 备份 (INCRE MENTA L BACKU P)。在进 行完全备 份时,R M A N 会将数据 文件中除 空白数据 块之外的 所有数据 块都复制 到备份集 中。需要注意 ,在 R M A N 中可以对 数据文件 进行完 全备份或 者增量备 份,但是 对控制文 件和日志 文件只能 进行完全 备份。

367

Oracle 11g中文版数据库管理、应用 与开发标准教程 与完全备份相反,在进行增量备份时R M A N 也会读取整个数据文件,但是只会备份 与上一次备份相比发生了变 化的数据块。RM A N 可以对单独的数据文件、表 空间,或者 整个数据库进行增量备份。

在 使 用 R M A N 进行数据库恢复时,既可以利用归档重做日志文件,也可以使用合适的增 量备份进行数据库恢复。

使 用 RM A N 进行增量备份可以获得如下 好处。 □ 在不降低备份频率的基础上 能够缩小备份的大小,从而 节省磁盘或磁带的存储 空间。 □ 当数据库运行在非归档模式 时,定时的增量备份可以提 供类似于归档重做日志 文件的功能。

如果数据库处于 NOARCHIVELOG 模 式 ,则只能执行一致的增量备份,因此数据库必须 关闭; 而 在 ARCHIVELOG 模 式 中 ,数据库可以是打开的,也可以 是关闭的.

368

在 R M A N 中建立的增量备份可以具有 不同的级别( L e v e l ) ,每个级别都使用一个不 小 于 0 的整数来标识,例 如 级 别 0 、级 别 1 等 。 级 别 为 0 的增量备份是所有增量备份 的基础,因为在进行级别为0 的备份时,RMAN 会将数据文件中所有已使用 的数据块都复制到备份集中 ,类似于建立完全备份,级别大 于 0 的增量备份将只包含与前一 次备份相比发生了变化的数 据块。 增量备份有两种方式:差异 备份与累积备份。差异备份 是默认的增量备份类型,它 会备份上一次进行的同级或 者低级备份以来所有变化的 数据块。而累积备份则备份上 次 低级备份以来所有的数据块 。例如,周一进行了一次2 级增量备份,周 二 进 行 了 一 次 3 级增量备份,如果周四进行 3 级差异增量备份时,那么只 备份周二进行的3 级增量备份 以后发生变化的数据块;如 果 进 行 3 级累积备份,那么就会备份 上次2 级备份以来变化 的数据块。 图 15-4显示了一系列差异增量 备份的情况,在该备份策略中 ,一周之内各天的备份 方法如下。 □ 每周日进行一次0 级增量备份,R M A N 将对数据文件中所有非空白 的数据块进 行备份。 □ 每周一进行一次级别为2 的差异方式增量备份。 由于不存在任何最近一次建立 的级别 为 2 或 级 别 为 1 的增量备份,RM A N 将会与周日建立的0 级增量备份相 比较,保存发生变化的数据 块,即备份周日以后发生变 化的数据。 □ 每周二进行一次级别为2 的差异增量备份。R M A N 只会与周一建立的级别为2 的增量备份相比较,保存 发 生 变 化 的 数 据 块 ,即备份从周一开始发生变 化的 数据。 □ 每周三进行一次级别为2 的差异增量备份。R M A N 将与周二建立的级别为2 的 备份进行比较,保存发生变 化的数据块,即备份从周二 开始发生变化的数据。

X 备份与恢复 □ 每 周 四 进 行 一 次 级 别 为 1 的 差异增 量备份 。RM A N 将 保 存 与 周 日 建 立 的 0 级增 量 备 份 相 比 发 生 变 化 的 数 据 块 ,即 备 份 从 周 日 以 来 发 生 变 化 的 所 有 数 据 块 , 包 括 周 一 、周 二 、周 三 发 生 变 化 的 数 据 决 。该 处 备 份 的 好 处 为 :如 果 周 五 发 生 故 障 ,则 只 需 要 利 用 周 四 的 1 级 备 份 和 周 日 的 0 级 备 份 ,即可以完 成对数据库 的 恢 复 。, □ 每 周 五 进 行 一 次 级 别 为 2 的 差异 增量备 份。RM A N 将 把 与 周 四 建 立 的 1 级增量 备 份 相 比 发 生 变 化 的 数 据 块 保 存 到 备 份 集 中 ,即 只备 份从周 四开始发生 变化的 数据。 □ 每 周 六 进 行 一 次 级 别 为 2 的 差 异增 量备份 。 R M A N 只备份从周 五开始发生 变化 的数据。

图 15-4

,不同级别的 差异增量备份

在 相 同 的 情 况 下 ,累积 方式 的 备 份 集 通 常 要 比 差 异 方 式 的 备 份 集 大 ,因为它使 用比 自己低 一个级别的 增量备份作 为比较基准 ,而不是像 差异增量 备份那 样使用 与自 己同级 别的增量备份作为比较基准。 图 15-5 显 示 了 累 积 增 量 备 份 的 情 况 ,该 备 份 策 略 在 一 周 内 的 备 份 情 况 如 下 。 □ 每 周 日 进 行 一 次 。级 累 积 增 量 备 份 。这 时 RM A N 将对数据文 件 中所有 非空 白数 据块进行备份。 □ 每 周 一 进 行 一 次 2 级 累 积 增 量 备 份 。 由 于 不 存 在 任 何 最 近 一 次 建 立 的 1 级增量 备 份 ,R M A N 将 周 日 的 0 级 增 量 备 份 作 为 基 准 ,保 存 之 后 发 生 变 化 的 数 据 块 , 即 备 份 从 周日 以来发 生变化 的数 据。 □ 每 周 二 进 行 一 次 2 级累 积 增 量 备 份 。 由 于 不 存 在 任 何 最 近 一 次 建 立 的 级 别 为 1 的 增 量 备 份 ,R M A N 将 以 周 日 建 立 的 0 级 备 份 作 为 基 准 ,保存发生 变化的数据 块 ,即 备 份 从 周 日 开始 发生变 化的数 据。需 要 注 意 ,在 周 二 建 立 的 2 级增量备 份 中 实 际 上 包 含 了 周 一 的 2 级 增 量 备 份 ,因此这种 增量备份方 式称 为累 积方式 。 □ 每 周 三 进 行 一 次 2 级累 积 增 量 备 份 。 由 于 不 存 在 任 何 最 近 一 次 建 立 的 1 级增量 备 份 ,R M A N 将 以 周 日 建 立 的 0 级 增 量 备 份 为 基 准 ,即 备 份 从 周 日 以 来 发 生 变 \ 化的数据。 □ 每 周 四 进 行 一 次 1 级累 积 增 量 备 份 。 RM A N 将 以 周 日 建 立 的 0 级增量备份 为基 准 ,保 存 之 后 发 生 变 化 的 数 据 。 □ 每 周 五 进 行 一 次 2 级累 积 增 量 备 份 。 由 于 存 在 最 近 一 次 级 别 为 1 的 增 量 备 份 ,

R M A N 将 以 周 四 建 立 的 增 量 备 份 为 基 准 ,将之后发 生变 化的数 据块复 制到 备份 集 中 ,即 备 份 从 周四 以来发 生变 化的数 据。

--------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 □ 每周六进行一次级 别为2 的累积增量备份。R M A N 将 以 周 四 建 立 的 1 级增量备 份为基准,备份之后 发生变化的数据块 ,即备份周四以来发 生变化的数据。

C

f

370

图 15-5

,不同级别的累积增量备 份

1 5 .3 .2 使 用 RMAN 备 份 数 据 库 文 件 和 归档 日 志 ) 当数据库打开时,可 以 使 用 RMAN BACKUP命令备份 如下对象。 □ 数据库。 □ 表空间。 □ 数据文件。 □ 归档重做日志。 □ 控制文件。 □ 备份集。

BACKUP 命令只能对数据文件、归档重 做日志文件和控制文件 进行备份,如果要对 其他重要的数据文件进 行备份,则可以在操 作系统中对其进行物理 备份。

在 使 用 B A C K U P命令备份数据文件 时,可以为其设置参 数定义备份段的文 件名、 文件数和每个输入 文件的通道。 1 . 备份数据库 如果备份操作是在数 据库被安全关闭之后 进行的,那么对整个 数据库的备份是一致 的;与之相对应,如 果是在打开状态下对 整个数据库进行的备 份,则该备份是非一 致的。 非一致性备份整个 数据库的操作步骤如 下。 (1) 启 动 R M A N 并连接到目标数据 库,输入BACKUP DATABASE命令备 份数据库。 在 BA CK UP命令中可以指定 FORMAT参数,为 R M A N 生成的每个备份片段 指定一个 唯一的名称以及存 储的位置。 C:∖>rman target system/admin nocatalog RMAN> backup database format , f :\oracle_backup\orallg_%Y_%M_%D__%U.bak, maxsetsize=2G;

还 可 以 为 BACKUP命 令 指 定 TA G 参数,为备份片段 定义备份标签。例如: RMAN>backup database tag= ,weekly backup , ;

( 2 )如果建立的是非一 致性备份,那么必须 在完成备份后对当前 的联机重做日志进 行归档,因为在使 用备份恢复数据库时 需要使用当前重做日 志中的重做记录。

备份与恢复 RMAN>sql,alter system archive log current, ;

( 3 ) 在 R M A N 中执行LIST BACKUP OF DATABASE命令,查看建立的备 份集与备 份片段的信息。 RMAN> list backup of database;

如果需要对整个数据库进行一致性 备份,则首先需要关闭数据库,并启动数据库到 M OUNT状态。例如: RMAN>shutdown immediate RMAN>startup mount RMAN>backup database format=,f :\oracle_backup\%d_%s.bak, ; RMAN>alter database open;

如果想要对某个表空间以外的整个 数据库进行备份,则可以使用如下 一组命令: 〃设定在备份数据库的时候排除 USER01; RMAN>configure exclude for tablespace userOl; RMAN>backup database format=, f:∖oraclebackup \%d_%s.bak, ; RMAN>sql ,alter system archive log current, ;

2 . 备份表空间 当数据库打开或关闭时,RM A N 还可以对表空间进行备份。但是,所有打开的数据 库备份都是非一致的。如 果 在 R M A N 中对联机表空间进行备份,则不需要在备份前执行 ALTER TABLESPACE--BEGIN BACKUP语句将表空间设置为备 份模式。 执行表空间备份的具体步骤如下。 ( 1) 启 动 R M A N 并连接到目标数据库,在 R M A N 中 执 行 BACKUP TABLESPACE 命令。例如,下面的示例将使用手 动分配的通道对两个表空间进行备 份。 C:∖>rman target system/admin nocatalog RMAN〉 run{ 2> allocate channel chi type disk; 3> 4> 5>

backup tablespace example,userθl format , f :\oracle_backup\%d_%p_%t_%c.dbf , ; } -

( 2 ) 执 行 LIST BACKUP OF TABLESPACE命令查看建立的表 空间备份信息。 RMAN> list backup of tablespace example,userOl;

3 . 备份数据文件及数据文件的复制文 件 在 R M A N 中可以使用BACKUP DATAFILE命令对单独的数据文件 进行备份,备份 数据文件时既可以使用其名称指定 数据文件,也可以使用其在数据库 中的编号指定数据 文件。另外,还 可 以 使 用BACKUP DATAFILECOPY命令备份数据文 件复件。 备份数据文件及数据文件的复制文 件的语法为: RMAN> backup datafile 1,2,3 filesperset 3; RMAN>backuρ datafilecopy '\oracle backup\copy\df.cop , ;

查看备份结果:

371

Oracle 1 1 g 中文版数据库管理、应用与开发标 准教程 RMAN>list backup of datafile 1,2,3;

4 . 备份控制文件 在 R M A N 中 对 控 制 文 件 进 行 备 份 的 方 法 有 很 多 种 ,最 简 单 的 方 法 是 设 置 CONFIGURE CONTROLFILE AUTOBACKUP 为 O N ,这样将启动 RMAN 的自动备份功 能。启动控制文件的自动备份功能 后,当 在 R M A N 中 执行BACKUP或 C O PY 命令时, R M A N 都会对控制文件进行一次自动备份 。 如果没有启动自动备份功能,那么 必须利用手动方式对控制文件进行 备份。手动备 份控制文件的方法有如下几种: RMAN>backup current controlfile; RMAN>backuρ tablespace users include current controlfile;

在完成对控制文件的备份后, 可以利 用 LIST BACKUP OF CONTROLFILE命令来查 看包含控制文件的备份集与备份段 的信息。例如: RMAN>list backup of controlfile;

" ⅛⅛ 一,餐’ ”

整«

5 . 备份归档重做日志

372

归档重做日志是成功进行介质恢复 的关键,需要周期性地进行备份。在 R M A N 中, 可 以 使 用 BACKUP ARCHΓVELOG命 令 对 归 档 重 做 日 志 文 件 进 行 备 份 ,或者使用 BACKUP PLUS ARCHIVELOG命令,在对数据文件 、控制文件进行备份的同时备份。 当 使 用 BACKUP ARCHIVELOG命令来对归档重做日 志文件进行备份时,备份的结 果为一个归档重做日志备份集。 如果将重做日志文件同时归档到多 个归档目标中,RMAN 不会在同一个备份集中包含具有相 同日志序列号的归档重做日志文件 ,一 般情况下, BACKUP ARCHIVELOG A L L 命令会对不同日志序列号备份一个 复件。 可 以 在 BACKUP命令中定义DELETE INPUT参数,在备份以后删除归档 日志。这 样 ,管理员可以将归档日志备份到磁带 上,并清除磁盘上旧的日志。如果定义了 DELETE ALL INPU T参数,则 RM A N对每个特定的日志序列执行备份 ,同时删除备份的归档重 做日志。 使 用 BACKUP ARCHIVELOG命令备份归档重做 日志的步骤如下。 ( 1 ) 启 动 RM A N 后 ,在 R M A N 中运行BACKUP ARCHIVELOG命令,下面的示例 将使用配置的通道备份归档日志文 件到磁带上,并删除磁盘上的所有 复件。 RMAN> backup archivelog all delete all input;

在 使 用 BACKUP ARCHIVELOG A L L 命令进行备份时,RM A N 会在备份过程中进 行一次日志切换,因此备份集中将 包含当前联机重做日志。 需要注意,在备份归档日志时,还 可以限制备份的归档重做日志文件 的范围。可以 指定的范围包括时间范围、顺序号 范围或S C N 范围。例如,下面的语句将对一周前 生成 的归档日志文件进行备份。 RMAN> backup archivelog from time 'sysdate-8' 2> until time 1 sysdate-1 , ;



15 备份与恢复 ( 2 ) 可以 使 用 LIST BACKUP OF ARCHIVELOG A L L 命令,查看包含归档 重做日志 文件的备份集 与备份片段信 息。 RMAN> list backup of archivelog all;

在对数据库、控制文件或其 他数据库对象 进行备份时,如 果 在 B A C K U P 命令中指 定了 PLUS ARCHIVEL OG参数,也 可以同时对归 档重做日志文 件进行备份。例如,下 面的语句在备 份整个数据库 时对归档重做 日志文件进行 备份。 backup database plus archivelog;

为了避免灾难 、介质破坏或 者人为操作失 误所带来的损 失,可以维护 备份的多个复 件 。在 R M A N 中可以通过如 下几种命令形 式对数据库进 行多重备份。 □ 在 R M A N 中执行BAC KUP命令时 使用 COPIES参数 指定多重备份 。 □ 在 R U N 命 令块中使用 SET BACKUP COPIES命令 设置多重备份 。 □ 通 过 CONFIGURE -∙-BACKUP COPIES命令 配置自动通道 为多重 backup copies 2 tablespace , EXAMPLE , 2> format , f :\oracle_ba ckup\oracle llg_%d_%c.bak , , ,e :\oracle_backup\ oraclellg_% d_%c.bak,;

利 用 LIST BACKUP SUMMARY 命令查看所有 备份集的信息 ,从这里可以看 出各备 份段的副本数 量。 在 一 个 R U N 命令块中,通 过 设 置 SET BACKUP COPIES命令 控制多重备份 的数量。 例如: RMAN> run{ 2> set backup copies=3; 3> backup device type disk 4> format 'f :\oracle_ba ckup\oracle llgj%d_%c.b ak , ,e :\orcle_backup\ z oraclellg- %d- %c.bak , , 5> 'd:\orcle_b ackup\oracl ellg_%d_%c.b ak , 6> tablespace users; 7> }

CONFIGUR E∙∙∙BACKUP CO PIES命令配置 自动通道的备 份数量的语句 形式如下: CONFIGURE CONFIGURE CONFIGURE CONFIGURE

∙-

DEVICE TYPE disk PARALLELISM 1; DEFAULT DEVICE TYPE TO disk; DATAFILE BACKUP COPIES FOR DEVICE TYPE disk TO 2 ; ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE disk TO 2;

15.3.4 在 R M A N 中可以通过增 量备份的方式 对整个数据库 、单独的表空间 或单独的数据 文



Oracle 1 1 g 中文版数据库管理、应用与 开发标准教程 件进行备份。如果数据库运 行在归档模式下时,既可以 在数据库关闭状态下进行增 量备 份 ,也可以在数据库打开状态 下进行增量备份。而当数据 库运行在非归档模式下时,则 只能在关闭数据库后进行增 量备份,因为增量备份需 要使用S C N 来识别已经更改的数 据块。 例如,下面的语句对SYST EM、SYSAUX和 U SERS表空间进行了一次。级差异增 量备份。

/

RMAN> run{ 2> allocate channel chi type disk; 3> backup incremental level=0 4> format , f :\oracle_backup\oraclellg_%M_%D__%c.bak* 5> tablespace system,sysaux,users; β> )

而下面的语句将为SYSTE M表 空 间 进 行 1 级增量备份。 RMAN> backup incremental level=l 2> format , f :\oracle_backup\oraclellg_%Y_%M_%D_%c.bakf 3> tablespace system;

374

如果 仅 在 BACKUP命令中指定INC REMENTAL参数,默认创 建的增量备份为差异 增量备份。如果想要建立累 积增量备份,还 需 要 在 BACKUP命令 中 指定 CUMULATIVE 选项。例如,下面的命令将 对表空间EXAMPLE进 行 2 级累积增量备份。 RMAN> backup incremental level=2 cumulative tablespace example 2> format , f :∖oracle- backup∖oraclellg- %T- %c.bak , ;

.--1 5 3 5 镜像复制、 , 在 R M A N 中还可以使用C O P Y 命令创建数据文件的镜像准 确副本,C O P Y 命令可 以处理数据文件、归档重做 日志文件和控制文件副本。 当 在 R M A N 中 使 用 C O P Y 命令 创建文件的镜像副本时,它 将复制所有的数据块,包括 空闲数据块。这与使用操作 系统 命令复制文件相同,不 过 RM A N 会检查创建的镜像副本是否 正确。 镜像副本可以用作完全或 增量备份策略的一部分,但是在增量备份策略中, 因为 C O PY 命令复制了所有数据块,所 以 只 能 在 0 级增量备份上创建。C O PY 命令的基本语 法如下: copy [full | level 0] to ;

其 中 ,INPUT F I L E 是被备份的文件,主要包括 :DATAFILE、A R CH IV ELOG和 CURRENT CONTROLFILEo如前所说 ,镜像副本可以是一个完全 备份,也可以是增量 备份策略中的0 级增量备份。如果没有指定 备份类型,则默认 为FULL。 使 用 C O PY 命令备份数据库时,具体的 操作步骤如下。 ( 1) 在 R M A N 中 使 用 REPORT获取需要备份的数 据文件信息。 RMAN> report schema;

(2 ) 使 用 C O PY 命令对数据文件进行备份。

RMAN> copy 2> datafile 1 to , f :\oracle_backup\tbs_l.cpy , r 3> datafile 2 to 'f :\oracle_backup\tbs_2.cpy , , 4>current controlfile to f :\oracle backup\controlyfile 01.cpy , ;

( 3 ) 使 用 LIST COPY OF DATABASE命令查看镜像复制备份的信息。 RMAN> list copy of database;



R M A N 完全恢复 RMAN作为一个管理备份和恢复的Oracle实用程序, 在使用它对数据库执行备份后,

如果数据库发生故障,则 可 以 通 过 R M A N 使用备份对数据库进行恢复。在 使 用 RMAN 进行数据恢复时,它可以自动确定最合适的一组备份文件,并使用该备份文件对数据库 进行恢复。根据数据库在恢复后的运行状态不同,O racle数据库恢复可以分为完全数据 库恢复和不完全数据库恢复。完全数据库恢复可以使数据库恢复到出现故障的时刻,即 当前状态;不完全数据库恢复使数据库恢复到出现故障的前一时刻,即过去某一时刻的 数据库同步状态。

15.4.1

RMAN恢 复 机 制 -、

_ ______ __________________________________ ______________________ _

_____/

R M A N 完全恢复是指当数据文件出现介质故障后,通 过 R M A N 使用备份信息将数 据文件恢复到失败点。图 15-6显示了完全恢复的过程,从图中可以看出,对数据库进行 恢复大致分为两个步骤。 被损坏的数据文件

图 15-6

修复后的数据文件

一归档模式下的完全恢复

( 1 ) 发生介质故障后,利用备份修复被损坏或丢失的数据文件,假设图中数据文件

375

Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 3 被损坏。 ( 2 )修复数据文件3 后 ,因为被修复的数据 文件与其他数据文件 相比要“旧” ,所以 这时数据库中的数 据文件并不同步(文件头部信息中的 检查点号S C N 不同)。由于数据 文件之间不一致,所以数据库仍然无法 打开,这时就需使用归档日 志对数据库进行恢复 。 恢复过程又包含两个 主要步骤:缓存恢复 和事务恢复。在缓存 恢复完成后,数据库即可 打开;但此时数据库 中可能含有要提交的 事务,因此,在事务 恢复后,将提交所有 的事 务 ,使数据库进入一致 状态。 &

上 面 的 恢 复 操 作 仅 适 用 于 归 档 模 式 下 的 数 据 库 ,如 果 数 据 库 运 行 在 非 归 档 模 式 下 ,那 么 , 即 使 只 损 坏 或 丢 失 了 一 个 数 据 文 件 ,也 必 须 使 用 全 数 据 库 脱 机 备 份 进 行 修 复 ,然 后 不 经 恢 复 j 过程直接打开数据库。

376

正是由于归档日志中 记录了数据库的所有 修改操作,从而保证 了在数据库出现介质 故障后,使用归档日 志和备份就可以将数 据库恢复到最近的状 态。 在 R M A N 中 使 用 RESTORE命令修复 数据库时,R M A N 将启动一个服务器进 程来 完成将磁盘中的备份 集或镜像副本修复数 据文件、控制文件以 及归档重做日志文件 这一 任务。在 使 用 RM A N 进行数据库修复时,可以根据出现的故障 ,选择修复整个数据 库、 单独的表空间、单独 的数据文件、控制文 件以及归档重做日志 文件。例如,如果需要修 复表 空 间 USERS, RM A N将从备份集或镜像 副本中查找U SER S表空间的备份,然后将 它复制到控制文件指 定的位置。 使 用 R M A N 进行修复操作时,R M A N 会通过恢复目录或者 目标数据库的控制文 件 来获取所有的备份,并从中选择最合适的 备份来完成恢复操作 。RM A N选择备份的准则 为:距离恢复目标时 刻最近的备份;并优 先选用镜像副本。当 执 行 RESTORE命令进行 恢复时,如 果 R M A N 没有找到符合要求的 备份,则 R M A N 将返回一个错误。在完成对 数据库的修复后,还 需要对数据库进行恢 复,恢复就是为数据 文件应用联机或归档 重做 日志,从而将修复的 数据库文件更新到当 前时刻或指定时刻下 的状态。 图 15-7显示了利用RM A N 进行介质恢复的全部 过程。首 先 D B A 执 行 RESTORE命 令 ,这 时 R M A N 从恢复目录或目标数 据库的控制文件中获 取备份的相关信息,在图中使 用恢复目录中保存的 资料档案库,恢复目录从目标数据 库的控制文件中获取 所需的信息, 并根据资料档案库中 的信息决定采用哪些 备份集或镜像副本来 修复数据库。



图 15-7

: RMAN 介 质恢复过程

备份 与 恢复 ----------然后,D B A 执 行 RECOVER命令 对数据库进行恢 复,这 时 RM A N 将使用归档重做 日志文件或增量 备份来对数据库 进行介质恢复,R M A N 是调用目标数据 库中的一个服务 进程来执行实际 的修复与恢复操 作的。

♦ - 1 5 .4 .2 恢 复 处 于 NOARCHIV ELOG模 式 的 数 据 库 〕 当数据库处于NO ARCHIVELOG模 式时,如果出现介质故 障,则在最后一次备份 之 后对数据库所做 的任何操作都将 丢失。通 过 RM A N 执行恢复时,只 需要执行RESTORE 命令将数据库文 件修复到正确的 位置,然后就可 以打开数据库。也 就是 说,对于处于 NOARCHIVELO G模式下的数据库 ,管理员不需要 执行RECOVER 命令。

在 备 份 NOARCHIVELOG 数 据 库 时 ,数 据 库 必 须 处 于 一 致 的 状 态 ,这 样 才 能 保 证 使 用 备 份 信 息 恢 复 数 据 后 ,各 个 数 据 文 件 是 一 致 的 。

NOARCHIVELO G模式下的备份和 恢复数据库所需 要的操作步骤如 下。 (1 ) 使 用 具 有 S Y S D B A 特 权 的 账 号 登 录 到 SQL*Plus, 并 确 认 数 据 库 处 于 NOARCHIVELO G 模式。 SQL> select log_mode from v$database; LOG_MODE NOARCHIVELOG

( 2 )输 入 E X IT 命 令 退 出 SQL*Plus0 (3 )运 行 R M A N ,并连接到目标数 据库。 C :∖>rman target system/password nocatalog

( 4 )在 R M A N 中关闭数据库,然后启动数据库 到M OUNT状态。 RMAN> shutdown immediate RMAN> startup mount

( 5 ) 在 R M A N 中输入下面的命 令,以备份整个 数据库。 RMAN> run{ 2> allocate channel chi type disk; 3> backup database 4> format 'f:∖oracle- backup∖2008-5-15∖orclllg- %T- %U.bak, ; 5> }

( 6 )在完成备份过程 后打开数据库。 (7 )有了数据库的 一致性备份后, 为了模拟一个介 质故障,将关闭 数据库并删除 USERS01.DBF文 件。需要注意,介质故障通常是 在打开数据库时 发生的。但是如果想要 通过删除数据文 件来模拟介质故 障,则必须关闭 数据库,因为操 作系统不能删除 目前正 在使用的文件。 (8 )删 除 数 据 文 件 USERS01.DBF后 启动数据库。因 为 O ra c le 无法找到数据文件

377

Oracle 11g中文版数据库管理、应用与开发标准教程 U SE R S01.D B F,所以会出现如下错误信息。 ORA-01157:无法标识/锁 定 数 据 文 件 4 - 请 参 阅 D B W R 跟踪文件 ,, ORA-01110:数据文件 4: 'D:\APP\USER\ORADATA\ORCL\USERS01.DBF,

( 9 ) 当 R M A N 使用备份恢复数据库时,必须使目标数据库处 于M O U N T状态才能 访问控制文件。当 设 置 数 据 库 到 M O U N T 状态后,就 可 以 执 行 R E ST O R E命令了,让 R M A N 决定最新的有效备份集,并使用备份集修复损 坏的数据库文件。 RMAN> startup mount RMAN> run{ 2> allocate channel chi type disk; 3> restore database; 5> }

( 1 0 ) 恢复数据库后,执 行 ALTER DATABASE O PE N 命令打开数据库。 RMAN> alter database open; 数据库已打开

♦ - 15.4.3 378 完全恢复处于ARCHIVELOG模式的数据库,与恢 复 NOARCHIVELOG模式的数据 库相比而言,基本的区别是恢复处于ARCHIV ELOG模式的数据库时,管理员还需要将 归档重做日志文件的内容应用到数据文件上。在恢复过程中,RM A N会自动确定恢复数 据库所需要的归档重做日志文件。 例如,下面的示例演示如何恢复ARCHIVELO G模式下的数据库。 ( 1 ) 确认数据库处于ARCHIVELOG模式下。 ( 2 ) 启 动 R M A N ,并连接到目标数据库。 ( 3 ) 在 R M A N 中输入如下命令,对 表 空 间 USERS进行备份。 RMAN> run{ 2> allocate channel chi type disk; 3> allocate channel ch2 type disk; 4> backup tablespace users 5> format , f :\oracle_backup\2008-5-15\user\user_tab lespace_%U.bak , ; β> )

(4 ) 模拟介质故障,关闭目标数据库,并通过操作 系统删除表空间U S E R S 对应的 数据文件。 ( 5 ) 启动数据库到M OUNT状态。 ( 6 ) 运行下面的命令恢复表空间USERS。 RMAN> run{ 2> allocate channel chi type disk; 3> restore tablespace users; 4> recover tablespace users; 5> }

备份与恢复

第 15 章

( 7 )恢复完成后 打开数据库。 在 恢 复 ARCHIVELO G模式的数据 库时,可以使 用如下形式的 RESTORE命令修复 数据库。 □ □ □ □ □

restore d a t a f i l e 修复数据文件 。 restore tablespace 修复一个表空 间。 restore database 修复整个数据 库中的文件。 restore controlfile to 将控制文件的 备份修复到指 定的目录。 restore archivelog all 将 全 部 的 归 档 日 志 复 制 到 指 定 的 目 录 , 以便后续的 RECOVER命 令对数据库实 施修复。

使 用 RECOVER命 令恢复数据库 的语法形式如 下。 recover datafile



recover tablespace 恢复表空间。 recover d a t a b a s e 恢复整个数据 库。





恢复数据文件 。



R M A N 不完全恢复

如果需要将数 据库恢复到引 入错误之前的 某个状态时,D B A 就可以执行不 完全恢 复。完 全 恢 复 ARCHIVELO G模式的数据 库时,对于还 没有更新到数 据文件和控制 文件 的任何事务,RM A N 会将归档日志 或联机日志全 部应用到数据 库。而在不完 全恢复过程 中,D B A 决定了这个更 新过程的终止 时刻。不完全 数据库恢复可 以将数据库恢 复到一个 指定的时刻,RM A N执行的不完 全恢复可以是 基于时间的恢 复、基 于 更 改 (SC N 号 )的 恢复和基于撤 销的恢复。

1 5 . 5 . 1 基于时间的 不完全恢复 ;、 对于基于时间 的不完全恢复 ,由 D B A 指定存在问题 的事务时间。这也就意味着如 果知道存在问 题的事务的确 切发生时间,执行基于时间 的不完全恢复 是非常合适的 。例 如 ,假设用户在 上午9 :3 0 将大量的数据 库加载到一个 错误的表中,如果没有一种 合适 的方法从表中 删除这些数据 ,那 么 D B A 可以执行基于 时间的恢复, 即将数据库恢复到 上 午 9 :2 9 时的状态。当 然,这些工作 基于用户知道 将事务提交到 数据库的确切 时间。 基于时间的不 完全恢复有许 多不确定因素 。例如,根据 将数据库加载 到表中所使用 的方法,可能 会涉及到多个 事务,而用户 只注意到了最 后一个事务的 提交时间。此 外, 事务的提交时 间是由Oracle 服务器上的时 间决定的,而 不是由单个用 户的计算机时 间决 定。这些因素 都可能会导致 数据库恢复不 到正确的加载 数据之前的状 态。 在对数据库执 行不完全恢复 后,必须使用 RESETLOGS 选项打开数据 库,这将导致 以前的任何重 做日志文件都 变得无效。如 果恢复不成功 ,那么将不能 再次尝试恢复 ,因 为重做日志文 件是无效的。这就需要在不 完全恢复之前 从备份中恢复 控制文件、数据文 件以及重做日 志文件,以便 再次尝试恢复 过程。 在 R M A N 中执行基于时 间的不完全恢 复的命令为SET UNTIL TIME。对于用户管理 的基于时间的 恢复,时 间 参 数 是 作 为 R E C O V ER命令的一部 分指定的,但 是 在 RMAN 中执行恢复时 ,对恢复时间 的指定则在R ECOVER命令 之前进行设置 。下面通过一 个实

379

Oracle 1 1g中文版数据库管理、应用与开发标准教 程 例来演示基于时间的不完全恢复。 ( 1 ) 启 动 R M A N ,并连接到目标数据库。 ( 2 ) 关闭数据库,并重新启动数据库到M OUNT状态。 ( 3 ) 在 R M A N 中执行如下命令块,创建数据库的一个备 份。 RMAN> run{ 2> allocate channel chi type disk; 3> allocate channel ch2 type disk; 4> backup database 5> format , f :\oracle_backup\2008-5-16\database\ database_%T_%u_%c.bak , ; 6> backup archivelog all 7> format , f :\oracle_backup\2008-5-16\archive\archivle_%T_%u_%c.arc , ; 8> }

(4 ) 对数据库完成备份后打开数据库。接下来 就需要模拟一个错误,以便确认不完 全恢复。 ( 5 ) 启 动 S Q L * P lu s,查 看 O racle服务器的当前时间。 SQL> select to_char(sysdatef ,hh24:mi:s s , ) 2 from dual;

380

TO_CHAR( 10:30:24

( 6 ) 在 SQL*Plus中 向 SCOTT.EMP表添加几行数据。 SQL> alter session set nls_date_format = 会话已更改。

, yyyy-mm-dd , ;

SQL> insert into scott.emp(empno,ename z job,hiredate,sal) 2 values (8000,‘ 刘 丽 ','salesman', ' 2 9 8 0 T 2 - 1 7 l 2 0 0 0 ) ; 已 创 建 1 行。 SQL> insert into scott.emρ(empnoz ename,job,hiredate,sal) 2 values(8034 J 董笑可 I Flerk', , 1995-10-17 ∖ 2500); 已 创 建 1 行。 SQL> commit; 提交完成。

现在假设上述操作是误操作错误,D B A 需要执行基于时间的不完全恢复,将数据库 恢复到发生错误之前的状态。 ( 7 ) 在 R M A N 中关闭目标数据库。 (8 ) 使用操作系统创建数据库的一个脱机备份 ,包括控制文件的所有副本、数据文 件和归档的重做日志文件,以防止不完全 恢复失败。 ( 9 ) 启动数据库到M OUNT状态。 (1 0 ) 在 R M A N 中输入如下命令块,执行基于时间的不完 全恢复。 RMAN> run{ 2> sql , alter session set n1s_date_format= n YYYY-MM-DD HH24:MI:SS n , ; 3> allocate channel chi type disk; 4> allocate channel ch2 type disk;

第 15 备份 与 恢 复 -------------- 邕 5> set until time , 2008-05-16 10:3 0 :2 4 , 6> restore database; 7> recover database; 8> sql , alter database open resetlogs , ;

,

9> }

( 1 1 ) 在 SQL*Plus中连 接到数据库,确 认数据库中不再 包含错误的项目 。 SQL> select empno,ename from scott.emp 2 order by empno desc; 已选择1 4 行。

φ- 1 5 . 5 . 2 基于撤销的 不完全恢复 对于基于撤销的 不完全恢复,由 D B A 指定用来终止恢 复过程的日志文 件序列号。 当恢复过程需要 将特定的重做日 志文件中包含的 事务更新到数据 库之前终止时,可以执 行基于撤销的不 完全恢复。因为 所指定的重做日 志文件的全部内 容以及随后的任 何重做 日志的内容都将 丢失,所以这种 方法通常会导致 大量的数据丢失 。 基于撤销的不完 全恢复主要用于 当联机重做日志 文件被破坏时,将数据库恢复到 重 做 日 志 文 件 中 包 含 的 事 务 之 前 的 状 态 。基 于 撤 销 的 不 完 全 恢 复 所 使 用 的 语 句 为 SET UNTIL SEQUENCE命 令,该命令的语 法形式如下: set until sequence logseq=l thread =t;

其中,LOGSEQ表示重 做日志文件的序 列号,它用来终 止恢复过程;THREAD为线 程号。 例如,下面的示 例将演示对重做 日志文件的“破 坏 ”( 删除一个重做日 志文件),并 使用基于撤销的 不完全恢复来恢 复数据库。 (1)在 SQL*Plus中连 接到数据库,查 询当前日志的序 列号。 SQL> select group#,thread#,sequence#,status from v$log; GROUP# —

THREAD# —

SEQUENCE# —

STATUS

1 2 3

1 1 1

1 2 3

ACTIVE CURRENT ACTIVE

( 2 )选择一个重做日 志文件作为恢复 过程,记录该文 件的组号、线程 号以及序列号。 注意,不要选当 前的联机重做日 志文件。 (3 )查询联机重做 日志文件的名称 和位置。 SQL> select group#,member from v$logfile;

( 4 )根据日志文件 组号删除相应的 日志文件。 在尝试恢复数据 库之前,需要创 建一个数据库的 脱机备份,以防止在恢复过程中出 现了错误。 (5 )在 R M A N 中关闭目标数据 库,并重新启动 数据库到M OUNT状态。

381

Oracle 11g中文版数据库管理、应 用与开发标准教程 ( 6 ) 输入如下命令恢复数据库。 RMAN> run{ 2> allocate channel chi type disk; 3> set until logseq=l; 4> restore database; 5> recover database; 6> sql , alter database open resetlogs , ; 7> )

在 完 成 恢 复 之 后 ,R M A N 将 会重 新 创 建 被 删 除 的 联 机 重 做 日 志 文 件 ,可以查询 V$LOGFILE 视图,确认所有联机重做日 志文件都是可用的。

φ -- 1 5 . 5 . 3 基于更改的不完全恢 复-、 对于基于更改的不完全恢复 ,则以存在问题的事务的 S C N 号来终止恢复过程,在恢 复数据库之后,将包含低于 指定 S C N 号的所有事务。在 R M A N 中执行基于更改的不完 全恢复时,可 以 使 用 SET UNTIL S C N 命令来指定恢复过程的终止 S C N 号。其他的操作 步骤与执行基于时间的不完 全恢复或者基于撤销的不完 全恢复完全相同。执行基于 更改

382

的不完全恢复时,D B A 睢一需要考虑的确定适当的 S C N 号。LogM iner 是确 认 事 务 SCN 号的常用工具。 例如,假设某用户不小心删 除了 SCOTT.EMP 表中的所有记录,D B A 需要查看删除 数据的事务的 S C N 号 ,以执行基于更改的不完全 恢复恢复被用户误删除的数 据。下面是 具体的操作步骤。 ( 1) 在 SQL*Plus 中连接到数据库,并 删 除 SCOTT.EMP 表中的所有数据。 SQL> delete scott.emp; SQL> commit; SQL> alter system switch logfile;

( 2 ) 使 用 DBMS_LOGMNR_D.BUIL D()过程提取数据字典信息。 SQL> exec dbms__logmnr_d.build(*e:∖orcldata∖logminer∖director.ora , r *e: ∖orcldata∖logminer , );

(3 ) 使 用 DBMS_LOGMNR.ADD_LO GFILE()过程添加分析的日志文件。如果不能 确定哪一个日志文件包含 了删除 SCOTT.EMP 表中数据的事务,则必须对每一个重做日 志文件进行分析。 SQL>exec dbms_logmnr.add_logfil e(, d:∖app∖Administrator∖oradata∖orcl∖ redo01a.log* r dbms_logmnr.new); SQL>exec dbms_logmnr.add_logfil e(, d:∖app∖Administrator∖oradata∖orcl∖ redo02a.log , ,dbms_logmnr.addfile); SQL>exec dbms_logmnr.add_logfil e(, d:∖app∖Administrator∖oradata∖orcl∖ redo03a.log*,dbms_logm nr.addfile);

(4 ) 启 动 LogM iner 开始分析日志。 SQL> exec dbms_logmnr.start_logm nr(dictfilename=> , e:∖orcldata∖logminer∖ director.o ra , );

备份与恢复 ( 5 ) 查询 V$LOGMNR_CONTENTS 视图,查看为 DELETE SCOTT.EMP 语句分配 的 SC N 号 。为了减少搜索范 围,可以限制只返 回那些引用了名为 E M P 的段的记录。 SQL> s e l e c t s e n ,s q l _ r e d o 2 from v $ lo g m n r _ c o n te n ts 3 w here se g nam e= , EMP' ;

(6 ) 结 束 LogM iner会话并释放为 其分配的所有资源 。 SQL> e x e c d b m s_ lo g n in r. e n d _ lo g m n r;

( 7 ) 关闭数据库,并创 建数据库的脱机备 份以防止不完全恢 复失败。 ( 8 ) 使 用 R M A N 连接到目标数据库 。 ( 9 ) 在 R M A N 中启动数据库到M OUNT状态。 (1 0 ) 输入如下的命令恢 复数据库。 RMAN> run{ 2> a l l o c a t e c h a n n e l c h i ty p e d i s k ; 3> a l l o c a t e c h a n n e l ch2 ty p e d i s k ; 4> s e t u n t i l s e n 3503266; 5> r e s t o r e d a t a b a s e ; 6> r e c o v e r d a t a b a s e ; 7> s q l , a l t e r d a t a b a s e o pen r e s e t l o g s , ; 8> }

恢复数据库之后,可 以 通 过 在 SQL*Plus查 看 SCOTT.EMP表的 内容,确认是否成功 地恢复了数据库。在恢复数据库后,应该立即创建数据 库的一个备份,以防止随后出现 错误。

塔 维 护 RMAN RM A N 在恢复目录或控制 文件中存储了关于 目标数据库的备份 与恢复信息等数据 , 正是通过这些数据 ,RM A N 才会在恢复数据库 时选择最合适的备 份副本。但是,RM AN 记录的大量信息有 一个缺点,即当一 个备份集不再可用 时,与该备份集相 关的数据仍然 会包含在恢复目录 中,这时就需要对 恢复目录进行维护 。管 理 维 护 RM A N 主要包括:交 叉验证备份、删除 备份、删除备份引 用、添加备份信息 、查看备份信息和 设置RM A N 备 份策略。

r ^ 15.6.1

交叉验证备份 CROSSCHEC K

在 使 用 RM A N 创建数据库备份后 ,用户可能无意通过 操作系统物理地删 除了备份文 件 ,这 时 R M A N 的资料档案库中仍 然会保留与这些文 件相关的信息。为 了 验 证 RMAN 引用的备份集和镜 像副本中包含的物 理文件是否可用,可 以 使 用 CROSSCHECK命令进 行交叉验证。 备份文件的3 种可能的状态分别 为:AVAILABLE, UNAVAILABLE和 EXPIRED。 E X P IR E D 表 示 无法 在 所 引 用的位置找到物理 文件,可 以 从 R M A N 中删 除 该 信 息:

383

--------------------- Oracle 1 1 g 中文版数据库管理、应用与开发标准教程 AVAILABLE表示成功找到了物理备份文件 ;UNAVAILABLE表示在预定的位置找到了 物理文件,但是该文件不可用。 例如,下面对使用C O PY 命令建立的镜像副本进行验证。 RMAN>crosscheck copy;

对 BACKUP文件进行验证。 RMAN>crosscheck backup;

验证所有的日志文件的备份文件。 RMAN> crosscheck backup of archivelog all;

可 以 通 过 L I S T 命令显示交叉验证的结果,或 者 直 接 查 询 V$BACKUP_FILES、 RC_DATAFILE_COPY> RC_ARCHIVED_LOG等数据字典视图和动 态性能视图,查看交 叉验证的结果。

384

如果用户已经通过操作系统创建了数据库文 件的备份,则 可 以 通 过 R M A N 提供的 CATALOG命令将备份文件的信息添加到R M A N 的资料档案库。CATALOG命令的用法 如下。 将数据文件的备份添加到R M A N 资料档案库。 RMAN> catalog datafilecopy d bf , ;

, f :\oracle_backup\2008-5-16\orcl\syste

m01.

也 可 以 分 别 使 用 ARCHIVELOG和 CONTROLFILECOPY关 键 字 替 换 DATAFILEC O Y P关键字,将归档重做日志文件和控制文件 的备份副本添加到资料档案库,即: □

CATALOG ARCHIVELOG;



CATALOG CONTROLFILECOPY 0

有两种方式查看备份信息,一 种 是 使 用 L IS T 命令以列表的形式显示存储在RMAN 资料档案库中的备份集、备份文件的状态信 息;另一种是通过REPORT命令以报告的形 式显示数据库中备份的对象,包括数据库、表空间、数据文件等。 1. L IST 命令 L IST 命令用于显示资料档案库中的备份集、镜像副本文件的状态信息。在 使 用 LIST 命令时必须连接到目标数据库,如果没有为 R M A N 建立恢复目录,则 由 于 R M A N 资料 档案库将存储在目标数据库的控制文件中,还要求目标数据库必须已经加载。使 用 LIST 命令查看备份集信息的示例如下。 概述可用的备份: RMAN> list backup summary;



15 备份与恢复



备份列表 关键字 1 3 4 5

B B B B

TY LV

s 设备类型

完成时间

F F F F

DISK DISK DISK DISK

08-1 09-1 10-1 10-1

A A X A

月-08 月-08 月-08 月-08

段数

副本数

压缩标记

1 1 1 1

1 1 2 2

NO NO NO NO

TAG20080108T160800 TAG20080109T103027 TAG20080110T181518 TAG20080110T181518

其中,B 表 示 BACKUP, F 表 示 FU L L全备份,A 表 示 ARCHIVE LOG。 L IST 命令可以 按备份类 型列出备 份信息,即 按照数据 文件备份 ,归档日志 备份,控 制文件备 份,服务器 参数文件 备份分组 列出。 RMAN> list backup by file; 数据文件备 份列表

已存档的日志备份列表

控制文件备 份列表

S P F I L E 备份的列表

列出详细备份: RMAN>list backup;

列出过期的备份信息: RMAN>list expired backup;

列出特定表 空间和数 据文件的 备份信息 : RMAN>list backup of tablespace users; RMAN>list backup of datafile 3;

列出归档 日志备份 的简要信 息: RMAN>list archivelog all;

列出归档 日志备份 的详细信 息: RMAN>list backup of archivelog all;

列出控制文 件和服务 器参数文 件备份的 信息: RMAN>list backup of controfile; RMAN>list backup of spfile;

385

Oracle 1 1 g 中文版数据库管 理、应用与开发 标准教程 使 用 LIST C O PY 命令可以显示存 储在资料档案库 中由C O PY 命令建立的镜像 副本 信息。它可以显 示全部备份信息 、特定表空间、控制文件、 日志文件信息。LIST COPY 命令的组合形式 如下。 RMAN>list RMAN>list RMAN>list RMAN>list RMAN>list

copy; copy of copy of copy of copy of

database; tablespace system; controlfile; archivelog all;

2. REPORT 命令 REPORT命令同 样可以查询R M A N 资料档案库,并 且 REPORT命令获 得的信息更 为有用,尤其是 还可以将输出信 息保存到重做日 志文件中。 使 用 REPORT NEED BACKUP命令报 告数据库需要备 份的对象信息。 RMAN> report need backup;

报 告 最 近 3 天没有被备份的 数据文件的语句 如下。 RMAN〉 report need backup days=3;

386

REPORT UNRECOVERA BLE命令可以列 出所有数据库中 不能恢复的文件 信息。 RMAN> report unrecoverable database; RMAN> report unrecoverable tablespace users;

报告目标数据库 中一周前的对象 信息的语句如下 。 RMAN> report schema at time

, sysdate-7 , ;

f ~一》 1 5一.6 .4 定义保留备 份的策略 .一一 一一一 一一 一一一一一一一一一一 _ ————一一一 为了简化对R M A N 的管理,可 以 为 RM A N 设置备份保留策 略,这 样 RM A N 会自动 判 断 哪 些 备 份 集 或 镜 像 副 本 文 件 不 必 再 保 留 ,这 些 备 份 文 件 将 会 被 标 记 为 “废弃 (OBSOLETE) ”。 通 过 REPORT OBSOLETE命令 可以查看当前处 于废弃状态的备 份文件, 或 者 通 过 DELETE OBSOLETE命令 删除这些废弃的 备份。充分利用 保留备份策略可 以 消除一些管理难 题,这样就不必 在每次执行维护 操作时,都需要 确定应该从资料 档案库 中删除哪些引用 。 有两种类型的保 留备份策略:基 于时间的备份保 留策略和基于冗 余数量的备份保 留 策略,并且这两 类策略互相排斥 。基于时间的备 份保留策略,可 以将数据库恢复 到设置 的几天前的状态 。例如,将恢复时间段设 置为7 天 ,那 么 RM A N 保留的备份可以 保证能 够恢复到一周内 的任何时刻。 设置基于时间的 备份保留策略也 是通过CONFIG URE命令设置的 ,例如: RMAN> configure retention policy to recovery window of 7 days;

可 以 通 过 SHOW A L L 查看配置参数。 执行该命令后,R M A N 将始终保留将数 据库恢复到特定 时间状态时需要 用到的备

份 。任何不满足上述条件的备份都将被RM A N 废弃,并且可以通过DELETE OBSOLETE 命令删除。 基于冗余数量的备份保留策略实质上保留某个数据文件一定的备份数量。如果某个 数据文件的冗余备份数量超出了指定数量,RM A N 将废弃最旧的备份。同样,基于冗余 数量的备份保留策略也是通过CONFIGURE命令设置的,例如: RMAN> configure retention policy to redundancy 3;

如果在备份时希望备份集不受保留策略的影响,则 可 以 在 B A C K U P 命令中使用 K E E P参数,例如: RMAN>backup database keep forever; RMAN>backup database keep 5 days;

实验指导 1. RM AN备份数据库 本练习将使用RM A N 对数据库中的主要对象进行备份。 ( 1 ) 备份数据库。 启 动 RM A N 并连接到目标数据库,输 入 BACKUP DATABASE命令备份数据库。 C:∖>rman target system/password nocatalog RMAN> backup database format , f :\oracle_backup\orallg_%Y_%M_%D_%U.bak , ; RMAN> list backup of database;

( 2 ) 备份表空间。 启 动 RM A N 并连接到目标数据库,在R M A N 中执行BACKUP TABLESPACE命令。 C:∖>rman target system/password nocatalog run( allocate channel chi type disk; backup tablespace example r userθl format , f :\oracle_backup\%d_%p_%t_%c ,dbf , ; ) RMAN> list backup of tablespace example;

(3 ) 备份数据文件。 在 R M A N 中可以使用BACKUP DATAFILE命令对单独的数据文件进行备份。 RMAN> backup datafile 1,2,3 filesperset 3; RMAN>backup datafilecopy , \oracle_backup\copy\df.cop , ;

( 4 ) 手动备份控制文件。 RMAN>backup current controlfile; RMAN>backuρ tablespace users include current controlfile; RMAN>list backup of controlfile;

2.

RM AN恢复数据库

本练习将使用RM A N 对数据库进行基于时间的不完全恢复。

,

387

Oracle 1 1g中文版数据库管理、应用与开发标准教程 ( 1 ) 启 动 R M A N ,并连接到目标数据库。 ( 2 ) 启 动 S Q L * P lu s,查 看 O racle服务器的当前时间。 select t o _ char(sysdate z , h h 2 4 :mi:s s *1 ) from dual;

( 3 ) 在 SQL*Plus中 向 HR.EMPLOYEES表添加几行数据。 ( 4 ) 在 R M A N 中关闭目标数据库。 ( 5 ) 启动数据库到M OUNT状态。 ( 6 ) 在 R M A N 中执行基于时间的不完全恢复。 run { s q l , alter session set nls_date_format= n yyyy-mm-dd hh24 :mi :ss f,, ; allocate channel chi type disk; set until time , , ; restore database; recover database; s q l , alter database open resetlogs , ; )

啰思考与练习 一、填空题 1 . R M A N 可以进行的两种不同类型的备 份 : 和 。 在进行 时,RMAN会将数据文件中除空白数据块之外的 所有数据块都复制到备份 2 3

DELETE AVAILABLE

D.

UNAVAILABLE

3 . 下列哪个命令可以用来确认恢复目录中 记录的备份数据文件是否存在? ( ) A. CROSS CHECK BACKUP OF DATA­

集中。

. 最 简 单 的 R M A N 只包括两个组件: 和 。 . 在 RMAN中,可以使用

对预定义的配置进行修改。 4 . R M A N 是通过

BASE B. CROSS CHECK COPY OF DATA­

命令 进程来完成

C.

备份操作的。 5 .使 用 RMAN对整个数据库进行恢复的正 确步骤为:启动实例并加载数据库、 、打开数据库。



二、选择题 1. RMAN资料档案库可以保存在以下什么 位置? (

B. C.

D. 4

时,如 果 RMAN不能找到物理存储的备份文件, 则备份文件的信息将被标记为什么? ( ) A. EXPIRED

CROSSCHECK BACKUP OF ARC­

HIVELOG ALL . 下面哪种不完全恢复需要使用SCN号作

为参数? ( ) A . 基于时间的不完全恢复 B . 基于撤销的不完全恢复 C . 基于更改的不完全恢复

)

A . 目标数据库的控制文件中 B . 备用数据库的控制文件中 C . 恢复目录数据库的控制文件中 D , 都可以 2 . 对 恢 复 目 录 进 行 CROSSCHECK检验

BASE CROSSCHECK COPY

5

D . 基于顺序的不完全恢复 . 执行不完全恢复时,数据库必须处于什

么状态? ( ) A . 关闭

B . 卸载

C . 打开

D . 装载

6 . 下列哪个命令可以将一个文件的备份还 原到数据库原目录中? ( ) A. RECOVER B. BACKUP

备份与恢复 C. COPY 7

的顺序是什么? (

8

D. RESTORE

.使 用 R M A N 进行介质恢复时,执行命令 )

A. LIST

B. DISPLAY

C. SHOW

D . 都可以

1 0 . 下列哪个命令可以用来执行不完全恢

复? (



A.

RESTORE> RECOVER

B.

RECOVER RESTORE

A.

C.

COPY 、BACKUP

B.

RECOVER DATABASE UNTIL

D.

COPY 、RECOVER

C.

RECOVER DATA UNTIL

D.

RESTORE DATA UNTIL

. 下列哪个操作可以用来为一个备份操作

手动分配通道? (



RESTORE DATABASE UNTIL

A.

ALLOCATE CHANNEL

三、简答题 1 . 简述不完全恢复与完全恢复的区别。

B.

CREATE CHANNEL

2

. 描述逻辑备份的各种方式。

C.

CHANNEL ALLOCATAE

3

. 描述如何创建恢复目录。

D.

CREATE LINK

4

. 如 何 使 用 R M A N 对数据库进行恢复与

9 . 下列哪个命令用来显示RM A N 通道配置 信息? ( )

备份?