购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 什么是PL/SQL

PL/SQL是SQL语言的一种扩展。本节主要介绍有关PL/SQL的使用,实际上PL/SQL语言的使用也贯穿了整个Oracle的学习过程,是PL/SQL初学者或初级开发人员必须掌握的重要知识点,相信读者通过本节的学习,对该语言会有一个较全面的认识。

2.2.1 认识PL/SQL

PL/SQL(Procedural Language/Structured Query Language)称为过程化查询语言,是Oracle公司在标准的SQL语言基础上进行扩展而形成的一种可以在Oracle数据库上设计编程并执行的语言,并通过Oracle的PL/SQL引擎执行。本书将介绍PL/SQL以及它涉及SQL部分的知识。PL/SQL和普通的编程语言没有什么区别,可以实现逻辑判断、循环遍历及异常处理等,而这些是标准的SQL很难办到的。由于PL/SQL的基础是标准的SQL语句,因此就降低了学习者的门槛。总的来说,PL/SQL有以下几个特点。

◆支持事务控制和SQL数据操作命令。

◆支持SQL的所有数据类型,并且在此基础上扩展了新的数据类型,同时支持SQL的函数及运算符等。

◆服务器上的PL/SQL程序可以使用权限进行控制。

◆可以存储在Oracle服务器中。

◆Oracle中有自己的DBMS包,可以处理数据的控制和定义命令。

由于PL/SQL扩展自SQL,因此与SQL比较,它具有下面几个优势。

1.模块化应用程序

在一段程序代码中可以实现一个或多个功能,如果使用标准的SQL完成这些功能可能需要执行语句;而如果使用程序块的话,则可以把这些操作都放到某个程序块内,然后对外提供一个调用方式和需要传入的参数(例如存储过程)。这对开发人员来说是一个很有用的功能,当代码编写一次后,其他人不需要再次编写同样的SQL代码,只需要调用一次已有的PL/SQL程序块即可,这种操作优势主要体现在存储过程或函数上。

2.提高运行性能

当标准的SQL被执行时,它只能一次一条地将SQL语句发送至服务器,在实际开发中,完成一个业务逻辑往往需要几条甚至几十条SQL语句,这就往往形成客户端会几十次地连接数据库服务器,而连接数据库本身就是一个很耗费资源的过程,当这个业务被完成时,在网络连接上会浪费大量的资源。

PL/SQL语句块可以包含多条SQL语句,而语句块可以嵌入到程序中,甚至可以存储到Oracle服务器上,用户只需要连接一次数据库就可以把所需要的参数传递过去,其他部分将在Oracle服务器内部执行完成,再返回最终的结果。这样就大大节省了网络资源的开销。图 2.3 描述了PL/SQL与标准的SQL语句多次访问数据库的差异。

图 2.3 PL/SQL与标准的SQL语句多次访问数据库的差异

3.利用逻辑控制语句控制程序结构

既然PL/SQL是一种编程语言,那么它就可以完成一定的业务逻辑处理。要完成这种处理,就需要该编程语言有逻辑控制语句,而实际上PL/SQL可以利用条件语句或循环语句来控制程序流程,这样就大大增加了PL/SQL的实用性,我们可以利用逻辑控制语句完成标准的SQL语句完成不了的复杂业务。

PL/SQL可以很好地完成诸如这样的功能:学生的考试成绩可以分成多个等级,当由参数得到的成绩在某个范围内时,就可以将该成绩定成某个等级,在PL/SQL块中就可以利用CASE语句完成判断分类。而这样的功能在标准的SQL中很难实现,即便实现了也不是动态的数据。

4.可移植性强

PL/SQL可以成功运行在不同的服务器中,例如,从Windows数据库服务器移植到Linux数据库服务器;也可以把PL/SQL从一个版本的Oracle移植到其他版本的Oracle中。

5.可以更好地处理逻辑错误信息

标准的SQL在遇到错误时会提示异常,例如增加数据,一旦有异常就会终止,但是调用者却很难快速地发现错误点在哪里,即使发现出问题的地方也不能告诉开发人员该语句程序本身有问题,而不是逻辑上有问题。例如某个学生的成绩,成绩只能是小于 100 的正数,假如增加的数据中该字段是一个负数,正常来说是可以进入数据库的,但这在逻辑上是不被允许的,因为没有成绩为负的情况。而利用PL/SQL就可以完全避免发生类似的问题,我们可以利用流程拒绝这部分记录进入数据库。

