书籍详情
Oracle Database 10g AQL开发指南
作者:(美)Jason Price著;冯锐,由渊霞译
出版社:清华大学出版社
出版时间:2005-01-01
ISBN:9787302104872
定价:¥59.80
购买这本书可以去
内容简介
本书全面深入地论述了如何使用结构化查询语言(SQL)语句来访问Oracle数据库,以及使用PL/SQL(ProceduralLanguage/SQL)来编写包含SQL语句的程序。本书由Oracle前产品经理JasonPrice亲笔撰写,基于新推出的SQL2003规范]]],详细介绍了OracleDatabase10g的新特性和功能。全书内容系统、权威,能帮助读者快速掌握SQL的核心知识。本书前言现在的数据库管理系统实现了一种标准语言:结构化查询语言(StructuredQueryLanguage),或简称SQL。除了具有其他语言的特点之外,SQL还可以对数据库中的信息进行检索、添加、修改和删除。SQL是经过美国国家标准化组织(ANSI)认可的一种标准语言,可以用来对Oracle、SQLServer、DB2或MySQL数据库进行访问。本书将介绍如何真正掌握SQL,同时还会给出许多实际的例子。读者也可以通过Internet获得本书中所使用的所有脚本和程序(详细信息参看后文“获得本书例子”部分)。读者通过本书可学会:●掌握标准的SQL,以及Oracle公司为了使用Oracle数据库的特性而开发的一些扩展。●展示PL/SQL(过程化语言/SQL),它构建在SQL基础之上,允许用户编写包含SQL语句的程序。●使用SQL*Plus执行SQL语句、脚本和报表;SQL*Plus就是一个与数据库进行交互的工具。●对数据库执行查询、插入、修改和删除操作。●创建数据库表、序列、索引、视图和用户。●执行包含多条SQL语句的事务。●定义数据库对象类型,并创建对象表来处理高级数据。●使用大对象来存储128TB的字符和二进制数据,以及指向外部文件的指针。●使用分析函数执行复杂计算。●使用所有最新的Oracle10g特性,例如BINARY_FLOAT和BINARY_DOUBLE类型、MODEL子句以及大对象和集合的扩展。●介绍数据库的安全性。●实现高性能的优化技术,使SQL语句可以快速执行。●介绍使用Java通过JDBC运行SQL的基础知识。本书共包含16章和一个附录。第1章简介本章将介绍有关关系数据库和SQL的知识,然后给出几个简单查询,并使用SQL*Plus执行这些查询,最后简要介绍PL/SQL。第2章从数据库表中检索信息本章将展示如何使用SELECT语句从一个或多个数据库表中检索信息,如何使用算术表达式执行计算,如何使用WHERE子句对行进行过滤,以及如何对从表中检索出的行进行排序。第3章使用简单函数本章将介绍有关Oracle数据库中内置函数的知识。函数可以接受零个或多个输入参数,并返回一个输出参数。使用函数可以实现很多功能,例如计算一组数字的平均值和方根。第4章日期和时间的存储与处理本章将介绍Oracle数据库如何处理和存储日期和时间,二者合称时间值。本章还将介绍如何使用时间戳来存储特定的日期和时间,如何使用时间间隔来存储一段时间的长度。第5章使用SQL*Plus本章将使用SQL*Plus来查看表的结构,编辑SQL语句,保存并运行脚本,设置列的输出格式,定义并使用变量,以及创建报表。第6章子查询本章将介绍如何在一个外部的SQL语句中使用SELECT语句。内部的SELECT语句称为子查询。本节将介绍子查询的各种类型,以及如何使用子查询从简单部件构建复杂语句。第7章高级查询本章将介绍如何执行包含高级操作符和函数的查询,例如,集合操作符可以合并多个查询返回的记录,TRANSLATE()函数可以将一个字符串中的字符转换为另外一个字符串中的字符,DECODE()函数可以在一组值中搜索特定的值,CASE表达式可以执行if-then-else逻辑,ROLLUP和CUBE子句可以返回包含小计的记录。本章还将介绍有关分析函数的知识,分析函数可以用来执行复杂计算,例如查找每个月销量最高的产品类型、业绩最佳的销售员,等等。本章还将介绍如何对层次化组织的数据进行查询。最后,本章将展示如何使用Oracle10g的新特性MODEL子句执行记录间的计算。第8章修改表的内容本章将介绍如何使用INSERT、UPDATE和DELETE语句添加、修改和删除记录,如何使用COMMIT语句使事务的处理结果永久生效,或者使用ROLLBACK语句完全取消事务结果的影响。本章还将介绍Oracle数据库如何同时处理多个事务。第9章数据库安全性本章将介绍有关数据库用户的知识和如何使用特权来控制用户可以在数据库中执行的特定任务。第10章创建表、序列、索引和视图本章将介绍有关表、序列和索引的知识,序列会生成一系列数字,而索引就如同书籍的索引,可以帮助读者快速访问记录。本章还将介绍有关视图的知识,视图是对一个或多个表预定义的查询。除了其他优点之外,视图还可以对用户屏蔽复杂性,通过只允许视图访问表中有限的数据集,从而实现另外一层安全性。第11章PL/SQL编程简介本章将介绍有关PL/SQL的知识,PL/SQL构建在SQL基础之上,使用PL/SQL可以在数据库中编写包含SQL语句的存储过程。PL/SQL是第三代语言,其中包含标准的编程结构。第12章数据库对象本章将介绍如何创建数据库对象类型,数据库对象类型可以包括属性和方法;还将介绍如何使用对象类型来定义列对象和对象表,以及如何使用SQL和PL/SQL来操纵对象。第13章集合本章将介绍如何创建集合类型,集合可以包含多个元素;还将介绍如何使用集合类型来定义表中的列,如何使用SQL和PL/SQL来操纵集合。第14章大对象本章将介绍有关大对象(largeobject)的知识,大对象可以用来存储多达128TB的字符和二进制数据,或指向外部文件的指针;此外,还将介绍有关早期的LONG类型的知识,为了保持向后兼容性,在Oracle10g中依然支持LONG类型。第15章使用Java运行SQL本章将介绍使用Java通过JDBC应用程序编程接口运行SQL的知识,Java程序可以使用JDBC访问数据库。第16章SQL优化本章是本书的最后一章,将介绍SQL优化的一些技巧,这些技巧可以用来缩短查询执行的时间;本章还将介绍有关Oralce优化器的知识,如何向优化器传递一些提示。附录AOracle的数据类型附录中列出了OracleSQL和PL/SQL中可以使用的数据类型。读者对象本书适用于以下读者:●需要编写SQL和PL/SQL的开发人员。●需要深入了解SQL的数据库管理员。●需要编写SQL查询来从自己公司的数据库中获得信息的商业用户。●需要简单了解SQL和PL/SQL的技术主管和技术顾问。读者阅读本书,不需要预先已经了解Oracle数据库、SQL或PL/SQL的知识:通过阅读本书,读者将会找到成为这方面的专家需要了解的所有知识。获得本书例子本书中使用的所有的SQL脚本、程序以及其他文件都可以从Oracle出版社的网站www.OraclePressBooks.com上下载;这些文件都被打包成一个zip文件。下载这个zip文件之后,可以使用WinZip打开这个压缩文件,并在Actions菜单中选择Extract选项将其解压。这样就会创建一个目录sql_book,其中包含以下3个子目录:●SQL其中包含了本书中使用的SQL脚本,包括创建和填充示例数据库表所使用的脚本。●sample_files包含了第14章中的示例文件。●Java包含了第15章中使用的Java程序。尽情享受吧,希望您喜欢本书!致谢非常感谢McGraw-Hill/Osborne的朋友,包括LisaMcClain、AthenaHonore和LisaWolters-Broder;感谢RonHardman的全面技术审核,感谢Oracle公司的GeoffLee阅读本书并充当Oracle方面的倡导者。
作者简介
JasonPrice职业咨询专家,Oracle公司前产品经理,对Oracle的众多产品都做出了卓越的贡献。Jason是一位经Oracle认证的数据库管理员和应用程序开发员,在软件产业具有10余年的从业经验,并亲笔撰写了多本关于Oracle、Jave和Net的优秀图书。
目录
第1章 简介 1
1.1 关系数据库简介 1
1.2 结构化查询语言(SQL)简介 2
1.3 使用SQL*Plus 3
1.3.1 启动Windows版本的SQL*Plus 4
1.3.2 启动命令行版本的SQL*Plus 4
1.4 使用SQL*Plus执行SELECT语句 5
1.5 SQL*Plus Worksheet 6
1.6 创建store模式 7
1.6.1 运行SQL*Plus脚本创建store模式 7
1.6.2 用来创建store模式的DDL语句 8
1.7 添加. 修改. 删除行 15
1.7.1 向表中添加行 15
1.7.2 修改表中的现有行 16
1.7.3 从表中删除行 17
1.8 Oracle 10g的新数据类型BINARY_FLOAT和 BINARY_ DOUBLE 17
1.8.1 BINARY_FLOAT和BINARY_DOUBLE的优点 17
1.8.2 在表中使用BINARY_FLOAT和BINARY_DOUBLE 18
1.8.3 特殊值 18
1.9 退出SQL*Plus 19
1.10 Oracle PL/SQL简介 19
1.11 小结 20
第2章 从数据库表中检索信息 23
2.1 对单表执行SELECT语句 23
2.2 选择一个表中的所有列 24
2.3 理解行标识符 25
2.4 执行算术运算 25
2.4.1 日期运算 26
2.4.2 列运算 27
2.5 使用列别名 28
2.6 使用串连操作合并列的输出结果 29
2.7 理解空值 29
2.8 禁止显式重复行 31
2.9 使用WHERE子句过滤行 32
2.9.1 使用比较操作符 32
2.9.2 使用SQL操作符 34
2.9.3 使用逻辑操作符 36
2.9.4 理解操作符的优先级 37
2.10 使用ORDER BY子句对行进行排序 37
2.11 执行使用两个表的SELECT语句 39
2.12 使用表别名 41
2.13 笛卡尔积 41
2.14 执行使用多于两个表的SELECT语句 42
2.15 理解连接条件和连接类型 43
2.15.1 理解不等连接 43
2.15.2 理解外连接 44
2.15.3 理解自连接 47
2.16 使用SQL/92语法执行连接 48
2.16.1 使用SQL/92标准语法执行两个表的内连接 48
2.16.2 使用USING关键字简化连接 49
2.16.3 使用SQL/92执行多于两个以上表的内连接 50
2.16.4 使用SQL/92执行多列的内连接 50
2.16.5 使用SQL/92执行外连接 50
2.16.6 使用SQL/92执行自连接 52
2.16.7 使用SQL/92执行交叉连接 52
2.17 小结 53
第3章 使用简单函数 55
3.1 使用单行函数 56
3.1.1 字符函数 56
3.1.2 数字函数 64
3.1.3 转换函数 69
3.1.4 正则表达式函数 74
3.2 使用聚合函数 78
3.2.1 AVG()函数 79
3.2.2 COUNT()函数 80
3.2.3 MAX()和MIN()函数 80
3.2.4 STDDEV()函数 81
3.2.5 SUM()函数 81
3.2.6 VARIANCE()函数 82
3.3 对行进行分组 82
3.3.1 使用GROUP BY子句对行进行分组 82
3.3.2 调用聚合函数的错误用法 85
3.3.3 使用HAVING子句过滤行分组 86
3.3.4 组合使用WHERE和GROUP BY子句 86
3.3.5 组合使用WHERE. GROUP BY和HAVING子句 87
3.4 小结 88
第4章 日期和时间的存储与处理 89
4.1 几个简单的存储和检索日期的例子 89
4.2 使用TO_CHAR()和TO_DATE()转换时间值 91
4.2.1 使用TO_CHAR()将时间值转换为字符串 91
4.2.2 使用TO_DATE()将字符串转换为时间值 95
4.3 设置默认的日期格式 98
4.4 Oracle对2位年份的处理 99
4.4.1 使用YY格式 99
4.4.2 使用RR格式 99
4.5 使用时间值函数 101
4.5.1 ADD_MONTHS()函数 101
4.5.2 LAST_DAY()函数 102
4.5.3 MONTHS_BETWEEN() 102
4.5.4 NEXT_DAY()函数 103
4.5.5 ROUND()函数 103
4.5.6 SYSDATE()函数 104
4.5.7 TRUNC()函数 104
4.6 理解时区 105
4.6.1 与时区有关的函数 106
4.6.2 数据库时区和会话时区 106
4.6.3 获取时区的时差 107
4.6.4 获取时区名 107
4.6.5 将时间值从一个时区转换为另一个时区 108
4.7 使用时间戳 108
4.7.1 使用TIMESTAMP类型 108
4.7.2 与时间戳有关的函数 112
4.8 使用时间间隔 116
4.8.1 使用INTERVAL YEAR TO MONTH类型 117
4.8.2 使用INTERVAL DAY TO SECOND类型 119
4.8.3 与时间间隔有关的函数 121
4.9 小结 122
第5章 使用SQL*Plus 123
5.1 查看表结构 123
5.2 编辑SQL语句 124
5.3 保存. 检索并运行文件 126
5.4 格式化列 128
5.5 设置页面大小 130
5.6 设置行大小 131
5.7 清除列格式 131
5.8 使用变量 132
5.8.1 临时变量 132
5.8.2 已定义变量 135
5.9 创建简单报表 137
5.9.1 在脚本中使用临时变量 137
5.9.2 在脚本中使用已定义变量 137
5.9.3 向脚本中的变量传递值 138
5.9.4 添加页眉和页脚 139
5.9.5 计算小计 140
5.10 自动生成SQL语句 141
5.11 小结 142
第6章 子查询 143
6.1 子查询的类型 143
6.2 编写单行子查询 144
6.2.1 在WHERE子句中使用子查询 144
6.2.2 在HAVING子句中使用子查询 145
6.2.3 在FROM子句中使用子查询(内联视图) 146
6.2.4 可能碰到的两个错误 147
6.3 编写多行子查询 148
6.3.1 在多行子查询中使用IN操作符 148
6.3.2 在多行子查询中使用ANY操作符 149
6.3.3 在多行子查询中使用ALL操作符 149
6.4 编写多列子查询 150
6.5 编写关联子查询 150
6.5.1 关联子查询的例子 150
6.5.2 在关联子查询中使用EXISTS和NOT EXISTS 151
6.6 编写嵌套子查询 153
6.7 编写包含子查询的UPDATE和DELETE语句 155
6.7.1 编写包含子查询的UPDATE语句 155
6.7.2 编写包含子查询的DELETE语句 155
6.8 小结 156
第7章 高级查询 157
7.1 使用集合操作符 158
7.1.1 示例表 158
7.1.2 使用UNION ALL操作符 159
7.1.3 使用UNION操作符 160
7.1.4 使用INTERSECT操作符 161
7.1.5 使用MINUS操作符 161
7.1.6 组合使用集合操作符 162
7.2 使用TRANSLATE()函数 163
7.3 使用DECODE()函数 164
7.4 使用CASE表达式 166
7.4.1 使用简单CASE表达式 166
7.4.2 使用搜索CASE表达式 167
7.5 层次化查询 168
7.5.1 示例数据 168
7.5.2 使用CONNECT BY和START WITH子句 170
7.5.3 使用伪列LEVEL 171
7.5.4 格式化层次化查询的结果 171
7.5.5 从非根节点开始遍历 172
7.5.6 在START WITH子句中使用子查询 173
7.5.7 从下向上遍历树 173
7.5.8 从层次查询中删除节点和分支 174
7.5.9 在层次化查询中加入其他条件 175
7.6 使用扩展的GROUP BY子句 175
7.7 使用ROLLUP子句 177
7.7.1 使用CUBE子句 179
7.7.2 使用GROUPING()函数 181
7.7.3 使用GROUPING SETS子句 183
7.7.4 使用GROUPING_ID()函数 184
7.7.5 在GROUP BY子句中多次使用一个列 186
7.7.6 使用GROUP_ID()函数 186
7.8 使用分析函数 187
7.8.1 示例表 188
7.8.2 使用评级函数 189
7.8.3 使用反百分点函数 195
7.8.4 使用窗口函数 196
7.8.5 使用报表函数 201
7.8.6 使用LAG()和LEAD()函数 203
7.8.7 使用FIRST和LAST函数 204
7.8.8 使用线性回归函数 204
7.8.9 使用假想评级与分布函数 205
7.9 使用MODEL子句 206
7.9.1 示例MODEL子句 206
7.9.2 用位置标记和符号标记访问数据单元 208
7.9.3 用BETWEEN和AND返回特定范围内的数据单元 208
7.9.4 用ANY和IS ANY访问所有的数据单元 209
7.9.5 用CURRENTV()获取某个维度的当前值 209
7.9.6 用FOR循环访问数据单元 210
7.9.7 处理空值和缺失值 212
7.9.8 更新已有的单元 214
7.10 小结 215
第8章 修改表的内容 217
8.1 使用INSERT语句添加行 217
8.1.1 忽略列的列表 218
8.1.2 为列指定空值 219
8.1.3 在列值中使用单引号和双引号 219
8.1.4 从一个表向另外一个表复制行 219
8.2 使用UPDATE语句修改行 220
8.3 使用DELETE语句删除行 221
8.4 数据库的完整性 222
8.4.1 主键约束 222
8.4.2 外键约束 222
8.5 使用默认值 223
8.6 使用MERGE合并行 225
8.7 数据库事务 227
8.7.1 事务的提交和回滚 227
8.7.2 事务的开始与结束 228
8.7.3 保存点 229
8.7.4 事务的ACID特性 230
8.7.5 并发事务 230
8.7.6 事务锁 232
8.7.7 事务隔离级别 232
8.7.8 SERIALIZABLE事务隔离性级别的一个例子 233
8.8 查询闪回 234
8.8.1 使用闪回的授权 234
8.8.2 时间查询闪回 234
8.8.3 系统变更号查询闪回 236
8.9 小结 237
第9章 数据库安全性 239
9.1 用户 239
9.1.1 创建用户 240
9.1.2 修改用户密码 241
9.1.3 删除用户 241
9.2 系统特权 241
9.2.1 向用户授予系统特权 242
9.2.2 检查授予用户的系统特权 243
9.2.3 使用系统特权 244
9.2.4 撤销用户的系统特权 244
9.3 对象特权 244
9.3.1 向用户授予对象特权 245
9.3.2 检查已授予的对象特权 245
9.3.3 检查已接受的对象特权 247
9.3.4 使用对象特权 249
9.3.5 同名对象 249
9.3.6 公共同名对象 250
9.3.7 撤销用户的对象特权 251
9.4 角色 251
9.4.1 创建角色 251
9.4.2 为角色授权 252
9.4.3 将角色授予用户 252
9.4.4 检查授予用户的角色 253
9.4.5 检查授予角色的系统特权 254
9.4.6 检查授予角色的对象特权 254
9.4.7 使用授予角色的特权 256
9.4.8 默认角色 256
9.4.9 撤销角色 257
9.4.10 从角色中撤销特权 257
9.4.11 删除角色 257
9.5 小结 257
第10章 创建表. 序列. 索引和视图 259
10.1 表 259
10.1.1 创建表 260
10.1.2 获得有关表的信息 261
10.1.3 获得表中列的信息 262
10.1.4 修改表 263
10.1.5 重命名表 271
10.1.6 向表添加注释 271
10.1.7 截断表 272
10.1.8 删除表 272
10.2 序列 272
10.2.1 创建序列 272
10.2.2 获取有关序列的信息 274
10.2.3 使用序列 275
10.2.4 使用序列填充主键 276
10.2.5 修改序列 277
10.2.6 删除序列 278
10.3 索引 278
10.3.1 创建索引 278
10.3.2 创建基于函数的索引 279
10.3.3 获取有关索引的信息 280
10.3.4 获取列索引的信息 281
10.3.5 修改索引 281
10.3.6 删除索引 281
10.4 视图 282
10.4.1 创建并使用视图 282
10.4.2 修改视图 289
10.4.3 删除视图 289
10.5 小结 290
第11章 PL/SQL编程简介 291
11.1 块结构 292
11.2 变量和类型 293
11.3 条件逻辑 294
11.4 循环 294
11.4.1 简单循环 295
11.4.2 WHILE循环 295
11.4.3 FOR循环 295
11.5 游标 296
11.5.1 步骤1:声明用于保存列值的变量 296
11.5.2 步骤2:声明游标 297
11.5.3 步骤3:打开游标 297
11.5.4 步骤4:从游标中取得记录 297
11.5.5 步骤5:关闭游标 298
11.5.6 完整的实例:product_cursor.sql 298
11.5.7 游标与FOR循环 300
11.6 异常 301
11.6.1 ZERO_DIVIDE异常 302
11.6.2 DUP_VAL_ON_INDEX异常 303
11.6.3 INVALID_NUMBER异常 303
11.6.4 OTHERS异常 303
11.7 过程 304
11.7.1 创建过程 304
11.7.2 调用过程 307
11.7.3 获取有关过程的信息 307
11.7.4 删除过程 308
11.7.5 查看过程中的错误 308
11.8 函数 309
11.8.1 创建函数 309
11.8.2 调用函数 310
11.8.3 获取有关函数的信息 310
11.8.4 删除函数 311
11.9 包 311
11.9.1 创建包规范 311
11.9.2 创建包体 312
11.9.3 调用包中的函数和过程 313
11.9.4 获取有关包中函数和过程的信息 314
11.9.5 删除包 314
11.10 触发器 314
11.10.1 触发器运行的时机 314
11.10.2 设置示例触发器 315
11.10.3 创建触发器 315
11.10.4 激活触发器 316
11.10.5 获取有关触发器的信息 317
11.10.6 禁用和启用触发器 319
11.10.7 删除触发器 319
11.11 小结 319
第12章 数据库对象 321
12.1 对象简介 321
12.2 创建对象类型 322
12.3 使用DESCRIBE获取有关对象类型的信息 324
12.4 用对象类型定义列对象和对象表 325
12.5 对products表执行DML操作 325
12.5.1 将记录插入到products表中 326
12.5.2 从products表中查询记录 326
12.5.3 修改products表中的记录 327
12.5.4 从products表中删除记录 327
12.6 对object_products表执行DML 327
12.6.1 向object_products表中插入记录 328
12.6.2 从object_products表中选择记录 328
12.6.3 更新object_products表中的记录 328
12.6.4 从object_products表中删除记录 329
12.7 对object_customers表执行DML 329
12.7.1 向object_customers表中插入记录 329
12.7.2 从object_customers表中查询记录 329
12.8 对purchases表执行DML 330
12.8.1 向purchases表中插入记录 331
12.8.2 从purchases表中选择记录 331
12.8.3 更新purchases表中的记录 332
12.9 在PL/SQL中使用对象 332
12.10 类型继承 334
12.11 NOT INSTANTIABLE对象类型 335
12.12 用户自定义的构造函数 336
12.13 小结 339
第13章 集合 341
13.1 集合简介 341
13.2 变长数组 342
13.2.1 创建变长数组类型 342
13.2.2 使用变长数组类型定义表列 343
13.2.3 获得变长数组信息 343
13.2.4 填充变长数组元素 344
13.2.5 查找变长数组元素 345
13.2.6 更改变长数组元素 345
13.3 嵌套表 345
13.3.1 创建嵌套表类型 346
13.3.2 使用嵌套表类型定义表列 346
13.3.3 获得嵌套表信息 346
13.3.4 填充嵌套表元素 348
13.3.5 查找嵌套表元素 348
13.3.6 更改嵌套表元素 348
13.4 多级集合类型 349
13.5 在PL/SQL中使用集合 351
13.5.1 操作变长数组 351
13.5.2 操作嵌套表 353
13.5.3 集合方法 355
13.6 Oracle 10g对集合的改进 362
13.6.1 关联数组 362
13.6.2 更改元素类型的大小或精度 363
13.6.3 增加变长数组的元素数目 363
13.6.4 在临时表中使用变长数组 363
13.6.5 为嵌套表的存储表使用不同的表空间 364
13.6.6 对嵌套表的ANSI支持 364
13.7 小结 372
第14章 大对象 373
14.1 大对象(LOB)简介 373
14.2 示例文件 374
14.3 理解大对象类型 374
14.4 创建包含大对象的表 375
14.5 在SQL中使用大对象 376
14.5.1 使用CLOB和BLOB 376
14.5.2 使用BFILE 377
14.6 在PL/SQL中使用大对象 379
14.6.1 READ() 380
14.6.2 WRITE() 383
14.6.3 APPEND() 384
14.6.4 CLOSE() 386
14.6.5 COMPARE() 386
14.6.6 COPY() 388
14.6.7 CREATETEMPORARY() 390
14.6.8 ERASE() 391
14.6.9 FILECLOSE() 392
14.6.10 FILECLOSEALL() 393
14.6.11 FILEEXISTS() 393
14.6.12 FILEGETNAME() 394
14.6.13 FILEISOPEN() 394
14.6.14 FILEOPEN() 395
14.6.15 FREETEMPORARY() 396
14.6.16 GETCHUNKSIZE() 396
14.6.17 GET_STORAGE_LIMIT() 397
14.6.18 GETLENGTH() 397
14.6.19 INSTR() 397
14.6.20 ISOPEN() 400
14.6.21 ISTEMPORARY() 400
14.6.22 LOADFROMFILE() 401
14.6.23 LOADBLOBFROMFILE() 404
14.6.24 LOADCLOBFROMFILE() 405
14.6.25 OPEN() 405
14.6.26 SUBSTR() 406
14.6.27 TRIM() 407
14.6.28 WRITEAPPEND() 408
14.7 理解LONG和LONG RAW类型 408
14.7.1 示例表 409
14.7.2 使用LONG和LONG RAW列 409
14.8 Oracle10g对大对象的增强 410
14.8.1 CLOB和NCLOB对象之间的隐式转换 410
14.8.2 在触发器中使用LOB时:new属性的用法 411
14.9 小结 412
第15章 使用Java运行SQL 413
15.1 准备工作 414
15.2 配置计算机 414
15.2.1 设置ORACLE_HOME环境变量 414
15.2.2 设置JAVA_HOME环境变量 415
15.2.3 设置PATH环境变量 415
15.2.4 设置CLASSPATH环境变量 416
15.2.5 设置LD_LIBRARAY_PATH环境变量 416
15.3 Oracle JDBC驱动程序 416
15.3.1 Thin驱动程序 417
15.3.2 OCI驱动器 417
15.3.3 服务器端内部驱动器 417
15.3.4 服务器端Thin驱动器 417
15.4 导入JDBC包 417
15.5 注册Oracle JDBC驱动程序 418
15.6 打开数据库连接 418
15.6.1 使用DriverManager类的getConnection()方法连接数据库 418
15.6.2 使用Oracle数据源连接数据库 420
15.7 创建JDBC Statement对象 422
15.8 从数据库检索列 423
15.8.1 步骤1:创建和填充ResultSet对象 423
15.8.2 步骤2:从ResultSet对象中读取列值 424
15.8.3 步骤3:关闭ResultSet对象 426
15.9 向数据库添加行 426
15.10 更改数据库的行 427
15.11 删除数据库的行 427
15.12 处理数字 428
15.13 处理数据库Null值 429
15.14 控制数据库事务 430
15.15 执行DDL语句 431
15.16 处理异常 432
15.17 关闭JDBC对象 433
15.18 示例程序:BasicExample1.java 434
15.18.1 编译BasicExample1 439
15.18.2 运行BasicExample1 439
15.19 预备SQL语句 441
15.20 Oracle JDBC扩展 446
15.20.1 oracle.sql包 446
15.20.2 oracle.jdbc包 450
15.20.3 示例程序:BasicExample3.java 453
15.21 小结 456
第16章 SQL优化 457
16.1 SQL优化简介 457
16.2 使用WHERE子句过滤行 458
16.3 使用表连接而不是多个查询 458
16.4 执行连接时使用完全限定的列引用 459
16.5 使用CASE表达式而不是多个查询 460
16.6 添加表索引 461
16.7 使用WHERE而不是HAVING 461
16.8 使用UNION ALL而不是UNION 462
16.9 使用EXISTS而不是IN 464
16.10 使用EXISTS而不是DISTINCT 464
16.11 使用绑定变量 465
16.11.1 不相同的SQL语句 465
16.11.2 使用绑定变量定义相同SQL语句 466
16.11.3 列出和输出绑定变量 467
16.11.4 使用绑定变量存储PL/SQL函数的返回值 467
16.11.5 使用绑定变量存储REFCURSOR的行 467
16.12 比较执行查询的成本 468
16.12.1 检查执行计划 468
16.12.2 比较执行计划 473
16.13 为优化器传递提示 474
16.14 其他优化工具 474
16.14.1 Statspack包 474
16.14.2 Oracle Enterprise Manager Diagnostics Pack 475
16.14.3 自动数据库诊断监控 475
16.15 小结 475
附录A Oracle数据类型 477
A.1 Oracle SQL类型 477
A.2 Oracle PL/SQL类型 479
</font>
1.1 关系数据库简介 1
1.2 结构化查询语言(SQL)简介 2
1.3 使用SQL*Plus 3
1.3.1 启动Windows版本的SQL*Plus 4
1.3.2 启动命令行版本的SQL*Plus 4
1.4 使用SQL*Plus执行SELECT语句 5
1.5 SQL*Plus Worksheet 6
1.6 创建store模式 7
1.6.1 运行SQL*Plus脚本创建store模式 7
1.6.2 用来创建store模式的DDL语句 8
1.7 添加. 修改. 删除行 15
1.7.1 向表中添加行 15
1.7.2 修改表中的现有行 16
1.7.3 从表中删除行 17
1.8 Oracle 10g的新数据类型BINARY_FLOAT和 BINARY_ DOUBLE 17
1.8.1 BINARY_FLOAT和BINARY_DOUBLE的优点 17
1.8.2 在表中使用BINARY_FLOAT和BINARY_DOUBLE 18
1.8.3 特殊值 18
1.9 退出SQL*Plus 19
1.10 Oracle PL/SQL简介 19
1.11 小结 20
第2章 从数据库表中检索信息 23
2.1 对单表执行SELECT语句 23
2.2 选择一个表中的所有列 24
2.3 理解行标识符 25
2.4 执行算术运算 25
2.4.1 日期运算 26
2.4.2 列运算 27
2.5 使用列别名 28
2.6 使用串连操作合并列的输出结果 29
2.7 理解空值 29
2.8 禁止显式重复行 31
2.9 使用WHERE子句过滤行 32
2.9.1 使用比较操作符 32
2.9.2 使用SQL操作符 34
2.9.3 使用逻辑操作符 36
2.9.4 理解操作符的优先级 37
2.10 使用ORDER BY子句对行进行排序 37
2.11 执行使用两个表的SELECT语句 39
2.12 使用表别名 41
2.13 笛卡尔积 41
2.14 执行使用多于两个表的SELECT语句 42
2.15 理解连接条件和连接类型 43
2.15.1 理解不等连接 43
2.15.2 理解外连接 44
2.15.3 理解自连接 47
2.16 使用SQL/92语法执行连接 48
2.16.1 使用SQL/92标准语法执行两个表的内连接 48
2.16.2 使用USING关键字简化连接 49
2.16.3 使用SQL/92执行多于两个以上表的内连接 50
2.16.4 使用SQL/92执行多列的内连接 50
2.16.5 使用SQL/92执行外连接 50
2.16.6 使用SQL/92执行自连接 52
2.16.7 使用SQL/92执行交叉连接 52
2.17 小结 53
第3章 使用简单函数 55
3.1 使用单行函数 56
3.1.1 字符函数 56
3.1.2 数字函数 64
3.1.3 转换函数 69
3.1.4 正则表达式函数 74
3.2 使用聚合函数 78
3.2.1 AVG()函数 79
3.2.2 COUNT()函数 80
3.2.3 MAX()和MIN()函数 80
3.2.4 STDDEV()函数 81
3.2.5 SUM()函数 81
3.2.6 VARIANCE()函数 82
3.3 对行进行分组 82
3.3.1 使用GROUP BY子句对行进行分组 82
3.3.2 调用聚合函数的错误用法 85
3.3.3 使用HAVING子句过滤行分组 86
3.3.4 组合使用WHERE和GROUP BY子句 86
3.3.5 组合使用WHERE. GROUP BY和HAVING子句 87
3.4 小结 88
第4章 日期和时间的存储与处理 89
4.1 几个简单的存储和检索日期的例子 89
4.2 使用TO_CHAR()和TO_DATE()转换时间值 91
4.2.1 使用TO_CHAR()将时间值转换为字符串 91
4.2.2 使用TO_DATE()将字符串转换为时间值 95
4.3 设置默认的日期格式 98
4.4 Oracle对2位年份的处理 99
4.4.1 使用YY格式 99
4.4.2 使用RR格式 99
4.5 使用时间值函数 101
4.5.1 ADD_MONTHS()函数 101
4.5.2 LAST_DAY()函数 102
4.5.3 MONTHS_BETWEEN() 102
4.5.4 NEXT_DAY()函数 103
4.5.5 ROUND()函数 103
4.5.6 SYSDATE()函数 104
4.5.7 TRUNC()函数 104
4.6 理解时区 105
4.6.1 与时区有关的函数 106
4.6.2 数据库时区和会话时区 106
4.6.3 获取时区的时差 107
4.6.4 获取时区名 107
4.6.5 将时间值从一个时区转换为另一个时区 108
4.7 使用时间戳 108
4.7.1 使用TIMESTAMP类型 108
4.7.2 与时间戳有关的函数 112
4.8 使用时间间隔 116
4.8.1 使用INTERVAL YEAR TO MONTH类型 117
4.8.2 使用INTERVAL DAY TO SECOND类型 119
4.8.3 与时间间隔有关的函数 121
4.9 小结 122
第5章 使用SQL*Plus 123
5.1 查看表结构 123
5.2 编辑SQL语句 124
5.3 保存. 检索并运行文件 126
5.4 格式化列 128
5.5 设置页面大小 130
5.6 设置行大小 131
5.7 清除列格式 131
5.8 使用变量 132
5.8.1 临时变量 132
5.8.2 已定义变量 135
5.9 创建简单报表 137
5.9.1 在脚本中使用临时变量 137
5.9.2 在脚本中使用已定义变量 137
5.9.3 向脚本中的变量传递值 138
5.9.4 添加页眉和页脚 139
5.9.5 计算小计 140
5.10 自动生成SQL语句 141
5.11 小结 142
第6章 子查询 143
6.1 子查询的类型 143
6.2 编写单行子查询 144
6.2.1 在WHERE子句中使用子查询 144
6.2.2 在HAVING子句中使用子查询 145
6.2.3 在FROM子句中使用子查询(内联视图) 146
6.2.4 可能碰到的两个错误 147
6.3 编写多行子查询 148
6.3.1 在多行子查询中使用IN操作符 148
6.3.2 在多行子查询中使用ANY操作符 149
6.3.3 在多行子查询中使用ALL操作符 149
6.4 编写多列子查询 150
6.5 编写关联子查询 150
6.5.1 关联子查询的例子 150
6.5.2 在关联子查询中使用EXISTS和NOT EXISTS 151
6.6 编写嵌套子查询 153
6.7 编写包含子查询的UPDATE和DELETE语句 155
6.7.1 编写包含子查询的UPDATE语句 155
6.7.2 编写包含子查询的DELETE语句 155
6.8 小结 156
第7章 高级查询 157
7.1 使用集合操作符 158
7.1.1 示例表 158
7.1.2 使用UNION ALL操作符 159
7.1.3 使用UNION操作符 160
7.1.4 使用INTERSECT操作符 161
7.1.5 使用MINUS操作符 161
7.1.6 组合使用集合操作符 162
7.2 使用TRANSLATE()函数 163
7.3 使用DECODE()函数 164
7.4 使用CASE表达式 166
7.4.1 使用简单CASE表达式 166
7.4.2 使用搜索CASE表达式 167
7.5 层次化查询 168
7.5.1 示例数据 168
7.5.2 使用CONNECT BY和START WITH子句 170
7.5.3 使用伪列LEVEL 171
7.5.4 格式化层次化查询的结果 171
7.5.5 从非根节点开始遍历 172
7.5.6 在START WITH子句中使用子查询 173
7.5.7 从下向上遍历树 173
7.5.8 从层次查询中删除节点和分支 174
7.5.9 在层次化查询中加入其他条件 175
7.6 使用扩展的GROUP BY子句 175
7.7 使用ROLLUP子句 177
7.7.1 使用CUBE子句 179
7.7.2 使用GROUPING()函数 181
7.7.3 使用GROUPING SETS子句 183
7.7.4 使用GROUPING_ID()函数 184
7.7.5 在GROUP BY子句中多次使用一个列 186
7.7.6 使用GROUP_ID()函数 186
7.8 使用分析函数 187
7.8.1 示例表 188
7.8.2 使用评级函数 189
7.8.3 使用反百分点函数 195
7.8.4 使用窗口函数 196
7.8.5 使用报表函数 201
7.8.6 使用LAG()和LEAD()函数 203
7.8.7 使用FIRST和LAST函数 204
7.8.8 使用线性回归函数 204
7.8.9 使用假想评级与分布函数 205
7.9 使用MODEL子句 206
7.9.1 示例MODEL子句 206
7.9.2 用位置标记和符号标记访问数据单元 208
7.9.3 用BETWEEN和AND返回特定范围内的数据单元 208
7.9.4 用ANY和IS ANY访问所有的数据单元 209
7.9.5 用CURRENTV()获取某个维度的当前值 209
7.9.6 用FOR循环访问数据单元 210
7.9.7 处理空值和缺失值 212
7.9.8 更新已有的单元 214
7.10 小结 215
第8章 修改表的内容 217
8.1 使用INSERT语句添加行 217
8.1.1 忽略列的列表 218
8.1.2 为列指定空值 219
8.1.3 在列值中使用单引号和双引号 219
8.1.4 从一个表向另外一个表复制行 219
8.2 使用UPDATE语句修改行 220
8.3 使用DELETE语句删除行 221
8.4 数据库的完整性 222
8.4.1 主键约束 222
8.4.2 外键约束 222
8.5 使用默认值 223
8.6 使用MERGE合并行 225
8.7 数据库事务 227
8.7.1 事务的提交和回滚 227
8.7.2 事务的开始与结束 228
8.7.3 保存点 229
8.7.4 事务的ACID特性 230
8.7.5 并发事务 230
8.7.6 事务锁 232
8.7.7 事务隔离级别 232
8.7.8 SERIALIZABLE事务隔离性级别的一个例子 233
8.8 查询闪回 234
8.8.1 使用闪回的授权 234
8.8.2 时间查询闪回 234
8.8.3 系统变更号查询闪回 236
8.9 小结 237
第9章 数据库安全性 239
9.1 用户 239
9.1.1 创建用户 240
9.1.2 修改用户密码 241
9.1.3 删除用户 241
9.2 系统特权 241
9.2.1 向用户授予系统特权 242
9.2.2 检查授予用户的系统特权 243
9.2.3 使用系统特权 244
9.2.4 撤销用户的系统特权 244
9.3 对象特权 244
9.3.1 向用户授予对象特权 245
9.3.2 检查已授予的对象特权 245
9.3.3 检查已接受的对象特权 247
9.3.4 使用对象特权 249
9.3.5 同名对象 249
9.3.6 公共同名对象 250
9.3.7 撤销用户的对象特权 251
9.4 角色 251
9.4.1 创建角色 251
9.4.2 为角色授权 252
9.4.3 将角色授予用户 252
9.4.4 检查授予用户的角色 253
9.4.5 检查授予角色的系统特权 254
9.4.6 检查授予角色的对象特权 254
9.4.7 使用授予角色的特权 256
9.4.8 默认角色 256
9.4.9 撤销角色 257
9.4.10 从角色中撤销特权 257
9.4.11 删除角色 257
9.5 小结 257
第10章 创建表. 序列. 索引和视图 259
10.1 表 259
10.1.1 创建表 260
10.1.2 获得有关表的信息 261
10.1.3 获得表中列的信息 262
10.1.4 修改表 263
10.1.5 重命名表 271
10.1.6 向表添加注释 271
10.1.7 截断表 272
10.1.8 删除表 272
10.2 序列 272
10.2.1 创建序列 272
10.2.2 获取有关序列的信息 274
10.2.3 使用序列 275
10.2.4 使用序列填充主键 276
10.2.5 修改序列 277
10.2.6 删除序列 278
10.3 索引 278
10.3.1 创建索引 278
10.3.2 创建基于函数的索引 279
10.3.3 获取有关索引的信息 280
10.3.4 获取列索引的信息 281
10.3.5 修改索引 281
10.3.6 删除索引 281
10.4 视图 282
10.4.1 创建并使用视图 282
10.4.2 修改视图 289
10.4.3 删除视图 289
10.5 小结 290
第11章 PL/SQL编程简介 291
11.1 块结构 292
11.2 变量和类型 293
11.3 条件逻辑 294
11.4 循环 294
11.4.1 简单循环 295
11.4.2 WHILE循环 295
11.4.3 FOR循环 295
11.5 游标 296
11.5.1 步骤1:声明用于保存列值的变量 296
11.5.2 步骤2:声明游标 297
11.5.3 步骤3:打开游标 297
11.5.4 步骤4:从游标中取得记录 297
11.5.5 步骤5:关闭游标 298
11.5.6 完整的实例:product_cursor.sql 298
11.5.7 游标与FOR循环 300
11.6 异常 301
11.6.1 ZERO_DIVIDE异常 302
11.6.2 DUP_VAL_ON_INDEX异常 303
11.6.3 INVALID_NUMBER异常 303
11.6.4 OTHERS异常 303
11.7 过程 304
11.7.1 创建过程 304
11.7.2 调用过程 307
11.7.3 获取有关过程的信息 307
11.7.4 删除过程 308
11.7.5 查看过程中的错误 308
11.8 函数 309
11.8.1 创建函数 309
11.8.2 调用函数 310
11.8.3 获取有关函数的信息 310
11.8.4 删除函数 311
11.9 包 311
11.9.1 创建包规范 311
11.9.2 创建包体 312
11.9.3 调用包中的函数和过程 313
11.9.4 获取有关包中函数和过程的信息 314
11.9.5 删除包 314
11.10 触发器 314
11.10.1 触发器运行的时机 314
11.10.2 设置示例触发器 315
11.10.3 创建触发器 315
11.10.4 激活触发器 316
11.10.5 获取有关触发器的信息 317
11.10.6 禁用和启用触发器 319
11.10.7 删除触发器 319
11.11 小结 319
第12章 数据库对象 321
12.1 对象简介 321
12.2 创建对象类型 322
12.3 使用DESCRIBE获取有关对象类型的信息 324
12.4 用对象类型定义列对象和对象表 325
12.5 对products表执行DML操作 325
12.5.1 将记录插入到products表中 326
12.5.2 从products表中查询记录 326
12.5.3 修改products表中的记录 327
12.5.4 从products表中删除记录 327
12.6 对object_products表执行DML 327
12.6.1 向object_products表中插入记录 328
12.6.2 从object_products表中选择记录 328
12.6.3 更新object_products表中的记录 328
12.6.4 从object_products表中删除记录 329
12.7 对object_customers表执行DML 329
12.7.1 向object_customers表中插入记录 329
12.7.2 从object_customers表中查询记录 329
12.8 对purchases表执行DML 330
12.8.1 向purchases表中插入记录 331
12.8.2 从purchases表中选择记录 331
12.8.3 更新purchases表中的记录 332
12.9 在PL/SQL中使用对象 332
12.10 类型继承 334
12.11 NOT INSTANTIABLE对象类型 335
12.12 用户自定义的构造函数 336
12.13 小结 339
第13章 集合 341
13.1 集合简介 341
13.2 变长数组 342
13.2.1 创建变长数组类型 342
13.2.2 使用变长数组类型定义表列 343
13.2.3 获得变长数组信息 343
13.2.4 填充变长数组元素 344
13.2.5 查找变长数组元素 345
13.2.6 更改变长数组元素 345
13.3 嵌套表 345
13.3.1 创建嵌套表类型 346
13.3.2 使用嵌套表类型定义表列 346
13.3.3 获得嵌套表信息 346
13.3.4 填充嵌套表元素 348
13.3.5 查找嵌套表元素 348
13.3.6 更改嵌套表元素 348
13.4 多级集合类型 349
13.5 在PL/SQL中使用集合 351
13.5.1 操作变长数组 351
13.5.2 操作嵌套表 353
13.5.3 集合方法 355
13.6 Oracle 10g对集合的改进 362
13.6.1 关联数组 362
13.6.2 更改元素类型的大小或精度 363
13.6.3 增加变长数组的元素数目 363
13.6.4 在临时表中使用变长数组 363
13.6.5 为嵌套表的存储表使用不同的表空间 364
13.6.6 对嵌套表的ANSI支持 364
13.7 小结 372
第14章 大对象 373
14.1 大对象(LOB)简介 373
14.2 示例文件 374
14.3 理解大对象类型 374
14.4 创建包含大对象的表 375
14.5 在SQL中使用大对象 376
14.5.1 使用CLOB和BLOB 376
14.5.2 使用BFILE 377
14.6 在PL/SQL中使用大对象 379
14.6.1 READ() 380
14.6.2 WRITE() 383
14.6.3 APPEND() 384
14.6.4 CLOSE() 386
14.6.5 COMPARE() 386
14.6.6 COPY() 388
14.6.7 CREATETEMPORARY() 390
14.6.8 ERASE() 391
14.6.9 FILECLOSE() 392
14.6.10 FILECLOSEALL() 393
14.6.11 FILEEXISTS() 393
14.6.12 FILEGETNAME() 394
14.6.13 FILEISOPEN() 394
14.6.14 FILEOPEN() 395
14.6.15 FREETEMPORARY() 396
14.6.16 GETCHUNKSIZE() 396
14.6.17 GET_STORAGE_LIMIT() 397
14.6.18 GETLENGTH() 397
14.6.19 INSTR() 397
14.6.20 ISOPEN() 400
14.6.21 ISTEMPORARY() 400
14.6.22 LOADFROMFILE() 401
14.6.23 LOADBLOBFROMFILE() 404
14.6.24 LOADCLOBFROMFILE() 405
14.6.25 OPEN() 405
14.6.26 SUBSTR() 406
14.6.27 TRIM() 407
14.6.28 WRITEAPPEND() 408
14.7 理解LONG和LONG RAW类型 408
14.7.1 示例表 409
14.7.2 使用LONG和LONG RAW列 409
14.8 Oracle10g对大对象的增强 410
14.8.1 CLOB和NCLOB对象之间的隐式转换 410
14.8.2 在触发器中使用LOB时:new属性的用法 411
14.9 小结 412
第15章 使用Java运行SQL 413
15.1 准备工作 414
15.2 配置计算机 414
15.2.1 设置ORACLE_HOME环境变量 414
15.2.2 设置JAVA_HOME环境变量 415
15.2.3 设置PATH环境变量 415
15.2.4 设置CLASSPATH环境变量 416
15.2.5 设置LD_LIBRARAY_PATH环境变量 416
15.3 Oracle JDBC驱动程序 416
15.3.1 Thin驱动程序 417
15.3.2 OCI驱动器 417
15.3.3 服务器端内部驱动器 417
15.3.4 服务器端Thin驱动器 417
15.4 导入JDBC包 417
15.5 注册Oracle JDBC驱动程序 418
15.6 打开数据库连接 418
15.6.1 使用DriverManager类的getConnection()方法连接数据库 418
15.6.2 使用Oracle数据源连接数据库 420
15.7 创建JDBC Statement对象 422
15.8 从数据库检索列 423
15.8.1 步骤1:创建和填充ResultSet对象 423
15.8.2 步骤2:从ResultSet对象中读取列值 424
15.8.3 步骤3:关闭ResultSet对象 426
15.9 向数据库添加行 426
15.10 更改数据库的行 427
15.11 删除数据库的行 427
15.12 处理数字 428
15.13 处理数据库Null值 429
15.14 控制数据库事务 430
15.15 执行DDL语句 431
15.16 处理异常 432
15.17 关闭JDBC对象 433
15.18 示例程序:BasicExample1.java 434
15.18.1 编译BasicExample1 439
15.18.2 运行BasicExample1 439
15.19 预备SQL语句 441
15.20 Oracle JDBC扩展 446
15.20.1 oracle.sql包 446
15.20.2 oracle.jdbc包 450
15.20.3 示例程序:BasicExample3.java 453
15.21 小结 456
第16章 SQL优化 457
16.1 SQL优化简介 457
16.2 使用WHERE子句过滤行 458
16.3 使用表连接而不是多个查询 458
16.4 执行连接时使用完全限定的列引用 459
16.5 使用CASE表达式而不是多个查询 460
16.6 添加表索引 461
16.7 使用WHERE而不是HAVING 461
16.8 使用UNION ALL而不是UNION 462
16.9 使用EXISTS而不是IN 464
16.10 使用EXISTS而不是DISTINCT 464
16.11 使用绑定变量 465
16.11.1 不相同的SQL语句 465
16.11.2 使用绑定变量定义相同SQL语句 466
16.11.3 列出和输出绑定变量 467
16.11.4 使用绑定变量存储PL/SQL函数的返回值 467
16.11.5 使用绑定变量存储REFCURSOR的行 467
16.12 比较执行查询的成本 468
16.12.1 检查执行计划 468
16.12.2 比较执行计划 473
16.13 为优化器传递提示 474
16.14 其他优化工具 474
16.14.1 Statspack包 474
16.14.2 Oracle Enterprise Manager Diagnostics Pack 475
16.14.3 自动数据库诊断监控 475
16.15 小结 475
附录A Oracle数据类型 477
A.1 Oracle SQL类型 477
A.2 Oracle PL/SQL类型 479
</font>
猜您喜欢