作为图书编辑,我一般满足于在幕后做好自己的编辑工作,很少站到前台来为我负责编辑的图书作序。但是,这次我却破例了。因为我也曾做过开发,这本书的内容勾起了我的很多回忆。

本书旨在教你如何有效地使用PL/SQL。它不是描述语法的书,而是介绍如何把语法及其特性与良好的开发实践相结合,创建更具有可靠性、可扩展性的应用,并使之具备长期可维护性。

不管使用什么工具,首先需要明白的是在什么情况下使用它比较合适。在本书的开篇章节“避免误用”中,Riyaj Shamsudeen巧妙地回答了何时使用PL/SQL这一问题。我把这一章放在本书的开始,也是因为我个人的经历:那是在20世纪90年代末,我进行了最成功的一次性能优化,那次我把客户端PC上的一堆过程代码改写为一个SQL语句以后,一个作业的运行时间从超过36小时缩短到仅仅几分钟。虽然PL/SQL不是导致性能问题的罪魁祸首,但是我得到了一条经验——基于集合的方法(如果有可能)通常优于过程性代码。

Michael Rosenblum紧接着写了动态SQL那一章,其内容相当精彩。他说明了如果只有到最终运行时才知道所要运行的SQL语句到底是什么,那么该如何编写代码。这使我想起20世纪90年代初的一段经历,那时我在陶氏化学公司利用Rdb的扩展动态游标功能集,为一个医疗记录系统写数据装载应用程序。我感觉那是我开发过的最有趣的应用程序之一。

Dominic Delmolino介绍了用PL/SQL 进行并行处理的方法,以及这样能获得的益处和产生的额外负担。谨小慎微,永不为过!我在当数据库管理员时犯下的最大错误之一就是,有一次头脑一热,在一个关键的应用表上设置了一个并行度,其目的是为了想让其中的一个报表程序运行得更快。可是,事与愿违。好像键盘上的回车键连着我的电话似的,修改后大约不到一分钟,我的电话铃就响了,电话线另一端的主管对我的修改非常不满。无须多言,从此我就决定在实施并行前一定要深思熟虑。Dominic写的那章可以帮助我们避免陷入这样的窘境。

本书的多章内容涵盖了代码规范和极其实用的编程经验。Stephan Petit向我们介绍了一套实用的命名和编码规范。Torben Holm讲述了PL/SQL警告和条件编译。Lewis Cunningham阐述了代码分析,使我们认识到真正理解自己所写的代码及其工作原理的重要性,发人深思。Robyn Sands的“渐进式数据建模”一章,令我们对渐进式数据模型的良好设计及灵活性有了更多的思考。Melanie Caffrey介绍了经常使用的各种游标类型,帮助我们在不同条件下正确地选择游标。

其他章节介绍如何进行调试和故障排除。Sue Harper介绍了PL/SQL单元测试,特别是一些如今已经集成在SQL Developer中的功能集(这使我想起了在纸上写单元测试脚本的日子),它可以帮助避免犯回归错误。利用自动化单元测试,能够容易且方便地验证程序,以确保自己不会在修复一个错误的同时制造了更多的错误。

还有John Beresniewicz介绍“合同导向编程”那一章。John给出的方法的一个关键部分是,在代码的各种特定地方使用断言来验证条件。记得我首次了解断言技术是在做PowerBuilder编程时,那已经是很久很久以前的事了。我很高兴看到John把这项技术和PL/SQL联系起来,将其发扬光大。

Arup Nanda的论述能够帮助我们控制依存和失效问题。依存问题可能会导致发生类似随机的、难以重现的应用程序错误。Arup展示了如何完全掌控那些必将发生的事情,这样你才不会落入意外错误的陷阱。

一般情况下,我们不得不考虑性能和扩展性。Ron Crisco告诉我们通过剖析代码,找到尽可能优化代码的方法。Adrian Billington讨论了从SQL语句中调用PL/SQL的性能问题。Connor McDonald论述了批量SQL操作惊人的性能优势。

关于可扩展性,通常会被遗漏的一面是应用程序的规模和参与开发的人数。PL/SQL是否适合数十到数百位程序员的大规模开发?Martin Büchi在“大规模PL/SQL开发”那章,描述了他在管理由170多位开发者维护的具有1100万行代码的应用中的成功经验,说明了PL/SQL是非常适合于这种任务的。

不难看出我为这本书感到兴奋。作者都是顶级专家,分别介绍了自己热衷的并且特别在行的PL/SQL的某个方面。如果你已经学习了语法,那么坐下来读一读这本书,充分利用PL/SQL和Oracle数据库的强大功能,投身到开发应用程序的事业中来吧!

Jonathan Gennick

Apress编辑主任助理

目录

  • 译者序
  • 第1章  避免误用
  • 第2章  动态SQL:处理未知
  • 第3章  PL/SQL和并行处理 
  • 第4章  警告和条件编译 
  • 第5章  PL/SQL单元测试
  • 第6章  批量SQL操作 
  • 第7章  透识你的代码
  • 第8章  合同导向编程
  • 第9章  从SQL调用PL/SQL
  • 第10章  选择正确的游标 
  • 第11章  大规模PL/SQL编程
  • 第12章  渐进式数据建模
  • 第13章  性能剖析 
  • 第14章  编码规范和错误处理
  • 第15章  依赖关系和失效