Oracle PL/SQL实战

Oracle PL/SQL实战
作 者: 比林顿 卢涛
出版社: 人民邮电出版社
丛编项:
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: Oracle
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  John Beresniewicz(约翰?贝雷斯尼维奇)是位于加州红木城红木岸(RedwoodShores)的Oracle总部技术团队的一名咨询顾问。他于2002年加入Oracle,负责企业管理器的数据库性能领域,他对诊断和调优包、实时应用测试、支持工作台和Exadata的设计作出了重要贡献。多年以来,他经常在Oracle全球大会和其他会议上发言,发言主题包括数据库性能和PL/SQL编程。他与StevenFellerstein合著了Oracle Built-inPackages(O’Reilly&Associates,1998年)一书,并且是OakTable网络的创始人之一。Adrian Billington(阿德里安?比林顿)是应用设计、开发和性能调优方面的顾问。自1999年以来,一直从事Oracle数据库方面的工作。他是www.oracle-developer.net网站的发起人,这个网站为Oracle开发人员提供各种SQL和PL/SQL功能、实用工具和技术。阿德里安还是OracleACE,同时也是OakTable网络的成员。现在,他与妻子安吉和三个孩子:格鲁吉亚、奥利弗和伊莎贝拉一起居住在英国。Martin Büchi(马丁?步琪)自2004年以来,任Avaloq公司首席软件架构师。该公司是一个标准化的银行软件供应商,其产品基于OracleRDBMS构建,包含1100万行PL/SQL代码。他与两位同事一起设计了系统架构,并评审了170名全职PL/SQL开发人员的设计和代码,以追求软件的简明、效率和健壮性。马丁经常在Oracle大会上发言。2009年,他被OracleMagazine评选为PL/SQL年度开发人员。从事Oracle数据库工作之前,马丁曾在面向对象的系统、形式化方法和近似记录匹配等领域工作。他拥有瑞士联邦技术研究所的硕士学位和芬兰土尔库计算机科学中心的博士学位。业余时间,马丁喜欢与他的家人一起进行各种户外运动。Melanie Caffrey(梅拉妮?卡弗里)是Oracle公司高级开发经理,为不同客户的业务需求提供前端和后端的Oracle解决方案。她是多部技术出版物的合著者,包括OracleWeb Application Programming for PL/SQL Developers、Oracle DBAInteractive Workbook、Oracle Database Ad...

内容简介

《Oracle PL/SQL实战》由15位知名技术专家联手打造,每位作者分别用一章的篇幅介绍他们最擅长的PL/SQL相关主题,涵盖了PL/SQL开发的方方面面。本书作者要么是Oracle社区中坚分子,要么是大名鼎鼎的OakTable成员,而且经常活跃在Oracle技术培训第一线,对PL/SQL均有着深入透彻的理解,对解释复杂问题有着简单独到的方法。一册在手,众多PL/SQL牛人的真知灼见尽收眼底,你还等什么? 本书着重介绍了PL/SQL最新、最实用的特性,从什么该做和什么不该做、怎么做对,以及怎么做更有效率、效果更好等三个部分全面阐释了PL/SQL相关的各个主题。而且,每一章都配有非常贴切的示例代码、跟踪图以及输出结果,辅以深入浅出的讲解,令人在恍然大悟之后不禁拍案叫绝。各章内容均涵盖了PL/SQL实际开发中的最佳实践,反映了作者多年积累的经验和教训,其价值非同一般。 本书适合具有一定PL/SQL经验的读者学习参考。 《Oracle PL/SQL实战》主要内容如下: 掌握使用以及避免使用PL/SQL的最佳时机; 使用批量SQL操作高效地加载数据; 使用管道指令、并行操作和代码剖析,提高代码的扩展性; 为应用选择正确的PL/SQL游标类型; 借助单元测试等有效的开发实践,减少编码错误; 在运行时动态创建和执行SQL以及PL/SQL。

图书目录

第1章  避免误用  1

1.1  逐行处理  1

1.2  嵌套的逐行处理  3

1.3  查找式查询  5

1.4  对DUAL的过度访问  8

1.4.1  日期的算术运算  8

1.4.2  访问序列  9

1.4.3  填充主—从行  9

1.5  过多的函数调用  10

1.5.1  不必要的函数调用  10

1.5.2  代价高昂的函数调用  12

1.6  数据库链接调用  14

1.7  过度使用触发器  15

1.8  过度提交  15

1.9  过度解析  16

1.10  小结  16

第2章  动态SQL:处理未知  18

2.1  动态SQL的三种方式  19

2.1.1  本地动态SQL  19

2.1.2  动态游标  21

2.1.3  DBMS_SQL  25

2.2  动态思考的样例  26

2.3  安全问题  30

2.4  性能和资源利用率  33

2.4.1  反模式  34

2.4.2  比较动态SQL的实现  35

2.5  对象的依赖关系  37

2.5.1  负面影响  37

2.5.2  正面影响  37

2.6  小结  38

第3章  PL/SQL和并行处理  39

3.1  为什么需要并行处理  39

3.2  影响并行处理的定律  40