利用PL/SQL还可以处理一些程序上的异常,而不至于因终止SQL操作,而造成调用SQL的展示页面出现生硬的错误提示。

2.2.2 PL/SQL结构

PL/SQL程序的基本单位是块,在PL/SQL中,程序代码块会很明确地分成 3 部分:声明部分、执行体部分和异常处理部分。其中,声明部分以DECLARE作为开始标志;执行体部分用BEGIN作为开始标志;而异常处理部分则以EXCEPTION作为开始标志。“执行体部分”是必需选项,而“声明部分”和“异常处理部分”则为可选部分。下面的一段文字描述了PL/SQL块的这 3 部分所在位置。

在PL/SQL程序段中,其基本结构由这 3 部分组成。

下面的几个实例分别演示了PL/SQL语句块中这 3 部分的组合使用。

【实例 2-1】只有执行体部分的代码块。

实例的代码中只有“BEGIN…END;”部分,该代码的作用是输出一句话,这是最简单的执行体。有关脚本如下:

01 BEGIN

02 DBMS_OUTPUT.PUT_LINE('这是输出的语句...');

03 END;

04 /

【代码解析】

◆第 1 行表示执行体开始。

◆第 2 行表示通过标准输出设备打印一句话。

◆第 3 行表示执行体结束。

【执行效果】

通过SQL*Plus执行,效果见图 2.4。

图 2.4 PL/SQL块输出效果

通过DBMS_OUTPUT可以输出信息,这在PL/SQL编程中经常使用。

如果这段脚本没有输出结果,则需要在SQL*Plus下执行“SET SERVEROUTPUT ON”这样一行脚本,就可以打开SQL*Plus的输出功能。这在后面的章节中使用稍微频繁一些,希望读者注意这点。

【实例 2-2】有声明和执行体部分的代码块。

实例中除了执行体外还有声明部分,这段脚本将为指定变量赋值,并打印到标准输出设备上。相关脚本如下:

【代码解析】

◆第 1 行中的DECLARE是声明部分的关键词。

◆第 2 行表示声明变量v_res,数据类型为NUMBER。

◆第 4 行表示给v_res赋值,这里没用动态赋值方式,读者也容易理解。

◆第 5 行表示输出最后的结果。

【执行效果】

打开SQL*Plus并执行上面一段脚本,执行效果见图 2.5。

图 2.5 包含声明和执行体部分的PL/SQL块输出效果

【实例 2-3】具有声明、执行体和异常处理部分的代码演示。

该实例将从DEPT表中查询指定数据,并把指定数据存储到变量中,当没有查询结果或出现多个查询结果时,会抛出对应的异常,要求把数据或异常提示输出到屏幕上。脚本如下:

【代码解析】

◆第 1~2 行是声明部分。

◆第 3~16 行是执行体部分,异常处理部分在执行体内。

◆第 10~14 行属于异常处理部分。

◆第 4~7 行表示把DNAME所对应的数据放到变量v_dname中。

◆第 11、13 行表示出现这两种异常时会输出相应的提示语句。

【执行效果】

打开SQL*Plus并执行上面一段脚本,执行效果见图 2.6。

图 2.6 完整的PL/SQL块输出结果

该实例中的SELECT…INTO…语句是PL/SQL特有的赋值语句,在后面的章节中会详细介绍。使用该类型语句时需要注意两个问题:第 1 个问题就是SELECT列名顺序和INTO后面的变量名顺序要一一对应;第 2 个问题就是该类型语句每次只能返回 1 条记录,如果返回记录超过 1 条或没有返回记录都会引发异常。

在这几个实例当中,每段程序都要包括“END”关键词,标志着该程序块的结束。

2.2.3 PL/SQL的主要组成部分

在PL/SQL语言中,标准的SQL语句执行起来是不受限制的。PL/SQL也有类似于SQL语言的分类,不过做了许多扩充。其分类如下。

数据定义语言(Data Definition Language,DDL) :用来定义和管理数据库以及数据库中各种对象的语句,主要包括数据库对象的创建(CREATE)、删除(DROP)、修改(ALTER)操作。

