第1章 高效能的PL/SQL 1
1.1 为何使用PL/SQL 1
1.1.1 PL/SQL贴近数据 2
1.1.2 最简单的通常是最好的 2
1.2 什么是高效能的PL/SQL 3
1.2.1 性能 4
1.2.2 影响 4
1.2.3 可论证性 5
1.3 达到高效能 10
1.3.1 绑定变量和解析的代价 10
1.3.2 使用PL/SQL的可用特性 19
1.3.3 不要使用PL/SQL来做SQL的工作 24
1.4 小结 42
第2章 全部打包 43
2.1 包的基本好处 43
2.1.1 包的重载 45
2.1.2 包中的公有变量和私有变量 46
2.1.3 初始化 46
2.1.4 信息隐藏 47
2.2 独立的过程和依赖危机 47
2.3 打破依赖链 55
2.4 使用递归 66
2.5 人们为何避而不用包 68
2.5.1 忽视分离的好处 68
2.5.2 这是个包,不是库 68
2.6 何时不能使用包 71
2.7 发布包 73
2.7.1 路径跟踪编程变得简单 74
2.7.2 其他有用的例程 77
2.7.3 检索DDL 78
2.7.4 DBMS ROWID的有趣应用 82
2.7.5 后台任务 83
2.8 小结 85
第3章 令人困惑的游标 86
3.1 显式游标与隐式游标 86
3.1.1 单行的读取 87
3.1.2 多行处理 93
3.1.3 TOP-N处理 96
3.1.4 结论 97
3.2 跨架构的游标管理 97
3.2.1 游标变量 98
3.2.2 游标表达式 100
3.3 小结 105
第4章 高效数据处理 106
4.1 控制数据类型 106
4.1.1 使用%TYPE属性 107
4.1.2 使用包集中控制数据类型 110
4.1.3 避免隐式数据类型转换 111
4.2 从字段到行——使用%ROWTYPE 113
4.3 从记录到对象 118
4.3.1 对象类型 120
4.3.2 用集合扩展runstats 121
4.4 在PL/SQL中使用集合的动机 129
4.5 用集合来批处理 132
4.5.1 批收集 133
4.5.2 批量绑定 136
4.6 在PL/SQL程序间传递变量 145
4.6.1 将%TYPE和%ROWTYPE作为参数传递 145
4.6.2 将集合作为参数传递 150
4.7 PL/SQL中的事务处理 157
4.8 自治事务 161
4.8.1 在触发器中避免变异表错误 162
4.8.2 作为事务的一部分执行DDL 162
4.8.3 审计SELECT语句 164
4.8.4 回滚后保持审计 167
4.9 小结 169
第5章 PL/SQL优化技巧 170
5.1 尽量减少解析和内存消耗 170
5.1.1 触发器内的代码 170
5.1.2 调用者权限过程 174
5.1.3 解放思想:使用管道函数 182
5.2 数据类型:提示和技巧 189
5.2.1 关联数组 189
5.2.2 集合 191
5.2.3 使用基于记录的DML时的问题 193
5.3 调用PL/SQL 200
5.3.1 使用PL/SQL来显露数据模型,而不是扩展它 200
5.3.2 动态调用PL/SQL 211
5.4 PL/SQL中的SQL 214
5.4.1 SQL函数和递归SQL 215
5.4.2 高效的动态SQL 219
5.5 小结 229
第6章 触发器 230
6.1 触发器概念 230
6.1.1 触发器类型 231
6.1.2 事件属性 231
6.1.3 触发器计时 232
6.1.4 多个相似的触发器 234
6.1.5 DML行前与行后触发器的性能 234
6.1.6 权限 235
6.1.7 触发器和数据字典 235
6.1.8 触发器依赖性 237
6.1.9 触发器状态 238
6.1.10 触发器失败 238
6.1.11 触发器的局限性 239
6.2 DML触发器 239
6.2.1 存储审计信息 239
6.2.2 实现转变约束 240
6.2.3 生成代理键 242
6.3 替代触发器 243
6.4 变异表 245
6.4.1 延时处理方案 247
6.4.2 变异表和自治事务 250
6.4.3 其他变异表错误 251
6.5 数据审计 253
6.6 表的多版本 255
6.7 Oracle流 257
6.8 作业队列(临时事件触发器) 263
6.8.1 作业调度 263
6.8.2 作业和DML触发器 264
6.8.3 作业与共享池 265
6.8.4 作业错误 266
6.9 DDL触发器 267
6.9.1 DDL完整性触发器 269
6.9.2 DDL审计跟踪 269
6.10 数据库事件触发器 271
6.11 登录触发器 271
6.11.1 服务器错误触发器 272
6.11.2 挂起事件触发器 273
6.11.3 错误和数据库事件触发器 274
6.12 别“重造轮子” 274
6.13 小结 276
第7章 DBA包 277
7.1 警告文件包 277
7.1.1 包结构 278
7.1.2 警告文件的结构 279
7.1.3 警告文件作为外部表 280
7.1.4 处理警告文件 283
7.1.5 异常 286
7.1.6 通知的生命周期 288
7.1.7 更替警告文件 290
7.1.8 调度和并发 292
7.1.9 使用警告文件的警告 294
7.1.10 回顾警告文件的内容 297
7.1.11 小结 297
7.2 通知包 297
7.2.1 SEND_EMAIL过程 298
7.2.2 在数据库中保存警告消息 300
7.2.3 小结 301
7.3 主动监控包 301
7.3.1 备份 302
7.3.2 归档日志目录下的空闲空间 304
7.3.3 监控数据库中的空闲空间 305
7.3.4 小结 306
7.4 历史数据包 306
7.4.1 数据库大小 307
7.4.2 数据库会话 309
7.4.3 资源限制 310
7.4.4 小结 312
7.5 小结 312
第8章 安全包 313
8.1 设计问题 313
8.1.1 回顾定义者和调用者权限 313
8.1.2 包的构建 325
8.1.3 模式,到处都是模式 329
8.1.4 代码发布 331
8.2 触发器与安全因素 331
8.2.1 安全检查 331
8.2.2 登录触发器:第一道防线 337
8.3 保护源代码 341
8.3.1 查看过程和函数的源代码 341
8.3.2 包的源代码 343
8.3.3 PL/SQL封装工具 343
8.4 小结 348
第9章 Web包 349
9.1 PL/SQL Web工具包基础 349
9.1.1 架构 349
9.1.2 包的汇总 351
9.1.3 从SQL*Plus测试工具包 351
9.2 HTP和HTF包 352
9.3 使用环境变量 354
9.4 cookie 358
9.5 管理文件 359
9.6 通过Web管理表 364
9.7 来自数据库的HTTP 373
9.7.1 提取HTML 373
9.7.2 使用UTL_HTTP的Web服务客户端 375
9.8 小结 379
第10章 PL/SQL调试 381
10.1 防卫型的编码 381
10.1.1 异常 381
10.1.2 装备你的代码 385
10.1.3 写文档 386
10.2 工具 386
10.2.1 DBMS_OUTPUT 386
10.2.2 SQLCODE和SQLERRM 390
10.2.3 DBMS_UTILITY.FORMAT_CALL_STACK 391
10.2.4 DBMS_APPLICATION_INFO 392
10.2.5 自治事务 398
10.2.6 UTL_FILE 401
10.2.7 用管道函数实时调试 403
10.3 自定义BEBUG工具 407
10.3.1 需求 407
10.3.2 数据库设计和安装 408
10.3.3 包的布局 408
10.3.4 实现 409
10.3.5 基本操作 409
10.3.6 使用STATUS 410
10.3.7 有选择的调试 413
10.3.8 调试成品代码 416
10.3.9 DEBUG的用处 418
10.4 小结 419
附录A 构建DEBUG 420