Oracle PL/SQL程序设计(第6版)(上下册)pdf下载

Oracle PL/SQL程序设计(第6版)(上下册)百度网盘pdf下载

作者:
简介:Oracle PL/SQL程序设计(第6版)(上下册)
出版社:人民邮电出版社
出版时间:2017-07-01
pdf下载价格:0.00¥

免费下载


书籍下载


内容介绍

内容简介
  《Oracle PL/SQL程序设计(第6版)》基于Oracle数据库12C,从用PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、构造PL/SQL应用程序、高级PL/SQL主题这6个方面详细而系统地讨论了PL/SQL以及如何有效地使用它。本书能够帮助你充分利用PL/SQL来解决数据库开发中遇到的各种问题,引导你掌握各种构建应用的技巧和技术,以便使你编写出高效、可维护的代码。本书不但介绍了大量Oracle数据库12C的PL/SQL新性能,还提供了许多优化PL/SQL性能的新方法。
  《Oracle PL/SQL程序设计(第6版)》结构清晰,示例丰富,实践性强,适用于Oracle数据库开发人员、Oracle数据库管理员等相关数据库从业人员,也可以作为各大、中专院校相关专业师生的参考用书和相关培训机构的培训教材。
作者简介
  Steven Feuerstein被尊为Oracle PL/SQL语言的世界ji专家领袖。他是本书上一版、Oracle PL/SQL Best Practices、Oracle PL/SQL Programming: Guide to Oracle8i Features、Oracle PL/SQL Developer’s Workbook、Oracle Built-in Package、Advanced Oracle PL/SQL Programming with Packages以及多本口袋参考书(均由O’Reilly Media出版)的作者或合著者。Steven还是Quest Software的zi深技术顾问,从1980年就开始从事软件的开发工作,并于1987~1992年在Oracle公司工作。
  Bill Pribyl是Learning Oracle PL/SQL的主要作者、本书上一版以及配套口袋参考书(均由O’Reilly Media出版)的合著者。目前他在一家国际贸易公司内担任一个编程小组的负责人。Bill曾经使用PL/SQL编写TCP/IP网络客户端、tnsping呼出工具、近于实时的商品价格加载器以及**函数等。Bill拥有Rice大学的物理学学位。在业余时间里,Bill的大部分精力都用来照顾罹患炎性乳腺癌的妻子。