数据操纵语言(Data Manipulation Language,DML): 用来查询、添加、修改和删除数据库中数据的语句,这些语句包括SELECT、INSERT、UPDATE、DELETE等。

数据控制语言(Data Control Language,DCL): 用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT、DENY、REVOKE等。

系统存储过程(System Stored Procedure): 是Oracle系统创建的存储过程,其目的在于能够方便地从系统表中查询信息,或者完成与更新数据库表相关的管理任务,或其他的系统管理任务。

◆一些附加的语言元素。

Oracle中分为系统存储过程和自定义存储过程,有关自定义存储过程,会在后面的章节中进行详细介绍。下面简单介绍一下附加的语言元素,主要包括以下几部分。

1.注释语句

注释是程序中不执行的文本字符串(也称为注解)。在PL/SQL中,可以使用两种类型的注释字符:一种是ANSI标准的注释符“--”,用于单行注释,一般对变量、条件子句可以采用该类注释;另一种是与其他编程语言(例如Java)相同的程序注释符“/* */”,用于多行注释,对于多行代码注释建议使用该类注释。

2.变量

变量是一种语言中必不可少的组成部分,在PL/SQL中使用变量必须先进行声明,否则会提示错误。关于变量的使用,会在后面的章节中进行介绍。

3.运算符

运算符是一些符号,能够用来执行算术运算、字符串连接、赋值,以及在字段、常量和变量之间进行比较。在通常情况下,运算符主要有 6 大类:算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符和字符串连接运算符。

4.函数

在PL/SQL中,函数用来执行一些特殊的运算以支持Oracle的标准命令。PL/SQL编程语言允许开发人员编写自己的函数,并且提供了下面两种SQL函数。

单行函数: 每次使用返回一个结果。

集合函数 :作用在多行记录上返回一个结果。

对于函数会在后面的章节中进行详细介绍。

5.流程控制语句

流程控制语句是指用来控制程序执行和流程分支的命令,包括条件执行语句IF...ELSE、重复执行语句WHILE以及跳转语句GOTO和RETURN等。

2.2.4 PL/SQL基本规范

对于PL/SQL语言,开发人员应该遵循一定的编程规范,严格按照规范编写脚本,能够写出高质量的程序,这样的程序具有高可读性,不仅利于其他开发人员的理解,而且利于以后的修改。下面简单列出了开发人员应遵循的规范。

(1)PL/SQL允许使用以下的字符集。

◆字母,包括大写和小写。

◆数字,即 0~9。

◆空格、回车以及制表符。

◆符号包括+ - * / < > = ! ~ ^ ; : . ’@ % , ' # $ & _ | ( ) [ ] { } ?。

(2)使用PL/SQL必须遵守以下要求。

◆标识符中只允许有字母、数字、下画线,并且以字母开头。

◆标识符最多 30 个字符。

◆标识符不区分大小写。所有的名称在存储时都被修改成大写。

◆不能使用保留字,这在其他编程语言中同样适用。如果与保留字同名,必须使用双引号括起来。

◆语句使用分号结束。如果多条语句在同一行,但只要它们都正常结束,那么执行就不会出现错误。语句块的结束标志END后面需要有分号。

◆语句的关键词、标识符、字段名称以及表的名称等都需要使用空格分隔。

◆字符类型和日期类型的数据需要使用单引号括起来。

(3)作者的建议:以下规范不是必须遵循的,但能提高代码的可读性。

◆全部的保留字、Oracle的内置函数、程序包以及用户定义的数据类型都用大写。

◆过程名称应大写。

◆每行只写一条语句。

◆变量以及自建的过程或游标、触发器名称都要使用有意义的名称命名。

◆命名应使用“_”的连接方式,而不是用大小写混合的方式。

◆变量前最好加上前缀,以表示该变量的数据类型、作用范围等。

◆变量所代表的含义最好加上注释。

◆重要的和不易理解的地方都应加上注释,不仅方便自己,而且方便其他开发人员阅读。

◆逗号后面以及运算符的前后都应加空格。

遵循以上的规范可有效提高代码的可读性,某些项目会根据实际情况做出更细的相关规范,读者在开发中应注意这些规范,养成良好的编程习惯。 NKEpRJTdpn3G79ns+fUCZDGqYbtpeuFPT6z5DgSUXprolHMX8fJos5UF496NNoZX

点击中间区域
呼出菜单
上一章
目录
下一章
×