具体描述
本书由浅入深,全面、系统地介绍了Oracle 11g R2 数据库中的PL/SQL 开发技术。同时,本书提供了大量实例,供读者实战演练。
本书共分4 篇。第1 篇介绍Oracle 和PL/SQL 基础知识;第2 篇介绍数据表的创建和操作、表中数据的操作、数据的基本查询、查询中函数的使用、查询中特殊的转换函数、数据表的高级查询等技术;第3 篇介绍索引和视图的使用、序列的使用、数据类型和流程控制、游标的使用、存储过程和函数的使用、触发器的使用、在使用PL/SQL 编程时异常的处理、事务和锁、安全管理、PL/SQL 代码的管理以及PL/SQL 语句优化、备份和恢复访问技术;第4 篇介绍在.NET 和Java 中连接Oracle 的方法,以提高读者实战水平。
本书涉及面广,从基本操作到高级技术和核心原理,再到项目开发,几乎涉及PL/SQL 应用的所有重要知识。本书适合所有想全面学习PL/SQL 语言的人员阅读,也适合使用PL/SQL 进行开发的各种工程技术人员使用。对于经常使用PL/SQL 做开发的人员,更是一本不可多得的案头必备参考书。
作者简介
目录信息
第1章 走进Oracle 2
1.1 数据库系统与数据模型 2
1.1.1 基本术语 2
1.1.2 数据库技术的发展 3
1.1.3 数据模型 5
1.2 数据库系统的体系结构 6
1.2.1 数据库系统的三级模式 6
1.2.2 数据库管理系统 7
1.2.3 数据库系统的工作流程 8
1.3 关系数据库的简单介绍 9
1.3.1 关系数据库的基本特性 10
1.3.2 关系数据库的设计规范 10
1.4 认识Oracle 11g R2 11
1.4.1 什么是Oracle 11g R2 11
1.4.2 Oracle的发展历程 12
1.4.3 Oracle 11g R2的新特性 13
1.5 小结 13
第2章 认识PL/SQL 14
2.1 SQL语言概述 14
2.2 什么是PL/SQL 19
2.3 PL/SQL在SQL*Plus中的使用 26
2.3.5 SQL*Plus删除命令 31
2.3.6 SQL*Plus清除缓冲区命令 32
2.3.7 SQL*Plus显示缓冲区内容命令 33
2.3.8 SQL*Plus保存命令 34
2.3.9 查询结果的格式化 36
2.3.10 注释的使用 43
2.3.11 在SQL*Plus中编辑语句 44
2.4 PL/SQL在SQL Developer中的使用 45
2.5 小结 47
第2篇 PL/SQL基础
第3章 数据表的基本操作 50
3.1 创建表 50
3.1.3 创建表实例 52
3.2 约束 54
3.2.1 约束的类型 55
3.2.2 创建一个带检查约束的表 55
3.2.3 创建一个带非空约束的表 56
3.2.4 创建一个带唯一约束的表 57
3.2.5 创建一个带外键约束的表 58
3.2.6 创建一个含多个约束的表 61
3.3 修改表 62
3.3.2 给表添加约束 65
3.3.3 删除表中的约束 66
3.4 删除表 67
3.5 重命名表 67
3.6 使用企业管理器操作表 67
3.6.1 启用企业管理器 68
3.6.2 使用企业管理器创建表 69
3.6.4 使用企业管理器删除表 74
3.7 小结 75
第4章 表中数据的基本操作 76
4.1 查询数据表 76
4.1.1 查询表中的数据 76
4.1.2 使用SQL Developer工具查询表中的数据 77
4.2 添加数据 79
4.2.1 添加操作的基本语法 79
4.2.2 直接向表中添加数据 80
4.2.3 数据中NULL值的处理 82
4.2.4 插入值是默认值的处理 84
4.2.5 插入值是唯一值的处理 85
4.2.6 使用INSERT...SELECT插入数据 86
4.2.7 使用SQL Developer工具添加数据 87
4.3 修改数据 88
4.3.1 修改操作的基本语法 88
4.3.2 使用UPDATE语句更新数据行 89
4.3.3 根据条件修改表中的数据 91
4.3.4 使用SQL Developer工具修改数据 91
4.4 删除数据 91
4.4.1 删除操作的基本语法 91
4.4.2 删除表中的数据 92
4.4.3 有关TRUNCATE的使用 92
4.4.4 使用SQL Developer工具删除数据 94
4.5 小结 94
第5章 数据的基本查询 95
5.1 查询语句的基础 95
5.1.1 查询语句语法 95
5.1.2 查询各关键词的顺序及功能 96
5.1.3 查询语句执行顺序 96
5.2 最容易理解的查询 97
5.2.1 增加实验数据 97
5.2.2 查询表中列的数据 99
5.2.3 查询所有列 101
5.2.4 去除查询结果中的重复记录 102
5.2.5 返回查询的部分数据 104
5.3 带条件的查询 104
5.3.1 单一的条件查询 105
5.3.2 查询中使用比较表达式 106
5.3.3 使用简单逻辑表达式 108
5.3.4 有关NULL值的判断 114
5.3.5 有关模糊查询 115
5.3.6 指定数据范围 120
5.3.7 如何限制检索数据范围 122
5.3.8 定义转义符 123
5.4 排序查询结果 125
5.4.1 基本排序 125
5.4.2 多列排序 129
5.5 PL/SQL中的运算符 131
5.5.1 算术运算符 132
5.5.2 比较运算符 132
5.5.3 逻辑运算符 132
5.5.4 字符串连接符 133
5.5.5 赋值运算符 133
5.5.6 运算符的优先级 133
5.6 查询中表达式的使用 134
5.6.1 使用连接符连接列 134
5.6.2 算术表达式的使用 136
5.7 小结 137
第6章 查询中函数的使用 138
6.1 常用的单行函数 138
6.1.1 字符处理函数 138
6.1.2 数值处理函数 143
6.1.3 日期处理函数 146
6.1.4 转换函数 149
6.1.5 替换NULL值函数 151
6.1.6 排除指定条件函数 152
6.2 聚合函数 152
6.2.1 聚合函数的种类 152
6.2.2 计数函数 153
6.2.3 求和函数 155
6.2.4 均值函数 156
6.2.5 最大值/最小值函数 158
6.2.6 统计函数 160
6.2.7 聚合函数的重值处理 161
6.3 分组查询 162
6.3.1 简单分组 162
6.3.2 多列分组 163
6.3.3 分组查询中NULL值的处理 164
6.3.4 汇总数据运算符 165
6.3.5 筛选分组结果 168
6.4 其他函数 170
6.4.1 返回登录名函数 170
6.4.2 返回SESSIONID和
LANGUAGE函数 170
6.4.3 数据匹配函数 171
6.5 小结 172
第7章 查询中特殊的转换函数 173
7.1 基本的转换函数 173
7.1.1 数据类型的自动转换 173
7.1.2 关于自动转换的注意事项 176
7.2 特殊的转换函数 177
7.3 变换函数 178
7.3.1 TRANSLATE函数 178
7.3.2 DECODE函数 180
7.4 小结 182
第8章 数据表的高级查询 183
8.1 理解什么是多表连接 183
8.1.1 什么是连接 183
8.1.2 连接的类型与实现 184
8.2 简单的多表查询 184
8.2.1 创建实例表 185
8.2.2 如何实现多表查询 186
8.2.3 指定连接条件 187
8.2.4 使用别名作为表名的简写 188
8.2.5 自连接表进行查询 189
8.3 表的连接查询 192
8.3.1 基本连接语法 193
8.3.2 内部连接 193
8.3.3 自然连接 196
8.3.4 外部连接 198
8.3.5 交叉连接 203
8.3.6 连接中空值问题 204
8.3.7 表的连接与聚合分析 206
8.4 集合运算 208
8.4.1 集合运算的种类 208
8.4.2 UNION的使用 208
8.4.3 有关多表的UNION操作 211
8.4.4 UNION与JOIN的区别 212
8.4.5 MINUS与INTERSECT的使用 213
8.5 子查询的使用 217
8.5.1 认识子查询 217
8.5.2 非相关子查询与相关子查询 217
8.5.3 子查询的组成 219
8.5.4 子查询的使用方式及限制 220
8.6 在子查询中使用各种限制条件 220
8.6.1 比较运算符引入子查询 221
8.6.2 子查询中的聚合函数 223
8.6.3 在子查询中使用IN 224
8.7 在子查询中使用EXISTS 227
8.7.1 使用EXISTS的子查询 228
8.7.2 EXISTS子查询的使用 229
8.7.3 使用EXISTS子查询检查表中的重复行 230
8.8 子查询的其他应用 231
8.8.1 在子查询中使用ROWNUM关键词 231
8.8.2 在SELECT子句中使用子查询 234
8.8.3 在HAVING子句中使用子查询 235
8.8.4 在数据操纵语言(DML)中使用子查询 236
8.9 小结 238
第3篇 PL/SQL高级技术
第9章 索引和视图的使用 240
9.1 索引及其操作 240
9.1.1 什么是索引 240
9.1.2 索引的种类及语法 240
9.1.3 索引的创建 241
9.1.4 创建索引的注意事项 246
9.1.5 索引的管理 246
9.2 视图及其应用 250
9.2.1 什么是视图 250
9.2.2 视图的作用 251
9.3 创建视图 251
9.3.1 视图的语法 251
9.3.2 创建单表视图 252
9.3.3 创建多表视图 253
9.3.4 视图的视图 254
9.3.5 无源表视图 255
9.3.6 设置视图只读 255
9.3.7 设置视图的检查约束 257
9.3.8 内嵌视图的使用 259
9.3.9 查询视图的定义和相关信息 259
9.4 修改、删除视图 260
9.4.1 修改视图内容 260
9.4.2 删除视图 261
9.5 小结 262
第10章 序列 263
10.1 创建序列 263
10.2 使用序列 265
10.3 序列属性 269
10.3.1 创建序列的注意事项 269
10.3.2 指定序列的初始值 269
10.3.3 序列的最大值和最小值 270
10.3.4 序列的步长 271
10.3.5 序列的循环取值 272
10.3.6 序列的缓存大小 273
10.4 小结 274
第11章 数据类型、流程控制和游标 275
11.1 PL/SQL数据类型 275
11.1.1 标量类型 275
11.1.2 复合类型 276
11.2 变量和常量 284
11.2.1 变量的声明语法 284
11.2.2 常量的声明语法 285
11.3 程序流控制语句 285
11.3.1 IF...ELSE条件选择结构 286
11.3.2 CASE条件控制语句 291
11.3.3 LOOP循环控制语句 295
11.4 游标 300
11.4.1 游标的概念 301
11.4.2 显式游标的定义和操作 302
11.4.3 显式游标的属性 306
11.4.4 隐式游标 308
11.5 小结 311
第12章 存储过程、函数 312
12.1 理解存储过程 312
12.1.1 认识存储过程 312
12.1.2 存储过程的优点 312
12.1.3 存储过程的语法 313
12.2 存储过程的创建和执行 313
12.2.1 存储过程的执行 313
12.2.2 创建无参数的存储过程 314
12.2.3 带有输入参数的存储过程 318
12.2.4 带有输出参数的存储过程 321
12.3 存储过程的管理 323
12.3.1 查看存储过程 323
12.3.2 查看存储过程的错误 324
12.3.3 修改存储过程 326
12.3.4 存储过程的重新编译 326
12.3.5 删除存储过程 327
12.4 函数 327
12.4.1 函数的组成和语法 327
12.4.2 创建无参数函数 328
12.4.3 创建有参数函数 330
12.4.4 查看函数 335
12.4.5 修改函数 336
12.4.6 重新编译函数 337
12.4.7 删除函数 338
12.5 小结 338
第13章 程序包 339
13.1 程序包简介 339
13.2 构建程序包的规则 339
13.2.1 程序包规范 339
13.2.2 程序包主体 341
13.3 调用程序包中的函数/存储过程 343
13.4 删除程序包 343
13.5 小结 344
第14章 触发器 345
14.1 触发器的基本概念 345
14.1.1 触发器简介 345
14.1.2 触发器的类型 345
14.1.3 触发器的作用及使用 346
14.1.4 触发器的执行环境 346
14.2 触发器的创建和使用 347
14.2.1 触发器的语法和组成 347
14.2.2 创建DML触发器 349
14.2.3 替代类型触发器 360
14.2.4 复合类型触发器 362
14.2.5 DDL类型触发器 364
14.3 触发器管理 366
14.3.1 查看触发器 366
14.3.2 修改触发器 367
14.3.3 删除触发器 369
14.4 小结 370
第15章 异常处理 371
15.1 理解异常 371
15.1.1 异常的分类 371
15.1.2 异常的结构 372
15.2 异常的应用 372
15.2.1 预定义异常 373
15.2.2 非预定义异常 377
15.2.3 自定义异常 379
15.3 小结 380
第16章 事务和锁 381
16.1 事务控制的基本概念 381
16.1.1 事务控制的必要性 381
16.1.2 事务的ACID特性及实现 382
16.1.3 事务的状态 382
16.1.4 PL/SQL中事务的执行 383
16.2 PL/SQL中事务的实现 384
16.2.1 事务的类型 384
16.2.2 提交事务 385
16.2.3 设置事务的保存点 387
16.3 并发控制及其实现 388
16.3.1 并发访问的常见问题 389
16.3.2 什么是锁 390
16.3.3 锁的分类 390
16.3.4 事务隔离级别 392
16.3.5 事务阻塞及其解决方法 394
16.3.6 死锁 396
16.4 小结 398
第17章 安全管理 399
17.1 用户管理 399
17.1.1 什么是用户 399
17.1.2 创建用户 399
17.1.3 修改用户 405
17.1.4 删除用户 407
17.2 权限管理 409
17.2.1 授予权限 409
17.2.2 权限回收 413
17.2.3 查看权限 415
17.3 角色管理 416
17.3.1 理解角色 416
17.3.2 创建角色 417
17.3.3 角色的管理设置 419
17.3.4 修改、删除角色 420
17.4 概要文件(PROFILE) 421
17.4.1 理解概要文件 421
17.4.2 创建概要文件 421
17.4.3 修改、删除概要文件 424
17.4.4 查询概要文件 425
17.5 小结 426
第18章 动态SQL和动态PL/SQL 427
18.1 动态SQL 427
18.1.1 EXECUTE IMMEDIATE语句 427
18.1.2 OPEN FOR语句 428
18.1.3 4种动态SQL方法 429
18.2 动态PL/SQL 431
18.3 小结 431
第19章 管理PL/SQL代码 432
19.1 管理数据库中的代码 432
19.1.1 数据字典视图概述 432
19.1.2 显示存储对象的信息 433
19.1.3 源代码的显示和搜索 434
19.1.4 通过数据字典视图查看编译器属性 434
19.1.5 通过视图分析和更改触发器的状态 436
19.1.6 分析参数信息 437
19.2 依赖关系的管理和代码的重编译 437
19.2.1 通过数据字典视图查看依赖关系 437
19.2.2 失效的程序单元的重编译 438
19.3 编译时警告 439
19.4 PL/SQL程序的执行和调试 441
19.4.1 PL/SQL程序的执行 441
19.4.2 PL/SQL程序的调试 442
19.4.3 调试技巧和策略 442
19.5 I/O操作与PL/SQL 446
19.5.1 显示信息 446
19.5.2 启用DBMS_OUTPUT 446
19.6 应用安全与PL/SQL 448
19.7 小结 449
第20章 PL/SQL语句优化 450
20.1 一般的SQL技巧 450
20.1.1 在查询中尽量不使用“*” 450
20.1.2 多表查询时多使用别名 450
20.1.3 条件查询多使用WHERE 451
20.1.4 计算时不用索引列 451
20.1.5 指定查询范围时多使用IN 452
20.1.6 使用TRUNCATE清空表中记录 453
20.1.7 及时提交事务 453
20.1.8 DECODE函数的使用 454
20.1.9 多使用EXISTS语句判断条件 455
20.1.10 其他技巧 455
20.2 Oracle优化器 456
20.2.1 Oracle优化器的分类 456
20.2.2 Oracle优化器的模式 457
20.2.3 查看Oracle执行计划 457
20.3 SQL性能指导 458
20.3.1 ADDM 458
20.3.2 SQL访问指导 458
20.3.3 SQL优化指导 462
20.4 小结 462
第21章 备份与恢复 463
21.1 备份与恢复简介 463
21.1.1 备份 463
21.1.2 恢复 463
21.2 逻辑备份与恢复 463
21.2.1 使用expdp和impdp工具进行逻辑备份与恢复 463
21.2.2 使用OEM进行逻辑备份与恢复 466
21.3 脱机备份与恢复 475
21.3.1 脱机备份 475
21.3.2 脱机恢复 476
21.4 联机备份与恢复 476
21.4.1 使用RMAN管理备份与恢复 477
21.4.2 恢复 479
21.5 小结 482
第4篇 Oracle应用开发
第22章 在.NET中连接Oracle数据库 484
22.1 ADO.NET概述 484
22.1.1 什么是ADO.NET 484
22.1.2 ADO.NET中的对象 484
22.2 使用绑定的方式连接Oracle数据库 485
22.2.1 数据控件概述 485
22.2.2 使用DataGridView控件绑定Oracle数据库 486
22.3 使用代码的方式连接Oracle数据库 492
22.3.1 使用Command对象操作Oracle数据库 492
22.3.2 使用DataSet对象存储查询结果 494
22.3.3 商品信息存储实例 495
22.4 小结 499
第23章 在Java中连接Oracle数据库 500
23.1 JDBC与ODBC简介 500
23.1.1 什么是JDBC 500
23.1.2 什么是ODBC 501
23.2 使用Thin方式连接Oracle数据库 502
23.3 使用JDBC-ODBC桥连接Oracle数据库 510
23.3.1 配置ODBC数据源 510
23.3.2 连接Oracle数据库 513
23.4 小结 513
· · · · · · (收起)
读后感
用户评价
拿到这本新版《Oracle PL/SQL宝典》时,我最直观的感受就是“厚重”——不仅仅是物理上的分量,更是内容上的充实感。作为一名在数据库领域摸爬滚打了有些年头的开发者,我深知PL/SQL这门语言的生命力,它依然是Oracle生态中处理复杂业务逻辑的核心利器。这本书的编排非常注重实战,从基础的数据类型和流程控制讲起,没有丝毫的灌水,每一步的讲解都像是经验丰富的老工程师在手把手地带新人入门。我特别欣赏它在高级特性上的挖掘深度,比如游标的精细化管理、包(Package)的结构设计哲学,以及异常处理的最佳实践。这些内容绝非教科书式的概念堆砌,而是结合了大量企业级应用中会遇到的痛点和高效解决方案。尤其是关于性能调优的部分,书中深入剖析了SQL的执行计划与PL/SQL代码的交互影响,给出了很多可以立刻应用到生产环境中的优化思路。对于希望从“会写”PL/SQL迈向“精通并设计健壮系统”的读者来说,这本书无疑是一份极具价值的参考手册,它不仅仅告诉你“怎么做”,更重要的是告诉你“为什么这么做”,这种对底层原理的探究,才是区分普通代码匠人和资深架构师的关键所在。
我最近接手了一个遗留系统的维护工作,其中充斥着大量逻辑晦涩、性能低下的存储过程,让我头疼不已。抱着试一试的心态翻开了这本宝典,它提供的视角立刻为我打开了一扇窗。这本书的叙事节奏非常稳健,它没有急于展示那些花哨的最新特性,而是耐心地梳理了PL/SQL语言自诞生以来的核心思想。我对其中关于事务控制(COMMIT/ROLLBACK)在复杂调用链中的应用那一章节印象尤为深刻。作者用一系列精心设计的案例,清晰地展示了隐式事务和显式事务的边界,以及在分布式事务环境下可能出现的陷阱。这对于我理解和重构那些“跑起来没问题,但一出问题就查不清”的旧代码至关重要。此外,书中关于面向对象编程(OOP)在PL/SQL中的实现,比如使用`OBJECT`类型和方法,虽然在业界讨论度不如其他语言,但作者将其阐述得深入浅出,让我看到了如何在Oracle环境中构建更具可维护性和模块化代码的可能性。总而言之,这本书更像一位循循善诱的导师,而非冷冰冰的技术手册,它引导读者去思考代码的结构之美和健壮性。
作为一名技术审阅人,我总是在寻找能真正帮助团队提升编码规范的书籍。这本宝典在代码风格和可读性方面给出了非常明确的指导方针。它不仅仅是罗列了Oracle的内置函数,而是着重强调了如何通过清晰的命名约定、一致的缩进和恰当的注释来提升PL/SQL代码的“生命周期价值”。书中提供的多个重构案例,展示了如何将一段冗长、嵌套过深的“意大利面条式”代码,逐步提炼成结构清晰、职责单一的模块集合。这种自上而下的设计思维训练,比单纯记忆语法点要宝贵得多。尤其是在讲解集合(Collection)操作时,作者非常细致地区分了关联数组、嵌套表和VARRAY的应用场景,并结合性能指标分析了它们在内存占用和I/O效率上的差异。这使得我们在面对大规模数据处理时,能够做出基于性能指标的理性技术选型,而不是凭感觉来写代码。这本书是提升团队整体代码质量的绝佳训练教材。
我非常喜欢这本书的“前瞻性”和对“生态系统融合”的强调。在当今技术栈日益复杂的环境中,PL/SQL很少是孤立存在的,它需要与Java、Web服务甚至外部操作系统进行交互。这本书很好地涵盖了这些集成点。例如,它详细讲解了如何利用`UTL_HTTP`调用外部RESTful服务,以及如何配置和使用数据库外部过程(External Procedures)来调用C语言库。这些跨界的技术点,往往是许多入门级资料会忽略的空白地带。通过这些章节,我清晰地看到了Oracle数据库作为企业应用核心的定位,以及PL/SQL如何作为粘合剂,将不同的技术组件连接起来。更重要的是,书中对Oracle 19c及之后版本中引入的新特性保持了关注,确保了内容的与时俱进。对于那些需要将传统数据库逻辑与现代微服务架构进行对接的资深工程师来说,这本书提供了一个坚实、全面的技术桥梁,帮助我们将深厚的数据库功底与新兴技术趋势有效结合起来。
坦白说,市面上关于数据库编程的书籍浩如烟海,大多流于表面,停留在CRUD操作的层面。但《Oracle PL/SQL宝典(第2版)》在处理那些“边缘地带”的知识点时展现了非凡的专业度。我最感兴趣的是它对`DBMS_JOB`和新版`DBMS_SCHEDULER`的对比和深入分析。在现代运维中,任务调度是保障系统稳定运行的基石。这本书没有简单地介绍API调用,而是详尽比较了两者在可靠性、资源隔离、日志记录方面的优劣,并给出了在不同业务场景下选择哪种调度器的决策树。这种从系统架构层面切入技术的论述方式,极大地提升了阅读体验。同时,书中对安全性的关注也值得称赞,关于授权机制、数据掩码(Data Masking)的实现以及如何防止SQL注入的详尽说明,显示了作者对数据安全的高度重视。对于负责核心业务逻辑和系统安全性的工程师而言,这些内容是不可或缺的“防护服”。它不仅教会你如何高效地编程,更教会你如何安全地编程。