目录
版权信息
O'Reilly Media,Inc.介绍
业界评论
前言
本书的目标
本书约定
第1部分 用PL/SQL编程
第1章 PL/SQL介绍
1.1 什么是PL/SQL
1.2 PL/SQL的起源
1.3 这就是PL/SQL
1.4 关于PL/SQL版本
1.5 可供PL/SQL开发者使用的资源
1.6 一些建议
第2章 创建和运行PL/SQL代码
2.1 在数据库中导航
2.2 创建和编辑源代码
2.3 SQL*Plus
2.4 执行基本的PL/SQL任务
2.5 编辑PL/SQL的环境
2.6 从其他语言中调用PL/SQL
第3章 语言基础
3.1 PL/SQL块结构
3.2 PL/SQL字符集
3.3 标识符
3.4 直接量
3.5 分号分隔符
3.6 注释
3.7 PRAGMA关键字
3.8 标签
第2部分 PL/SQL程序结构
第4章 条件与顺序控制
4.1 IF语句
4.2 CASE语句和表达式
4.3 GOTO语句
4.4 NULL语句
第5章 循环迭代处理
5.1 循环的基础知识
5.2 简单循环
5.3 WHILE循环
5.4 数值型FOR循环
5.5 游标FOR循环
5.6 循环标签
5.7 CONTINUE语句
5.8 迭代处理技巧
第6章 异常处理
6.1 异常处理概念和术语
6.2 定义异常
6.3 引发异常
6.4 处理异常
6.5 构建有效的错误管理架构
6.6 充分利用PL/SQL错误管理
第3部分 PL/SQL程序数据
第7章 使用程序数据
7.1 程序数据的命名
7.2 PL/SQL数据类型概述
7.3 程序数据的声明
7.4 程序员定义的子类型
7.5 数据类型转换
第8章 字符串
8.1 字符串类型
8.2 使用字符串
8.3 字符串函数快速参考
第9章 数字
9.1 数值型数字类型
9.2 数字转换
9.3 数字运算符
9.4 数字函数
第10章 日期和时间戳
10.1 Datetime数据类型
10.2 获取当前日期和时间
10.3 INTERVAL数据类型
10.4 日期时间转换
10.5 日期和时间戳直接量
10.6 时间间隔的转换
10.7 时间间隔直接量
10.8 CAST和EXTRACT
10.9 日期时间的算法
10.10 日期/时间函数的快速参考
第11章 记录类型
11.1 PL/SQL中的记录
第12章 集合
12.1 集合概述
12.2 集合方法(内置)
12.3 使用集合
12.4 嵌套表的多重集合操作
12.5 schema级别集合的维护
第13章 其他数据类型
13.1 BOOLEAN类型
13.2 RAW数据类型
13.3 UROWID和ROWID数据类型
13.4 LOB数据类型
13.5 使用LOB
13.6 预定义的对象类型
第4部分 PL/SQL中的SQL
第14章 DML和事务管理
14.1 PL/SQL中的DML
14.2 事务管理
14.3 自治事务
第15章 数据提取
15.1 游标基础
15.2 使用隐式游标
15.3 使用显式游标
15.4 SELECT…FOR UPDATE
15.5 游标变量和REF CURSOR
15.6 游标表达式
第16章 动态SQL和动态PL/SQL
16.1 NDS语句
16.2 绑定变量
16.3 使用对象和集合
16.4 动态PL/SQL
16.5 NDS建议
16.6 何时使用DBMS_SQL
第5部分 构造PL/SQL应用程序
第17章 过程、函数和参数
17.1 代码模块化
17.2 过程
17.3 函数
17.4 参数
17.5 局部或者嵌套模块
17.6 模块的重载
17.7 前置声明
17.8 高级主题
17.9 将模块化进行到底
第18章 程序包
18.1 为什么使用程序包
18.2 构建程序包的规则
18.3 包元素的调用规则
18.4 使用包数据
18.5 何时使用包
18.6 包和对象类型
第19章 触发器
19.1 DML触发器
19.2 DDL触发器
19.3 数据库事件触发器
19.4 INSTEAD OF触发器
19.5 AFTER SUSPEND触发器
19.6 维护触发器
第20章 管理PL/SQL代码
20.1 管理数据库内的代码
20.2 管理依赖关系及重编译代码
20.3 编译时刻警告
20.4 测试PL/SQL程序
20.5 跟踪PL/SQL的执行
20.6 PL/SQL程序的调试
20.7 使用白名单来控制对程序单元的访问
20.8 存储代码的保护
20.9 基于版本的重定义(Oracle数据库11g R2版本)
第21章 PL/SQL的性能优化
21.1 辅助优化的工具
21.2 优化编译器
21.3 数据缓存技术
21.4 重复的SQL的语句批处理
21.5 利用管道化的表函数提升性能
21.6 专用的优化技术
21.7 性能回顾
第22章 I/O操作和PL/SQL
22.1 显示信息
22.2 文件的读写
22.3 发送邮件
22.4 使用基于Web的数据(HTTP)
22.5 PL/SQL中可用的其他I/O类型
第6部分 高级PL/SQL主题
第23章 应用系统安全与PL/SQL
23.1 安全概述
23.2 加密
23.3 行级安全
23.4 应用程序上下文
23.5 细粒度审计
第24章 PL/SQL架构
24.1 DIANA
24.2 Oracle如何执行PL/SQL代码
24.3 PL/SQL的缺省包
24.4 执行权限模型
24.5 条件编译
24.6 PL/SQL和数据库实例内存
24.7 原生式编译
24.8 一些须知
第25章 PL/SQL的全球化和本地化
25.1 概述和术语
25.2 Unicode入门
25.3 字符语义
25.4 字符串排序顺序
25.5 多语言信息检索
25.6 日期/时间
25.7 货币转换
25.8 PL/SQL的全球化开发工具箱
第26章 PL/SQL的面向对象特性
26.1 Oracle对象特性的介绍
26.2 对象类型示例
26.3 对象视图
26.4 维护对象类型和对象视图
26.5 来自一个关系开发者的总结思考(C551,E1200)
第27章 从PL/SQL中调用Java
27.1 Oracle和Java
27.2 准备好在Oracle中使用Java
27.3 一个简单的演示
27.4 使用loadjava
27.5 使用dropjava
27.6 管理数据库中的Java
27.7 使用DBMS_JAVA
27.8 在PL/SQL中发布与使用Java
第28章 外部过程
28.1 外部过程介绍
28.2 Oracle网络配置
28.3 设置多线程模式
28.4 创建一个Oracle库
28.5 编写调用规范
28.6 从调用的C程序中引发一个异常
28.7 非默认的代理
28.8 维护外部过程
附录A 正则表达式元字符和函数参数
附录B 数字格式模型
附录C 日期格式模型
前言
  前言
  在世界各地,有数百万应用程序开发人员和数据库管理员使用Oracle公司提供的软件创建复杂的系统,以及管理庞大的数据。众多Oracle软件的中心是PL/SQL——一种编程语言,它为Oracle版本的SQL(结构化查询语言)提供过程性功能扩展,并成为Oracle开发工具箱中的编程语言(最有名的开发工具是Forms Developer和Reports Developer)。
  在Oracle公司发布的几乎每一个新产品中,PL/SQL都是其中突出的一个支持技术。软件专业人员使用PL/SQL来完成各种编程功能,包括:
  ·在Oracle Server中,利用基于PL/SQL的存储过程和数据库触发器实施关键业务规则;
  ·完全在数据库中生成和管理XML文档链接;
  ·将网页链接到Oracle数据库;
  ·执行数据库管理任务并实现数据库管理任务的自动化——从建立行级安全到在PL/SQL程序中管理回滚段。
  PL/SQL是Ada的仿写。Ada是一种高级语言,一种为美国国防部设计的程序语言,它强调数据抽象、信息隐藏以及现代设计策略等关键要素。Oracle明智的设计决策,使得PL/SQL成为一种功能强大的语言,结合了许多程序语言中最先进的元素,包括下面这点。
  ·全方位的数据类型。从数字到字符串,包括复杂的数据结构如记录(类似于关系表中的行)、集合(这是Oracle版本的数组)和XMLType(在Oracle中通过PL/SQL管理XML文档)。
  ·一种明确的和高度可读的块结构,使得它易于提高和维护PL/SQL的程序。
  ·有条件、迭代和顺序控制语句,包括CASE语句和3种不同类型的循环。
  ·在基于事件的错误处理中使用异常处理程序。
  ·命名的、可重用的代码元素,如函数、程序、触发器、对象类型(类似于面向对象的类)和包(相关程序和变量的集合)。
  PL/SQL是紧密集成到Oracle的SQL语言:我们可以直接从我们的过程式程序中执行SQL语句,而无需依赖任何类型的中间应用程序编程接口(API),如Java Database Connectivity(JDBC)或Open Database Connectivity(ODBC)。相对应地,我们也可以在一个SQL语句中调用自己的PL/SQL函数。
  想要在21世纪取得成功的Oracle开发者必须学习并充分利用PL/SQL语言。这需要两个阶段:第一,我们必须熟悉和学习使用语言的不断增多的功能集;第二,在掌握了个体特性之后,我们必须学会把这些功能合在一起来创建复杂的程序。
  因为这些原因,对于基础PL/SQL语言,Oracle的开发者需要一个坚实的、全面的资源。我们需要知道PL/SQL的基本构建块,并需要通过示例来学习,这样就可以避免一些试错。类似于任何编程语言,PL/SQL有一个正确的方式和很多错误的方式(至少是“非正确的”方式)来处理任何任务。我希望本书能够帮助大家尽可能地以最有效的方式学习如何使用PL/SQL语言。
  本书的目标
  本书将帮助我们实现如下目标。
  充分利用PL/SQL
  Oracle的参考手册描述了PL/SQL语言的所有特性,但里面不会告诉我们如何应用这些特性。事实上,在某些情形下,我们可以在复杂的环境中通过摸索和自学,掌握如何使用一个给定的功能。一般的图书和培训课程往往以相同的有限方式照本宣科。而在本书中,我们将超越基础知识,达到语言的高级层面,并探索特殊的方法,以利用特定的功能达到预期的结果。
  利用PL/SQL来解决实际问题
  我们夜以继日地编写PL/SQL模块,不是为了提高我们的技术水平,而是使用PL/SQL为公司或客户解决问题。在这本书中,作者将尽力帮助大家解决现实世界的问题、开发人员每天面对的问题(至少可以是能够用软件解决的问题)。为了做到这一点,我们在书中添加了示例——不只是小的代码片段,而是大量的应用组件,大家可以在各自的环境中立即使用它们。这本书中有很多很好的代码,在随附的网站中还有更多。在一些内容中,作者会利用示例代码指导大家通过分析来想出解决方案。用这种方式,我们会在大多数的具体任务中看到,如何在特定的任务中应用这些PL/SQL特性,以及这些特性的没有文档说明的潜在功能。
  编写高效、易维护的代码
  PL/SQL和Oracle的其他产品为惊人的开发效率提供了潜力。而如果我们不够细心,这种潜力也容易让我们自己陷入更深、更黑暗的陷阱。如果本书只能帮助程序员在更少的时间里写出更多的代码,那就失败了。作者的目的是要帮助大家建立开发的技能和技巧来创建应用程序,这样的程序易于适应变化,且更容易理解和维护。本书要教会大家使用全面的策略和代码架构,使得我们以强大、通用的方式利用PL/SQL来解决问题。
  本书结构
  本书的作者和O’Reilly Media致力于提供覆盖整个生命周期的PL/SQL语言的全面的、有效的技术。本书的当前版本描述了直到Oracle数据库12c第1版的PL/SQL的特性和功能。在这个版本中,我们把Oracle数据库12c作为基础PL/SQL版本。当然,在适当的情况下,我们也介绍了其他的早期版本引入的(或可用的)具体功能。本书提供了一张表格,列出了不同版本的主要特点(请参阅第1章中1.4节)。
  从在Oracle 6数据库中发布1.0版本以来,PL/SQL在之后的多年间已经有了大幅改进。本书也经历了一系列改版以适应PL/SQL不断改进的功能。
  在本书的当前版本中,最大的变化是全面涵盖了Oracle数据库12c第1版中新的PL/SQL功能。我们在第1章中对这些主要功能进行了汇总,并给出了详细讨论这些功能的章节信息。
  作者对当前版本的内容很满意,希望读者也有同样的感受。这一版本有着比以往任何版本都有更多的信息,但作者认为,我们应继续保持幽默感和轻松的语气,多年来读者告诉我们,这样做可以使书本更易阅读,易于被理解,而且非常有用。
  本书的作者不止一人,下面是具体每章的作者列表。在后面的“致谢”部分,对各位作者的贡献进行了详述。
  本书内容
  本书分为6个部分。
  第1部分
  从第1章开始介绍PL/SQL是从哪里来的,它有什么好处。作者提供了一个对PL/SQL语言的一些主要特点的快速浏览。第2章可以帮助读者创建PL/SQL程序,并尽可能快地运行它,包括明确的、简单的指令,可以让我们在SQL * Plus和其他一些常见的环境中执行PL/SQL代码。第3章回顾了PL/SQL语言的基础:介绍了PL/SQL语句的构成和块结构,以及如何在PL/SQL中写注释,等等。
  第2部分
  第4~6章,探讨了PL/SQL语言中的条件(IF和CASE)和顺序(GOTO和NULL)控制语句,循环和CONTINUE语句,以及异常处理。本书这一部分将教大家创建与程序复杂需求相关联的代码块。
  第3部分
  与我们所写的用来处理数据的每一个程序相关,大部分数据对于PL/SQL过程或函数都是本地(定义)的。第7~13章的侧重点在于我们可以在PL/SQL中定义的各种程序数据的类型,如数字、字符串、日期、时间戳、记录和集合等。读者会了解Oracle 11g数据库引入的新数据类型(SIMPLE_INTEGER、SIMPLE_FLOAT和SIMPLE_DOUBLE),以及许多其他的新版本引入的二进制、日期和时间戳类型。这一部分也涵盖了Oracle所提供的各种内置的功能,可以用来操作、修改数据。
  第4部分
  第14~16章,介绍了PL/SQL代码结构的一个核心要素——连接到底层数据库,这需要通过SQL语言实现。这一部分将告诉你如何定义事务,以便在数据库中进行更新、插入、合并和删除表,如何在PL/SQL程序中从数据库中查询用于处理的信息,以及如何使用本地动态SQL(NDS)来动态执行SQL语句。
  第5部分
  在这里,前面所提到的内容被汇到了一起。我们已经知道如何声明和处理变量,已经是错误处理和循环构建的专家。现在,从第17~22章,我们会学习创建程序的模块,其中包括过程、功能、包和触发器,以及如何把信息导入到PL/SQL程序或从导出。第20章讨论管理PL/SQL代码库,包括测试和调试程序,以及管理的依赖关系;它还提供了基于版本的重定义功能的概述,这是在Oracle数据库11g第2版中引入的。第21章的重点在于如何使用各种工具和技术,以在PL/SQL程序以外获得最佳性能。第22章涵盖了PL/SQL的I/O技术、DBMS_OUTPUT(将结果输出到屏幕上)和UTL_FILE(读和写文件),以及UTL_MAIL(发送邮件)和UTL_HTTP(从网页检索数据)。
  第6部分
  PL/SQL是一种成熟和丰富的语言,其功能是全面的,这些功能我们可能不会每天都使用,但可能是成功和失败的关键。第23章探讨了我们创建PL/SQL程序时所面临的安全挑战。第24章对PL/SQL架构进行了探索,包括PL/SQL对内存的使用。第25章为需要解决全球化和本地化问题的PL/SQL开发人员提供指导。第26章提供了针对Oracle的面向对象的功能的指导(对象类型和对象浏览)。
  附录A到附录C,总结了正则表达式语法的细节,以及数字和日期格式。
  本书第4版包含的如何在PL/SQL程序中调用Java和C代码的相关知识,已经转移到了本书的网站上。
  如果读者是刚开始了解PL/SQL,那么通读本书将会提高你的PL/SQL技能并加深你对语言的理解。如果读者是已经精通PL/SQL的程序员,则可以跳到相应的部分直接采用特定的技术,来立即完成你的程序。无论你使用本书作为教学的指导还是参考,作者都希望它能够帮助你高效地使用PL/SQL。
  本书没有包含的内容
  本书尽管很厚,但它并不是包罗万象的。Oracle的环境是宏大复杂的。在本书中,我们把注意力集中于核心的PL/SQL语言本身,因此以下主题自然不会被涵盖在本书的范围内,除了偶尔或附带提及它们。
  SQL语言
  本书假定读者已经具有SQL语言的知识,而且知道如何使用SELECT、UPDATE、INSERT、MERGE和DELETE语句。
  Oracle数据库管理
  数据库管理员(DBA)可以用本书来学习如何写必要的PL/SQL程序以创建和维护数据库,本书不探讨Oracle的SQL的Data Definition Language(DDL)所具有的细微差别。
  程序及数据库调优
  本书不包括详细的调优内容,虽然在第21章中讨论了许多工具和技术,它们有助于优化我们的PL/SQL程序的性能。
  与PL/SQL无关的Oracle工具的具体技术
  本书并不试图教大家如何在Oracle工具(如Oracle的Forms Developer)中创建程序,即使使用的语言是PL/SQL。我们集中于核心语言的功能,专注于在数据库中我们利用PL/SQL所能做的工作。然而,几乎本书内包括的所有任务都适用于Forms Developer和 Reports Developer内部的PL/SQL。
  本书约定
   提示
  表示提示、建议或一般的说明。例如,如果某个设置为特定版本所有,作者会告诉大家。
   警告
  表示警告或警示。例如,如果某设置对系统有一定的负面影响,作者会警示大家。
  本书适用平台或版本
  在一般情况下,这本书的所有的讨论和示例适用于任何我们使用的机器和/或操作系统。有些与版本有关的功能——例如,如果我们只能在Oracle数据库11g(或特定的版本,如Oracle数据库11g第2版)中使用它,那么作者会在文本中注明。
  PL/SQL有很多版本,我们有时会发现在开发过程中需要使用多个版本。第1章介绍了PL/SQL的各种版本以及我们应该了解的要点,详见1.4节的内容。
  关于代码
  本书引用的所有代码可从//oreil.ly/oracle-plsqlsixth找到。我们也会在网站中找到新版本中被删除或被压缩的早期版本的一些内容。这些将有助于还在使用旧版本Oracle的读者。
  关于Steven的所有图书和相关资源的信息可以在//www.stevenfeuerstein.com找到。我们也可以访问PL/SQL Obsession(Steven Feuerstein的PL/SQL的门户),在那里我们会找到一些可供下载的培训资料、代码等。
  要在本书的网站上寻找一个特定的示例,可以通过查找文本中引用的文件名来找到它。在本书中,我们在很多示例开头的注释中列出了文件名,如下所示:
  /* File on web:fullname.pkg */
  如果读者感兴趣的代码段中没有“文件在Web上”的注释,应该去检索相应章的代码文件。
  每章的代码文件包含所有的代码片段和示例,方便我们进行复制和粘贴。这些文件也包含用DDL语句来创建其他对象的代码可能依赖的表。
  每一章的代码文件被命名为chNN_code.sql,其中NN为章数。
  最后,hr_schema_install.sql脚本将创建标准的Oracle Human Resources示范表,如员工、部门等。书中的示例将会使用这些表。
  代码示例的使用
  本书的补充材料(如代码示例、练习等)可从//oreil.ly/oracle-plsql-sixth下载。
  本书的目的是帮助读者完成工作。一般而言,你可以在你的程序和文档中使用本书中的代码,而且也没有必要取得我们的许可。但是,如果你要复制的是核心代码,则需要和我们打个招呼。例如,你可以在无需获取我们许可的情况下,在程序中使用本书中的多个代码块。但是,销售或分发O’Reilly图书中的代码光盘则需要取得我们的许可。通过引用本书中的示例代码来回答问题时,不需要事先获得我们的许可。但是,如果你的产品文档中融合了本书中的大量示例代码,则需要取得我们的许可。
  在引用本书中的代码示例时,如果能列出本书的属性信息是最好不过的。一个属性信息通常包括书名、作者、出版社和ISBN。例如,“Oracle PL/SQL Programming,Six Edition by Steven Feuerstein and Bill Pribyl (O’Reilly).Copyright 2014 Steven Feuerstein and Bill Pribyl,978-1-4493-2445-2.”
  在使用书中的代码时,如果不确定是否属于正常使用,或是否超出了我们的许可,请通过permissions@oreilly.com与我们联系。
  联系方式
  如果你想就本书发表评论或有任何疑问,敬请联系出版社。
  美国:
  O’Reilly Media,Inc.
  1005 Gravenstein Highway North
  Sebastopol,CA 95472
  中国:
  北京市西城区西直门南大街2号成铭大厦C座807室(100035)
  奥莱利技术咨询(北京)有限公司
  我们还为本书建立了一个网页,其中包含了勘误表、示例和其他额外的信息。你可以通过如下地址访问该网页:
  //www.oreil.ly/oracle-plsql-sixth
  关于本书的技术性问题或建议,请发邮件到:
  bookquestions@oreilly.com
  欢迎登录我们的网站(//www.oreilly.com),查看更多我们的书籍、课程、会议和最新动态等信息。
  Facebook://facebook.com/oreilly
  Twitter://twitter.com/oreillymedia
  YouTube://www.youtube.com/oreillymedia
  致谢
  本书在1995年首次出版,作为广大程序员如何使用PL/SQL语言的“帮助”文档,它的发展史是繁忙而富有成效的。在此,作者对所有读者表示感谢。
  一直保持本书的定位:PL/SQL程序设计准确、可读性强和及时更新的参考资料,从一开始就是一个艰巨的(嗯,有时甚至是过于艰巨的)任务。没有许多Oracle的专家、朋友、家人的帮助是不可能实现的,当然还有那些在O’Reilly Media工作的非常优秀的伙伴们给予的支持。
  我们在下面详细列出了那些帮助完成本书第6版的人员名单并对他们表示感谢。名单的最后,是对早期版本有所帮助的需要感谢的人员。
  首先,感谢那些为本书贡献章(节)和/或实质内容的人们,按照名字的字母顺序,他们是Adrian Billington、Chip Dawes、Jonathan Gennick、Ron Hardman、Darryl Hurley和Arup Nanda。对于第6版,Chip Dawe负责更新了6章。Jonathan Gennick在过去的版本中撰写并在新版本中更新了6章。Darryl Hurley已为几个版本更新了关于数据库触发器的内容,并为Oracle的国际化功能贡献了意见。Arup Nanda针对安全控制写出了优秀篇章。Ron Hardman自发地为全球化和本地化写了说明。Adrian Billington在第21章中为管道表函数提供了极好的材料。
  这里邀请了每一位撰稿人发表自己的感想。
  Adrian Billington是数据库设计、开发和性能调优的专家,自1999以来一直从事Oracle数据库相关的工作。他是oracle-developer.net的幕后人员,这个网站为Oracle开发者提供完整的SQL和PL/SQL的功能、工具和技术。Adrian也是一个Oracle ACE以及OakTable Network的成员。他要感谢James Padfield(Padders)、Tom Kyte和Steven Feuerstein,在他作为Oracle专家产生动摇的时期,这些人鼓励他成为一个更好的开发者。他与他的妻子Anji和3个孩子Georgia、Oliver和Isabella生活在英国。
  Chip Dawes在过去的20年里作为一个DBA、开发者、教师和指导者,一直与Oracle数据库技术合作。他目前是PwC的经理,他在那里帮助客户在他们的数据中寻找价值。Chip与妻子和孩子生活在Chicagoland。
  Jonathan Gennick(//gennick.com)是一位经验丰富的技术人员,他以他的Oracle数据库专业知识而闻名。他过去的经验包括软件开发和数据库管理。作为一名开发人员,他一直很喜欢问题诊断和调试。他喜欢用SQL和PL/SQL,以有关这些主题的书和文章而闻名。在他的业余时间里,Jonathan享受低技术的生活方式。他积极地为当地教堂服务,经常与高中以及有时是大学的班级一起投入到圣经学习中,或在讲坛上演讲。他也是一名狂热的山地骑行者,甚至在隆冬时节骑着装上芬兰进口防滑轮胎的拉风自行车。在他的Oracle工作中,他目前正以他自己的方式探索Oracle SQL内置的统计函数。
  Ron Hardman是SettleOurEstate.com的创始人,该网站是一个建在Oracle Apex和Oracle Cloud Database上的房产管理解决方案。他也是世界各地Oracle Text与Oracle全球化技术的顾问,他同时作为员工和客户与Oracle合作超过17年。Ron除了技术还喜欢写作,在2010年他的第一部历史小说出版,书名为Shadow Fox:Sons of Liberty,是他与他的女儿合著的。
  Darryl Hurley与Oracle技术打交道超过20年,关注于PL/SQL和DBA的工作。他与他的可爱的妻子Vanessa和美丽的女儿Bianca,生活在英属哥伦比亚的里士满。
  Arup Nanda从1993以来就任职Oracle DBA,从事这个工作的各个方面——建模、性能故障排除、PL/SQL编码、备份、灾难恢复等。他是一个大公司的首席数据库架构师,写了约500篇文章,合著了5本书,并在各种会议中进行了约300次的演讲。他提供培训课程,从事特殊项目如审计和DR,他在自己的博客arup.blogspot.com上发表Oracle技术文章。他是Oracle Magazine的2003年的年度DBA和2012年的年度设计师。他是一个OCP,一个OTN ACE Director,是OakTable Network的成员。他与他的妻子Anu和儿子Anish住在康涅狄格州。
  对于这么厚的一本书,我们需要很多的审查人员,主要是因为需要测试这本书中每一个代码段和程序,以确保在变成印刷本时尽可能少出错误。非常感谢Oracle PL/SQL世界的人们,他们贡献了业余时间来帮助本书成为最好的书。
  对于第6版,首先感谢Valentin Nikotin,他是这本书的最好的技术评审员之一。他不仅检查了Oracle 12c数据库的内容准确性,而且还帮助剔除了一些歧义,并为一些关键内容修正了错误。其他的技术评审员也对提高本书的质量有很大的贡献。谢谢Patrick Barel 和Arup Nanda!
  接下来,要对Oracle的PL/SQL产品经理Bryn Llewellyn表示深深的谢意,并感谢PL/SQL开发团队的其他成员,尤其是Charles Wetherell。Bryn为Oracle数据库12c的新功能提供了关键信息和反馈,并以无尽的耐心回答了关于PL/SQL的特点的许多问题。毫无疑问,作者对PL/SQL的理解以及在表达的准确性上,要归功于Bryn。
  从非Oracle的角度来看,非常感激Joel Finkel,最令人喜欢的万事通,在计算机和软件方面,他弥补了作者的狭隘的专业化,这种专业化虽然有益,但是也限制了作者的知识宽度。
  当然,上述都只是技术内容。在我们完成了PL/SQL内容的编写后,是时候轮到在O’Reilly Media的优秀员工——在编辑Ann Spencer的领导下——把我们如此多的内容和代码示例变为一本书,然后在O'Reilly出版。非常感谢Julie Steele(第5版的编辑)、Nicole Shelby(本版的责任印制)、Rob Romano(他创建了优秀的图表),以及其他员工。这是Ann第一次编辑作者的书。对于所有以前的版本(也就是从1994到2007),作者很荣幸和高兴与Debby Russell合作。谢谢,Debby,你多年的努力使O'Reilly Media的整个Oracle系列图书大获成功!
  这里我们还要感谢(这种感谢将一直维持下去)许多人,他们对这本书的前5版做出了贡献:Sohaib Abassi、Steve Adams、Don Bales、Cailein Barclay、Patrick Barel、John Beresniewicz、Tom Berthoff、Sunil Bhargava、Jennifer Blair、Dick Bolz、Bryan Boulton、Per Brondum、Boris Burshteyn、Eric Camplin、Joe Celko、Gary Cernosek、Barry Chase、Geoff Chester、Ivan Chong、Dan Clamage、Gray Clossman、Avery Cohen、Robert A.G.Cook、John Cordell、Steve Cosner、Tony Crawford、Daniel Cronk、Ervan Darnell、Lex de Haan、Thomas Dunbar、Bill Dwight、Steve Ehrlich、Larry Elkins、Bruce Epstein、Joel Finkel、R.James Forsythe、Mike Gangler、Beverly Gibson、Steve Gillis、Eric Givler、Rick Greenwald、Radhakrishna Hari、Gerard Hartgers、Donald Herkimer、Steve Hilker、Bill Hinman、Gabriel Hoffman、Chandrasekharan Iyer、Ken Jacobs、Hakan Jakobsson、Giovanni Jaramillo、Dwayne King、Marcel Kratochvil、Thomas Kurian、Tom Kyte、Ben Lindsey、Peter Linsley、Vadim Loevski、Leo Lok、Debra Luik、James Mallory、Raj Mattamal、Andrew McIlwrick、Nimish Mehta、Ari Mozes、Steve Muench、Jeff Muller、Kannan Muthukkaruppan、Dan Norris、Alex Nuijten、James Padfield、Rakesh Patel、Karen Peiser、Fred Polizo、Dave Posner、Patrick Pribyl、Nancy Priest、Shirish Puranik、Chris Racicot、Sri Rajan、Mark Richter、Chris Rimmer、Alex Romankevich、Bert Scalzo、Pete Schaffer、Drew Smith、Scott Sowers、JT Thomas、David Thompson、Edward Van Hatten、Peter Vasterd、Andre Vergison、Mark Vilrokx、Zona Walcott、Bill Watkins、Charles Wetherell、Edward Wiles、Daniel Wong、Solomon Yakobson、Ming Hui Yang和Tony Ziemba。
  我的妻子Veva Silva,支持我在软件世界的职业生涯中所走出的每一步,我非常感谢她。我的孩子Christopher Tavares Silva和Eli Silva Feuerstein,容忍了我将本应投入到他们身上的注意力转移到PL/SQL(当他们是青少年时,很欢迎这种转移)当中。最后,我感谢Chris和他可爱、聪明、有创造力的妻子Laure,他们给我带来了第一个孙女Loey Lucille Silva。
精彩书摘
  本书的第1部分对PL/SQL进行说明,介绍如何创建和运行PL/SQL代码,以及PL/SQL语言的基础知识。在第1章中,我们提出这样的基本问题:PL/SQL从何而来?它能干什么?PL/SQL的主要特性是什么?在第2章中,我们让读者能够尽快上手使用PL/SQL语言,包括清晰、简单的PL/SQL代码执行指导,以及常见的环境说明。第3章中,我们回答了关于语言结构和关键字的常见问题:如何创建一个PL/SQL声明?PL/SQL块结构是什么?如何在PL/SQL代码中添加注释?
  PL/SQL是“结构化查询语言的过程化语言扩展”(Procedural Language extensions to the Structured Query Language)的英文缩写。SQL是无处不在的关系型数据库查询和更新使用的语言。Oracle公司引入PL/SQL来克服SQL中的一些短板,以给那些意欲在Oracle数据库上运行关键应用的企业提供一个更完整的编程解决方案。本章介绍PL/SQL的起源、它的不同版本,以及PL/SQL在最新的Oracle版本(Oracle 12c)中新特性的简单汇总,并为PL/SQL开发者提供了一些信息资源和建议。
  Oracle的PL/SQL语言有一些决定性的特征,如下所示。
  它是高度结构化、可读和易懂的语言
  如果我们刚开始学习编程,PL/SQL可以作为一个绝好的开端。我们会发现,PL/SQL语言易于学习,它有丰富的关键字和结构来清晰地表达代码的内容。而如果我们已有其他编程语言的使用经验,则会很容易熟悉PL/SQL的语法。
  它是标准的和可移植的Oracle开发语言
  如果我们编写了一些PL/SQL过程或函数,并运行在自己的笔记本电脑上的Oracle数据库中,那么我们就可以不做修改(当然,数据库版本要兼容)地把这些过程或函数移植到我们所在公司的数据库中并运行它们。“一次编程,各地运行”是在Java出现之前长期流传的PL/SQL的口头禅。对于PL/SQL来说,“各地”意味着“有Oracle数据库的各个地方”。
  它是内嵌式语言
  PL/SQL设计的初衷不是作为一种独立的语言,而是在宿主环境中被调用使用。因此,我们可以在数据库中运行PL/SQL程序(当然,通过SQL*Plus接口),或者,我们可以在Oracle Developer form或report(这种方式称为客户端PL/SQL)中定义和执行PL/SQL程序。但我们不能创建一个自己直接运行的PL/SQL可执行程序。
  它是高性能、高度集成的数据库语言
  近年来,当我们想针对Oracle数据库编写软件时,我们有多种选择:我们可以使用Java和JDBC;我们可以用Visual Basic和ODBC;我们还可以用Delphi、C++等。然而,我们会发现在处理Oracle数据库时,PL/SQL比其他语言更易写出高效率的代码。尤其是,Oracle提供了针对PL/SQL的特定的增强,如FORALL声明,可以把数据库性能提高一个数量级甚至更多。
  Oracle一度引领着声明式、非过程性数据库和应用设计的发展,Oracle数据库服务器技术是世界上最先进、最强大、最稳定的关系数据库。它的应用开发工具,如Oracle Forms,通过“在屏幕上作画”的方式,以及它提供的大量默认功能,使得开发者避免了繁重的定制开发工作量,由此极大地提高了开发的效率。
  在Oracle早期,SQL的声明方式结合其突破性的关系型技术,足以满足开发者的需要。但随着行业的成熟和人们期望值的提高,人们对SQL有了更高的要求。开发者需要深入到产品的内层,在它们的表单和数据库脚本中构建复杂的公式和异常处理以及规则。
  在1988年,Oracle公司发布了Oracle版本6,在关系型数据库技术中迈进了一大步。此版本中有一个叫作“过程性选项”或“PL/SQL”的关键组件,几乎就在同时,Oracle发布了令人期待已久的升级版本SQL*Forms 2.3(Oracle Forms或Forms Developer最初的名字)。在工具方面,SQL*Forms v3第一次纳入了PL/SQL引擎,使得开发者能以自然、简单的方式开发自己的过程性逻辑代码。
  PL/SQL最早版本的功能非常有限:在服务器端,我们只能使用PL/SQL来构建“批处理”脚本以及SQL语句,而不能构建模块化的应用或存储业务规则;在客户端,SQL*Formsv 3.0倒是允许我们创建过程和函数,但其对函数的支持并没有对应文档,因此在之后的几年间都没有大量的开发人员在使用它。而且,此版本的PL/SQL不支持数组,不能与操作系统进行交互(输入和输出),它还是一个远远不够成熟的编程语言。
  尽管存在局限性,但 PL/SQL 在开发人员社区受到了友好的甚至是热烈的欢迎,他们对在SQL*Forms里实现简单IF语句编码的渴望是强烈的。批处理执行多条SQL语句的需求压倒一切。
  当时,少数开发者意识到,在PL/SQL背后的原始动机和主要期望,已经不再止于在像SQL*Forms这样的产品里,能够对控制进行编程的水平。在Oracle数据库和工具的生命周期早期,Oracle公司就意识到,在它们的架构中,存在两个关键弱点:缺乏可移植性和执行权限管理。
  对作者这些了解Oracle公司市场及技术战略的人来说,对应用可移植性存在顾虑显得有点奇怪,从20世纪70年代初开始,可移植性就是Oracle解决方案的标志之一。随着PL/SQL的出现,建筑在C语言之上的数据库就运行在许多不同的操作系统和硬件平台上。SQL*Plus和SQL*Forms可以轻松适应不同配置的终端。但尽管有着这些适应性,仍然有一些应用程序需要Oracle提供更复杂的和更细粒度的控制,像它们的宿主语言如COBOL、C和FORTRAN所做的那样。一旦开发者不采用端口中立的Oracle工具,就会导致应用程序不再可移植。
  PL/SQL语言曾经(现在也是)的意图是,在完全独立于操作系统的编程工具里,扩大对应用需求的处理能力。现在,Java和其他编程语言也提供类似的可移植性。当然,PL/SQL是这个领域的先锋,它继续支持着开发者们的高可移植性应用代码。
  比可移植性更重大的缺陷是执行权限控制。数据库和SQL语言使得我们对任意特定表中数据的访问和变更有着完全的控制,例如,用GRANT命令,我们可以限定只有特定的角色和用户可以对一个给定表进行UPDATE操作。而另一方面,这个GRANT命令,却没法保证让用户按照正确的顺序对一个或多个表进行变更,而通常大多数商业规则都对交易顺序有所要求。
  PL/SQL语言在逻辑交易处理上,能够提供严格控制和管理。PL/SQL实现其控制和管理的方法之一,就是实施了执行权限控制。我们不再对一个角色或用户授权以允许其对表进行更改,取而代之的,是只授权其执行一个过程,由这个过程控制并提供对其内部隐含的数据结构的访问。过程的所有者是数据库中的另一个schema(程序的“定义者”),这个schema被真正赋予了过程执行时所涉及的表的修改权限。由此,过程成为了交易的“守门员”。一个程序要执行某项交易,唯一的方法是调用这个过程,通过这个方法,整个应用交易的完整性得到了保证。
  从Oracle数据库8i开始,Oracle通过AUTHID子句,给PL/SQL执行权限控制模块增加了相当的灵活性。有了AUTHID,我们不但可以在前面描述的模式下继续运行我们的程序,我们也可以选择使用AUTHID CURRENT_USER(调用者的权限),在这种情况下,程序是运行在调用者(当前)schema的权限之下的。这里我们只是将调用者权限作为一个示例,来展示PL/SQL随着时间的推移,如何变得成熟以及更灵活。
精彩插图