3.3  大数据的崛起  40

3.4  并行与分布式处理  41

3.5  并行硬件体系结构  41

3.6  确定目标  42

3.6.1  加速  42

3.6.2  按比例扩展  43

3.6.3  并行度  43

3.7  用于并行处理的候选工作负载  43

3.7.1  并行和OLTP  43

3.7.2  并行和非OLTP工作负载  44

3.8  MapReduce编程模型  44

3.9  在使用PL/SQL之前  45

3.10  可用于并行活动的进程  45

3.11  使用MapReduce的并行执行服务器  46

3.11.1  管道表函数  46

3.11.2  指导  60

3.11.3  并行管道表函数小结  61

3.12  小结  61

第4章  警告和条件编译  62

4.1  PL/SQL 警告  62

4.1.1  基础  62

4.1.2  使用警告  63

4.1.3  升级警告为错误  67

4.1.4  忽略警告  68

4.1.5  编译和警告  69

4.1.6  关于警告的结束语  72

4.2  条件编译  72

4.2.1  基础  72

4.2.2  正在运行代码的哪部分  75

4.2.3  预处理代码的好处  76

4.2.4  有效性验证  78

4.2.5  控制编译  80

4.2.6  查询变量  81

4.2.7  关于条件编译的结束语  82

4.3  小结  84

第5章  PL/SQL单元测试  85

5.1  为什么要测试代码  85

5.2  什么是单元测试  86

5.2.1  调试还是测试  86

5.2.2  建立测试的时机  86

5.3  单元测试构建工具  87

5.3.1  utPLSQL:使用命令行代码  87

5.3.2  Quest Code Tester for Oracle  87

5.3.3  Oracle SQL Developer  88

5.4  准备和维护单元测试环境  88

5.4.1  创建单元测试资料档案库  89

5.4.2  维护单元测试资料档案库  90

5.4.3  导入测试  91

5.5  构建单元测试  91

5.5.1  使用单元测试向导  91

5.5.2  创建第一个测试实施  92

5.5.3  添加启动和拆除进程  93

5.5.4  收集代码覆盖率统计信息  93

5.5.5  指定参数  93

5.5.6  添加进程验证  94

5.5.7  保存测试  95

5.5.8  调试和运行测试  95

5.6  扩大测试的范围  95

5.6.1  创建查找值  96

5.6.2  植入测试实施  97

5.6.3  创建动态查询  98

5.7  支持单元测试功能  99

5.7.1  运行报告  99

5.7.2  创建组件库  100

5.7.3  导出、导入和同步测试  103

5.7.4  构建套件  105

5.8  从命令行运行测试  105

5.9  小结  106

第6章  批量SQL操作  107

6.1  五金商店  107

6.2  设置本章的例子  108

6.3  在PL/SQL中执行批量操作  108

6.3.1  批量获取入门  110

6.3.2  三种集合风格的数据类型  112

6.3.3  为什么要自找麻烦  114

6.3.4  监控批量收集的开销  116

6.3.5  重构代码以使用批量收集  119

6.4  批量绑定  127

6.4.1  批量绑定入门  127

6.4.2  度量批量绑定性能  128

6.4.3  监视内存的使用  131

6.4.4  11g中的改进  133

6.5  批量绑定的错误处理  134

6.5.1  SAVE EXCEPTIONS和分批操作  137

6.5.2  LOG ERRORS子句  138

6.5.3  健壮的批量绑定  139

6.6  大规模集合的正当理由  143

6.7  真正的好处:客户端批量处理  145

6.8  小结  149

第7章  透识你的代码  151

7.1  本章内容取舍  152

7.2  自动代码分析  153

7.2.1  静态分析  154

7.2.2  动态分析  154

7.3  执行分析的时机  154

7.4  执行静态分析  156

7.4.1  数据字典  156

7.4.2  PL/Scope  163

7.5  执行动态分析  175

7.5.1  DBMS_PROFILER和DBMS_TRACE  175

7.5.2  DBMS_HPROF  184

7.6  小结  189

第8章  合同导向编程  190

8.1  契约式设计  190

8.1.1  软件合同  190

8.1.2  基本合同要素  191

8.1.3  断言  192

8.1.4  参考文献  192

8.2  实现PL/SQL合同  192

8.2.1  基本的ASSERT程序  192

8.2.2  标准的包本地断言  194

8.2.3  使用ASSERT执行合同  196

8.2.4  其他改进  198

8.2.5  合同导向函数原型  199

8.3  示例:测试奇数和偶数  200

8.4  有用的合同模式  202

8.4.1  用NOT NULL输入且输出NOT NULL  202

8.4.2  函数返回NOT NULL  203

8.4.3  布尔型函数返回NOT NULL  203

8.4.4  检查函数:返回TRUE或ASSERTFAIL  204

8.5  无错代码的原则  205

8.5.1  严格地断言先决条件  205

8.5.2  一丝不苟地模块化  206

8.5.3  采用基于函数的接口  206

8.5.4  在ASSERTFAIL处崩溃  207

8.5.5  对后置条件进行回归测试  207

8.5.6  避免在正确性和性能之间取舍  207

