一、什么是PL/SQL
PL/SQL是对SQL语言的扩展。
SQL语言是一种非过程性语言,即用户只需要告诉计算机做什么,而不需要理解计算机是怎么做的。比如用户要查询一张表里的某一列数据,只需要输入:selectCOLUNM_NAME from TABLE_NAME where CONDITION;就可以了,而不需要了解计算机是如何查询的。这既是优点也是缺点,优点就是该语言非常容易学习,缺点则是缺乏过程控制,限制了其功能,比如无法进行if...else的条件判断,也无法进行for循环操作。
基于SQL语言的局限性,于是诞生了PL/SQL。PL/SQL语言提供了条件判断、循环等等普通程序语言具备的功能。SQL语言是一种标准语言,如Oracle、MySQL、SQL_Server等等都支持,而PL/SQL则是Oracle公司专有的,它将过程控制和SQL语言无缝结合在一起,从而加强了SQL语言的功能。
二、PL/SQL的功能
PL/SQL的功能主要有:
1. PL/SQL提供了块结构,从而实现了模块化设计。任何一种程序语言都提供了函数、过程等基本结构,而函数过程都是将一个大的程序模块化,使得程序更容易开发和维护,PL/SQL也不例外。
2. PL/SQL提供了一些过程化的结构:
A. 变量(Variables)、常量(Constants)以及多种数据类型;
B. 提供了条件分支判断和循环结构;
C. 提供了一次编译,多次运行的单元。
三、PL/SQL的执行机制
PL/SQL语句在执行时,会分成两个部分,SQL语言部分由Oracle数据库内核中的SQL引擎来执行;PL/SQL的块则会由PL/SQL引擎来执行。
SQL引擎始终是位于Oracle数据库里面的,PL/SQL引擎则可以位于Oracle数据库内部,也可以独立于Oracle数据库而存在。独立于Oracle数据库存在的PL/SQL引擎多为一些数据库开发工具所提供,在客户端执行,而不是在服务端执行。
四、PL/SQL的优点
PL/SQL的优点主要有:
1. 在SQL语言中集成了一些过程控制;
2. 提高了性能,
如果单纯的使用SQL语言,那么每执行一条SQL语句,就需要将结果返回到客户端,由客户端根据返回值进行分支控制,然后再执行下一条SQL语句,这个过程会产生大量的I/O操作。
与之对应的,使用PL/SQL语言,可以由客户端将要查询的业务代码打包成一个整体,一次性发给Oracle数据库,甚至很多业务逻辑语句已经集成在Oracle数据库的内核里面了,客户端只需要调用一下即可。数据库会在服务端完成所有的操作,再一次性将结果返回给客户端,从而减少了网络数据的传输。
3.支持模块化编程;
4. Oracle的很多开发工具都支持PL/SQL语言的开发;
5. 可移植性(主要是在Oracle数据库之间进行移植,跨数据库,如MySQL和Oracle之间的移植会比较困难)
6. 支持异常处理。
五、PL/SQL的块结构
PL/SQL语言的基本单元就是块,块主要分为以下四个部分:
DECLARE(optional) ——声明部分
该部分主要定义以下内容:变量(Variables),常量(Constant),指针(cursor),用户自定义的异常(User-definedexceptions)等等。
BEGIN(mandatory)——业务逻辑部分
该部分主要存放业务逻辑:
SQL语句
PL/SQL语句
EXCEPTION(optional)——异常处理部分
该部分主要进行异常的处理
END;(mandatory)——结束部分
注意,BEGIN 和 END这两个部分是必须的,而DECLARE和EXCEPTION这两个部分是可选的,且只在END最后有个分号,其他的地方都没有。
六、块的种类
PL/SQL的块主要有以下三种:
A. 匿名块(Anonymous)
匿名块是指没有起名的块,它不是存储在Oracle数据库里的,它一旦被执行过就失效了,不能重复使用;它主要用于写一些测试和临时使用的语句,其结构如下:
[DECLARE]
BEGIN
--statements
[EXCEPTION]
END;
B. 过程块(Procedure)
过程块需要起名字,其中PROCEDURE部分相当于匿名块中的DECLARE部分。有名字的块(Procedure和Function)可以存储在数据库中反复调用,用在比较正式的环境下,其结构如下:
PROCEDURE name
IS
BEGIN
--statements
[EXCEPTION]
END;
C. 函数块(Function)
函数块也有名字,它和过程块的区别在于它一定要返回数据,其结构如下:
FUNCTION name
RETURN datatype
IS
BEGIN
--statements
RETURN value;
[EXCEPTION]
END;
七、PL/SQL的程序构建
PL/SQL的程序可以构建在客户端,也可以构建在服务端,构建在服务端的情况更常见,因为如果构建在客户端,还需要使用Oracle提供的额外开发工具。
在客户端构建的PL/SQL程序主要内容有:匿名块、过程、函数、包(包是函数和过程的整合)、触发器和一些其他类型的元素;
在服务端构建的PL/SQL程序主要内容有:匿名块、存储过程和函数、包、触发器和一些其他类型的元素。