《Oracle PL/SQL程序设计(第5版)》一一1.2 PL/SQL的起源

本节书摘来自异步社区出版社《Oracle PL/SQL程序设计(第5版)》一书中的第1章,第1.2节,作者:【美】Steven Feuerstein , Bill Pribyl,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 PL/SQL的起源

Oracle PL/SQL程序设计(第5版)
Oracle公司一度领导软件工业为设计数据库和应用程序提供一种声明式的、非过程化的方法。Oracle数据库服务器是世界上最先进的、最强大的、最稳定的关系数据库。它的应用程序开发工具,比如Oracle Forms,通过提供大量的默认功能,提高了生产力水平,开发人员只要依靠“在屏幕上涂涂画画”的方法,就能避免自行开发的劳苦。

1.2.1 早期的PL/SQL

在早期的Oracle中,SQL的声明式方法,以及开天辟地的关系技术,已经足以满足开发人员的需要了。不过随着技术成熟,期望值也增加了,需求也更迫切了。开发人员需要能够“深入”产品。他们需要在他们的表单和数据库脚本中构建复杂的公式、异常和规则。

1988年,Oracle公司发布了Oracle版本6,这是Oracle在关系数据库方面的重大进步。这个版本出现了一个叫做“程序选项”或者PL/SQL的关键组件。差不多在同一时间,Oracle发布了期待已久的SQLForms 2.3版(这个产品最初叫做Oracle Forms或者Forms Developer)。SQLForms 3.0版首次在工具端整合了PL/SQL引擎,开发人员可以以一种自然的、直观的方法编码程序逻辑。

第一版的PL/SQL功能非常有限。在服务器一端,我们只能用PL/SQL编写“批处理”形式的过程以及SQL语句脚本。我们无法用模块化方法构建应用程序或者在服务器上保存业务规则。在客户端,SQL*Froms 3.0版确实能够创建过程和函数,尽管支持函数但是因为没有文档说明,因此多年以来大部分开发人员都无法使用这个功能。还有,这一版的PL/SQL既不支持数组也不能和操作系统进行交互(输入或者输出)。距离一个功能完备的编程语言还差得很远。

但是尽管有诸多限制,可是PL/SQL还是被开发者社区亲切的,甚至是热情的接受。人们强烈的渴望能够在SQL*Forms中使用简单的IF语句。而对于能够运行多个SQL语句的批处理的呼声更是甚嚣尘上。

当时部分开发人认识到,驱动PL/SQL的原动力和愿景早已经超越了对类似于SQL*Forms产品中编程控制的期望,对于早期的Oracle数据库及工具,Oracle公司承认产品架构中有两个主要缺陷:缺乏可移植能力和执行授权问题。

1.2.2 改进的应用程序移植能力

对于像我们这些熟悉Oracle公司的市场和技术策略的人来说,关注移植性可能有点怪异。早在1980年Oracle的一个商标就是移植能力。在PL/SQL出现时,基于C语言的数据库可以在许多不同的操作系统和硬件平台上运行,SQLPlus和SQLForms也很容易适应不同的终端配置环境。不过尽管如此,还是有许多的应用程序需要利用主机语言比如COBOL、C、FOTRAN提供的复杂精细的控制能力。一旦开发人员脱离了中立的Oracle工具,最后应用程序就不在是可移植的了。

PL/SQL语言的目的就是为了扩宽应用需求的范围,提供一种完全操作系统独立的编程工具。今天,Java和其他的编程语言也提供了类似的移植能力。不过PL/SQL仍是这个领域的先驱,当然,它也将继续帮助开发人员编写高度可移植的应用程序代码。

1.2.3 改进的执行授权和事务一致性

比可移植性更基本的问题就是执行授权。数据库和SQL语言让我们可以紧密地控制对任何个别数据库表的访问和修改。例如,通过GRANT命令,我们可以确保只有特定的角色和用户可以对指定表执行更新操作。另一方面,GRANT命令不能确保用户或者应用执行的更新操作能够正确执行,换句话说,数据库不能确保跨越多个表的事务的一致性,在业务事务中涉及多个表是很常见的。

PL/SQL语言为逻辑事务提供了紧密的控制和管理能力。PL/SQL实现这种能力的一个方式就是通过执行授权。我们不再是给一个角色或者用户对某个表的更新权限,我们只是授权执行某个过程,后者控制着对底层数据结构的访问。这个过程是由另外一个Oracle数据库模式所有(程序的“定义者”),是给这个模式授予执行事务需要用到的表的更新权限。现在这个过程成了事务的“门卫”。程序(不管是一个Oracle Forms应用或者是一个Pro*C可执行程序)能够运行的唯一方法就是通过这个过程。利用这种方法,整个应用程序的事务一致性都得到了保证。

从Oracle 8i数据库开始,Oracle用通过提供AUTHID子句为PL/SQL的执行授权模型添加了更多的灵活性。使用AUTHID,我们可以继续用之前描述的定义者权限模型运行程序,或者我们也可以选择使用AUTHID CURRENT_USER(调用者权限),这时这个程序是用调用者(当前)模式的授权运行的。调用者权限模型只是这么多年来PL/SQL逐渐成熟和更加灵活的一个例子。

1.2.4 低调地起步,稳定地前进

尽管SQL很强大,仅靠它也不能提供开发人员创建全功能应用程序的灵活性和功能。Oracle的PL/SQL语言保证了我们可以完全待在独立于操作系统的Oracle环境中,同时还能编写出满足用户需求的高效应用程序。

Oracle从开始到现在已经发展了很长时间了。在PL/SQL 1.0版,开发人员总是会告诉他或者她的经理,“我们用PL/SQL无法完成”。今天,这句话不再是事实了。如果我们遇到一个需求结果发现,“没法实现,”千万不要和你的经理这么说。相反,我们应该深入研究这个语言,或者探索一下Oracle提供的大量的PL/SQL包。事实上,今天的PL/SQL基本上可以帮助我们完成任何需要的功能。

多年来,Oracle公司不断证明他对PL/SQL的承诺,一个一流的编程语言。数据库的每一个新版本,Oracle都会对PL/SQL语言本身进行一些稳定的基本的改进。提供了大量的(内置的)包在多方面扩展了PL/SQL语言的能力。已经引入了面向对象功能,实现了多种类似数组的数据结构,对编译器进行增强既能够优化我们的代码也可以对可能的质量和性能问题提出警告,总之从广度和深度上对语言进行了提升。

接下来的章节会通过一些PL/SQL程序实例帮助我们数据PL/SQL编程基础。

上一篇:DataWorks搬站方案:Azkaban作业迁移至DataWorks


下一篇:DataWorks百问百答69:有哪些数据集成报错(数据集成报错归类)?