前 言 本手册旨在作为Michael McLaughlin撰著的《Oracle Database 11g PL/SQL程序设计》(清华大学出版社引进并出版)一书的补充。我们决非以此书代替《Oracle Database 11g PL/SQL程序设计》,但是对于已经非常熟悉PL/SQL的读者,则可以使用本书作为快速参考。对于与《Oracle Database 11g PL/SQL程序设计》有关的问题,我们专门建立了公告板,网址如下: 我们希望找到有相同兴趣的人帮助管理该公告板。如果您有兴趣,请使用Mike技术博客上的联系表单联系我们。 只要本书篇幅允许,我们特意地尽可能多包含一些真实示例。此外,每章中还包含大量的最佳实践和练习,用于帮助学习PL/SQL。最后,我们使本书的主题尽可能轻松并且易于理解,希望您在阅读本书时享受到与我们创作本书时相同的乐趣。 在接下来的各小节中分别介绍本书概述、建议阅读清单、如何学习、词汇、本书约定,以及本书的ERD模型。 本书概述 本书每一章都包含“最佳实践”,并且在每一章最后的小结部分对本章内容进行了总结。在每章小结之前还提供了可下载代码清单。每章小结的最后一项“测验”包含了一系列关于本章内容的判断题和选择题。在附录E中可以找到这些问题、可能的答案、解决方案以及相关解释。 第Ⅰ部分:PL/SQL基础 ●第1章介绍了Oracle开发架构以及连接机制。 ●第2章提供了关于数据类型、结构、程序块、游标和语言语法的快速课程。 ●第3章介绍如何管理Oracle数据库中的事务。 ●第4章介绍如何理解并管理Oracle数据库中的错误。 第Ⅱ部分:PL/SQL编程 ●第5章介绍如何定义和使用PL/SQL函数。 ●第6章介绍如何定义和使用PL/SQL过程。 ●第7章介绍如何在SQL和PL/SQL环境中定义和使用SQL与PL/SQL集合。 ●第8章介绍如何定义和使用PL/SQL包。 ●第9章介绍如何定义和使用PL/SQL触发器。 ●第10章介绍如何在PL/SQL中定义和使用对象,以及如何将其部署为数据库表中的列。 第Ⅲ部分:PL/SQL高级编程 ●第11章介绍如何在真实应用程序上下文中使用动态SQL语句。 ●第12章介绍如何使用外部表支持OLTP和数据仓库应用程序。 第Ⅳ部分:附录 ●附录A介绍如何包装PL/SQL存储程序以防止其业务逻辑被偷窥。 ●附录B介绍Oracle Database 11g分层性能分析器的工作原理,并演示其使用方法。 ●附录C介绍PL/Scope的工作原理并提供了快速概念分析。 ●附录D介绍Oracle提供的包和类型,用于支持以数据库为中心的应用程序开发。 ●附录E重新列出了每一章小结部分中的测验题,并提供相应的答案和解释。 建议阅读清单 本书的两位作者都在数据库行业有着多年的从业经验。对于自己的日常任务,他们采用了一致的、持续的学习方法,并且希望将其介绍给读者,因为这对于一名成功的数据库专家非常重要。此外,虽然下面的阅读清单非常冗长;但是,即使仅仅简要了解其中的主题和概念,也足以帮助读者做出比90%的所谓专家更佳的数据库决策。 ●Michael McLaughlin,《Oracle Database 11g PL/SQL程序设计》(清华大学出版社引进并出版) ●Thomas Kyte, Effective Oracle by Design, McGraw-Hill/Professional ●David Knox, Effective Oracle Database 10g Security by Design, McGraw-Hill/Professional ●Robert Freeman and Arup Nanda, Oracle Database 11g New Features, McGraw- Hill/Professional ●Robert Freeman and Matthew Hart, Oracle Database 11g RMAN Database, McGraw- Hill/Professional ●Thomas Kyte, Expert Oracle Database Architecture: 9i and 10g Programming Techniques and Solutions, Apress ●Jonathan Lewis, Cost-Based Oracle Fundamentals, Apress ●Richard Strohm, Oracle Database Concepts 11g, Oracle Corporation ●Diana Lorentz, Oracle Database SQL Language Reference 11g, Oracle Corporation ●Sheila Moore, Oracle Database PL/SQL Language Reference 11g, Oracle Corporation ●Dennis Raphaely, Oracle Database PL/SQL Packages and Types Reference, Oracle Corporation ●Shelia Moore, Oracle Database Advanced Application Developer’s Guide 11g, Oracle Corporation 如何学习 有一个生命的奇迹持续不断地让我们感到惊奇,那就是孩子发现、适应并了解其周围世界的能力。他们每天晚上花费平均10~12小时睡觉并不让我们感到惊奇。此外,他们的两个最重要的特征是好奇心和以开放心态看待生活的能力。关于如何学习这个主题,爱因斯坦曾经说过:“最重要的是不停地提出问题。好奇心有它自己存在的理由”。 理解关于PL/SQL的不同编程方法对于读者而言可能会觉得困难,尤其作为您学习的第一门计算机语言时;但是,如果您真正相信自己并且保持自己的方向和好奇心,那么就没有学不会的内容。 词汇 PL/SQL开发人员都习惯于类型化对象和变量,因为这是老师传授的实际经验或通过可信任出版物学习到的经验;但是他们没有用心理解其产生原因。 大多数PL/SQL类型化都类似于Charles Simonyi(在2002年之前任微软公司的首席架构师)所引入的Hungarian记号。他将这种记号设计为语言无关的;但是其根源可以追溯到BCPL语言,这是一种弱类型语言。弱类型语言不对数据类型进行严格的限制,允许变量和数据结构之间的松散、隐式转换。出于这个原因,Simonyi使用代表其数据类型的符号作为对象的前缀--voila,这是类型的起源。 行业的精英们对于对象类型化毁誉参半。例如,Linux操作系统的创始人Linus Torvalds认为将函数数据类型编码到名称中是“大脑损坏,因为编译器已经知道其类型”。反过来,Code Complete一书的作者Steve McConnell认为“简练、精确缩写标准化(命名约定)的基本思想仍然具有其价值”。 不管读者是否选择类型化对象,都必须制订或采用编码约定,并坚持执行。下面是我们从事多年PL/SQL及数据库开发工作中得出的3个最重要的经验教训: ●不管代码多么简单或粗糙,一旦纳入到生产系统中就不能认为其是临时性的。 ●有些时候您需要维护自己编写的代码,有些时候则需要继承大量其他人编写的代码。 ●使用清晰、标准的命名约定可以节省时间并减少错误。 由于这些原因,建议尽早采用词汇和语义最佳实践。例如,可以使用代表其数据类型的字符作为用户定义对象的前缀或后缀,如下所示: CREATE TYPE tt_member_id AS TABLE OF number INDEX BY binary_integer; 这种类型化定义并不是为了帮助编译器理解数据类型;相反,其目的是帮助其他开发人员了解所创建对象的特征。下面是一个示例: DECLARE gd_creation_date DATE; lv_first_name VARCHAR2(50); lv_last_name VARCHAR2(50); … 观察其中使用两个符号作为每个变量的前缀,分别代表其全局或局部特征和数据类型。Oracle维基的贡献者建议类型化应该局限于前缀。此外,前缀必须由标识变量类型的字母(如表0-1中所示)组成。 表0-1 变量作用域前缀 作 用 域前 缀示 例说 明 全局私有变量ggd_hire_dated - date 局部变量llv_first_namev - varchar 参数i、o、iopi_employee_idi - in、o - out、 io - in out 不仅如此,他们还建议变量数据类型必须遵循表0-2中所指定的前缀符号。 表0-2 变量数据类型前缀 数 据 类 型前 缀示 例说 明 booleanblb_employee_status公共变量前缀 datedld_hire_date numberngn_bonus_percentage varchar2vgv_department cursorcur、cc_item游标和记录前缀 recordrec、rr_employee typetyp、ttyp_monthly_sale associative arrayaaaa_sales_rank词汇变化 varrayvava_top_sales_item词汇变化 nested tablentnt_customer_address词汇变化 exceptionex, eex_bonus_too_high table typetttt_customer词汇变化 但是这些仅仅是建议,您可以随意制订适合自己环境的标准;但是在本书中,我们采用这些标准,使得所有代码块具有一致的外观。 大写和小写 PL/SQL是一门不区分大小写的语言,除非将Oracle设置为区分大小写或使用双引号("")显式定义对象名称。在实际经验中,我们曾经看到使用camelBack、all_lower_case、crammedupvariablenames和Mixed_Variations等变量名称。为了清晰起见,本书中采用Oracle维基中所概述的标准--主要包括如下。 ●所有关键字和Oracle提供的对象都使用全部大写。 ●用户定义的变量和对象使用全部小写。 ●不使用类似camelBackScrunchedUpVariablesThatAreDifficultToRead这样复杂的名称。 ●所有单词都使用下划线(_)符号分隔。 本书中将垂直对齐所有长度超过一行的代码块,如下所示: SQL> SELECT contact_id, 2 member_id, 3 first_name, 4 last_name, 5 last_updated_by, 6 last_update_date 7 FROM video_store.contact 8 WHERE member_id = 1001 9 AND contact_type = 1003 10 / 注意其中使用右对齐方式,并且全部大写所有关键字。在列的左边使用逗号,并且所有列和用户定义对象都使用全部小写。在大多数示例中使用SQL-89标准,但是欢迎并且鼓励使用SQL-92标准。两位作者都认识到了这些标准的优点。 SQL行号 本书中的所有示例代码都使用行号,如SQL*Plus终端中默认列出代码那样。我们这样做是为了帮助您注意到特定代码行。不仅如此,本书还会分段列出较长的PL/SQL代码块并添加注释,帮助更好地理解示例。在有些示例中还使用粗体突出显示。 示例模式 在本书中共引用了两个示例模式。主模式代表一个可能的视频商店,其概念模型如图0-1中所示。 图0-1 视频商店模式 本书使用的第二个模式集由Oracle提供的HR和OE模式组成,分别代表某虚设的计算机销售公司的人力资源部门和销售部门。其实体关系图如图0-2所示。 图0-2 HR和OE模式