8.5.7  采用Oracle 11g优化编译  208

8.6  小结  209

第9章  从SQL调用PL/SQL  210

9.1  在SQL中使用PL/SQL函数的开销  210

9.1.1  上下文切换  211

9.1.2  执行  216

9.1.3  欠理想的数据访问  218

9.1.4  优化器的难点  222

9.1.5  读一致性陷阱  226

9.1.6  其他问题  228

9.2  降低PL/SQL函数的开销  228

9.2.1  大局观  229

9.2.2  使用SQL的替代品  230

9.2.3  减少执行  236

9.2.4  协助CBO  244

9.2.5  调优PL/SQL  255

9.3  小结  257

第10章  选择正确的游标  258

10.1  显式游标  258

10.1.1  解剖显式游标  260

10.1.2  显式游标和批量处理  261

10.1.3  REF游标简介  262

10.2  隐式游标  263

10.2.1  解剖隐式游标  264

10.2.2  隐式游标和额外获取的理论  265

10.3  静态REF游标  267

10.3.1  详细的游标变量限制清单  269

10.3.2  客户端和REF游标  270

10.3.3  有关解析的话题  271

10.4  动态REF游标  273

10.4.1  例子和最佳用法  273

10.4.2  SQL注入的威胁  275

10.4.3  描述REF游标中的列  276

10.5  小结  277

第11章  大规模PL/SQL编程  279

11.1  将数据库作为基于PL/SQL的应用服务器  279

11.1.1  案例研究:Avaloq银行系统  279

11.1.2  在数据库中使用PL/SQL实现业务逻辑的优势  281

11.1.3  用数据库作为基于PL/SQL的应用程序服务器的限制  283

11.1.4  软因素  284

11.2  大规模编程的要求  284

11.3  通过规范实现一致性  285

11.3.1  缩写词  286

11.3.2  PL/SQL标识符的前缀和后缀  289

11.4  代码和数据的模块化  291

11.4.1  包和相关的表作为模块  293

11.4.2  含有多个包或子模块的模块  297

11.4.3  模式作为模块  299

11.4.4  在模式内部模块化  303

11.4.5  用模式模块化与在模式内模块化的比较  306

11.5  使用PL/SQL面向对象编程  306

11.5.1  使用用户定义类型的面向对象编程  307

11.5.2  使用PL/SQL记录面向对象编程  310

11.5.3  评估  316

11.6  内存管理  317

11.6.1  测量内存使用  317

11.6.2  集合  322

11.7  小结  325

第12章  渐进式数据建模  326

12.1  从二十年的系统开发中总结的经验  327

12.2  数据库和敏捷开发  328

12.3  渐进式数据建模  329

12.4  重构数据库  331

12.5  通过PL/SQL创建访问层  335

12.6  敏捷宣言  347

12.7  用PL/SQL进行渐进式数据建模  349

12.7.1  定义接口  349

12.7.2  思考可扩展性  349

12.7.3  测试驱动开发  350

12.7.4  明智地使用模式和用户  350

12.8  小结  351

第13章  性能剖析  352

13.1  何谓性能  353

13.1.1  功能需求  353

13.1.2  响应时间  353

13.1.3  吞吐量  354

13.1.4  资源利用率  354

13.1.5  性能是功能的一种  355

13.2  什么是剖析  356

13.2.1  顺序图  356

13.2.2  概要文件之神奇  357

13.2.3  性能剖析的好处  357

13.3  性能测量  358

13.3.1  这个程序为什么慢  358

13.3.2  测量嵌入  360

13.3.3  识别  360

13.3.4  条件编译  364

13.3.5  内建的剖析器  365

13.3.6  扩展的SQL跟踪数据(事件10046)  365

13.3.7  针对Oracle的测量工具库(ILO)  366

13.4  问题诊断  368

13.4.1  R方法  369

13.4.2  ILO示例  371

13.4.3  剖析示例  373

13.5  小结  376

第14章  编码规范和错误处理  378

14.1  为什么要制订编码规范  378

14.2  格式化  379

14.2.1  大小写  379

14.2.2  注释  380

14.2.3  比较  380

14.2.4  缩进  380

14.3  动态代码  383

14.4  包  384

14.5  存储过程  385

14.5.1  命名  385

14.5.2  参数  386

14.5.3  调用  386

14.5.4  局部变量  386

14.5.5  常量  386

14.5.6  类型  387

14.5.7  全局变量  387

14.5.8  本地存储过程和函数  387

14.5.9  存储过程元数据  388

14.6  函数  388

14.7  错误处理  389

14.7.1  错误捕获  389

14.7.2  错误报告  390

14.7.3  错误恢复  391

14.7.4  先测试再显示  392

14.8  小结  392

第15章  依赖关系和失效  395

15.1  依赖链  395

15.2  缩短依赖链  401

15.3  数据类型引用  406

15.4  用于表修改的视图  407

15.5  把组件添加到包  410

15.6  依赖链中的同义词  413

15.7  资源锁定  414

15.8  用触发器强制执行依赖  415

15.9  创建最初禁用的触发器  418

15.10  小结  420