PL/SQL
2018-11-29 16:46:08 阿炯

PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。它将数据库技术和过程化程序设计语言联系起来,是一种应用开发语言,可使用循环,分支处理数据,将SQL的数据操纵功能与过程化语言数据处理功能结合起来。PL/SQL使SQL成为一种高级程序设计语言,支持高级语言的块操作,条件判断,循环语句,嵌套等,与数据库核心的数据类型集成,使SQL 的程序设计效率更高。

PL/SQL(Procedural Language/SQL)是一种过程化语言,属于第三代语言,它与C、C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。它允许SQL的数据操纵语言和查询语句包含在块结构(block_structured)和代码过程语言中,使PL/SQL成为一个功能强大的事务处理语言。在甲骨文数据库管理方面,PL/SQL是对结构化查询语言(SQL)的过程语言扩展。PL/SQL的目的是联合数据库语言和过程语言。PL/SQL的基本单位叫做一个区段,由三个部分组成:一个声明部分,一个可运行部分,和排除、构建部分。

因为PL/SQL允许混合SQL声明和过程结构,因此可以在将声明发送到Oracle系统去执行之前使用PL/SQL区段和副程序来组合SQL声明,没有PL/SQL,Oracle需要就每次处理SQL声明,在网络环境中,这将影响交通流量,而且增加响应时间。PL/SQL区段只被编译一次并且以可运行的形式储存,以降低响应时间。

特点

PL/SQL紧密结合集成SQL。
它提供了广泛的错误检查。
它提供了大量的数据类型。
它提供了多种编程结构。
它支持通过函数和程序结构化编程。
它支持面向对象的编程。
它支持开发Web应用程序和服务器的页面。

作用

使用PL/SQL可以编写具有很多高级功能的程序,虽然通过多个SQL语句可能也能实现同样的功能,但是相比而言,PL/SQL具有更为明显的一些优点:
⒈能够使一组SQL语句的功能更具模块化程序特点;
⒉采用了过程性语言控制程序的结构;
⒊可以对程序中的错误进行自动处理,使程序能够在遇到错误的时候不会被中断;
⒋具有较好的可移植性,可以移植到另一个Oracle数据库中;
⒌集成在数据库中,调用更快;
⒍减少了网络的交互,有助于提高程序性能。

通过多条SQL语句实现功能时,每条语句都需要在客户端和服务端传递,而且每条语句的执行结果也需要在网络中进行交互,占用了大量的网络带宽,消耗了大量网络传递的时间,而在网络中传输的那些结果,往往都是中间结果,而不是我们所关心的。

而使用PL/SQL程序是因为程序代码存储在数据库中,程序的分析和执行完全在数据库内部进行,用户所需要做的就是在客户端发出调用PL/SQL的执行命令,数据库接收到执行命令后,在数据库内部完成整个PL/SQL程序的执行,并将最终的执行结果反馈给用户。在整个过程中网络里只传输了很少的数据,所以整体程序的执行性能会有明显的提高。

基本结构

PL/SQL块由四个基本部分组成:块头、声明单元、执行单元、异常处理单元。

下面是四个部分的基本结构:
HEADER —— 可选部分
只有命名块才有的单元,块头单元就确定了这个命名块或者程序的调用方式。

DECLARE —— 可选部分
变量、常量、游标,以及可以被后面执行单元或者异常处理单元引用的子块。

BEGIN —— 必要部分
SQL语句和PL/SQL语句构成的执行程序

EXCEPTION —— 可选部分
程序出现异常时,捕捉异常并处理异常

END;—— 必须部分

一个完整的块结构应该是这样的:
Header
IS
Declaration Section
BEGIN
Execution Section
EXCEPTION
Exception Section
END;

在数据库执行PL/SQL程序时,PL/SQL语句和SQL语句是分别进行解析和执行的。PL/SQL块被数据库内部的PL/SQL引擎提取,将SQL语句取出送给Oracle的SQL引擎处理,两种语句分别在两种引擎中分析处理,在数据库内部完成数据交互、处理过程。PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块,匿名程序块可以用在服务器端也可以用在客户端。

命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。PL/SQL程序块可背独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。Oracle提供了四种类型的可存储的程序:
. 函数
. 过程
. 包
. 触发器

基本语法

在写PL/SQL语句时,必须遵循一些基本的语法,下面是PL/SQL程序代码的基本语法要求:
⒈语句可以写在多行,就像SQL语句一样;
⒉各个关键字、字段名称等等,通过空格分隔;
⒊每条语句必须以分号结束,包括PL/SQL结束部分的END关键字后面也需要分号;
⒋标识符需要遵循相应的命名规定;
⑴.名称最多可以包含30个字符;
⑵.不能直接使用保留字,如果需要,需要使用双引号括起来;
⑶.第一个字符必须以字母开始;
⑷.不要用数据库的表或者科学计数法表示;

还有一些语法相关的规则:
⒈在PL/SQL程序中出现的字符值和日期值必须用单引号括起;
⒉数字值可以使用简单数字或者科学计数法表示;
⒊在程序中最好养成添加注释的习惯,使用注释可以使程序更清晰,使开发者或者其他人员能够很快的理解程序的含义和思路。在程序中添加注释可以采用:
⑴/*和*/之间的多行注释;
⑵以--开始的单行注释。

PL/SQL使用的数据库操作语言还是基于SQL的,所以熟悉SQL是进行PL/SQL编程的基础。SQL语言的分类情况大致如下:
1)数据定义语言(DDL):Create,Drop,Grant,Revoke,…
2)数据操纵语言(DML):Update,Insert,Delete,…
3)数据控制语言(DCL):Commit,Rollback,Savepoint,…
4) 其他:Alter System,Connect,Allocate, …

具体的语法结构可以参阅其他关于SQL语言的资料,这里不再赘述。

过程与函数

PL/SQL中的过程和函数与其他语言的过程和函数一样,都是为了执行一定的任务而组合在一起的语句。过程无返回值,函数有返回值。其语法结构为:
过程:Create or replace procedure procname(参数列表) as PL/SQL语句块

函数:Create or replace function funcname(参数列表) return 返回值 as PL/SQL语句块

游标

游标的定义为:用游标来指代一个DML SQL操作返回的结果集。即当一个对数据库的查询操作返回一组结果集时,用游标来标注这组结果集,以后通过对游标的操作来获取结果集中的数据信息。这里特别提出游标的概念,是因为它在PL/SQL的编程中非常的重要。定义游标的语法结构如下:
cursor cursor_name is SQL语句;

有如下的一段代码:
cursor c_emp is select * from employee where emp_id=3;

其含义是定义一个游标c_emp,代表employee表中所有emp_id字段为3的结果集。当需要操作该结果集时,必须完成三步:打开游标、使用fetch语句将游标里的数据取出、关闭游标。

游标用来处理从数据库中检索的多行记录(使用SELECT语句)。利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集。

为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区。这个区包含了已经处理完的行数、指向被分析语句的指针,整个区是查询语句返回的数据行集。游标就是指向上下文区句柄或指针。

游标可分为显式游标与隐式游标

显示游标被用于处理返回多行数据的SELECT 语句,游标名通过CURSOR….IS 语句显示地赋给SELECT 语句。所有的隐式游标都被假设为只返回一条记录。使用隐式游标时,用户无需进行声明、打开及关闭。PL/SQL隐含地打开、处理,然后关掉游标。

参考来源:

Oracle Database PL/SQL

PL/SQL教程

PL-SQL(维基百科)