书城计算机数据库原理及Oracle应用
18254100000014

第14章 PL/SQL编程基础(1)

6.1 PL/SQL的简介

PL/SQL(Procedure Language and SQL)是Oracle对SQL的一种扩充,它集成了程序化设计语言中的许多特性。SQL是一种存取Oracle数据库的语言,PL/SQL则将SQL的强大性和灵活性与过程化语言的过程性融为一体。PL/SQL通过增加在其他过程化语言中的结构来对SQL进行扩充,所以PL/SQL既具有对数据库存取功能比较强的特点,可以使用SQL语句中的查询语句和数据操纵语句对数据库进行操作,又具有过程化语言的条件判断、循环、出错处理等特点。PL/SQL是一个强大的事务处理语言,支持SQL中的DML语句及TCL语句(事务控制语句),但不支持DDL语句和DCL语句,不过可以使用Oracle内置包DBMSSQL执行DDL语句和DCL语句。

PL/SQL将Oracle服务器与其他工具结合起来,可以从各种工具和各种环境中访问Oracle数据库。PL/SQL不是一个独立的产品,而是嵌入在Oracle服务器和Oracle开发工具中的,所以在Oracle客户端的各种工具和服务器中都可以编写PL/SQL程序。

6.1.1 PL/SQL的优点

PL/SQL具备SQL的功能和SQL语言所不具备的过程化功能,主要优点如下。

过程化和模块化:将逻辑上相关的语句组织在一个PL/SQL程序块中。

使用过程化语言的控制结构:可以有条件地执行一系列语句、可以重复地执行一系列语句、使用显式游标处理多行查询返回结果中的每一行。

错误处理:使用EXCEPTION处理语句处理服务器的错误和用户自定义的错误。

可移植性:可以将程序移植到任何支持Oracle和PL/SQL的主机环境中。

集成:通过PL/SQL可以将前台和后台技术结合起来。

改善性能:PL/SQL可以改善一个应用的性能、减少网络的流量。

6.1.2 PL/SQL的特点

PL/SQL是一种高性能的事务处理语言,支持所有的事务控制命令(如:COMMIT、ROLLBACK等命令)。

可移植到任何Oracle的环境中,并且支持所有SQL数据操纵命令(如:SELECT、DELETE、UPDATE、INSERT等命令)。

使用Oracle所提供的特殊的PL/SQL程序包DBMSSQL可以处理SQL的DDL命令(如:CREATE、DROP、ALTER等命令)和DCL命令(如:GRANT、REVOKE等命令)。

PL/SQL支持所有SQL数据类型(如:NUMBER、VARCHAR2、DATE等类型)、SQL函数(如:SUBSTR、NEXTDAY、ROUND等函数)和各种运算符(如:IN、BETWEEN AND、LIKE等运算符)。

PL/SQL块可以被命名并存储在Oracle 服务器中,可以在另一个PL/SQL程序或SQL命令行中被存取和重用。

存储在服务器上的PL/SQL程序的安全性可以使用授权和回收权限进行管理。

注意:在PL/SQL中使用SELECT 语句的语法与标准SQL中的SELECT 语法有区别。其他PL/SQL所支持的SQL命令在标准SQL和PL/SQL中则没有区别。

标准SQL中的SELECT语法如下:

SELECT 列名,列名……

FROM 表

WHERE 条件……

而在PL/SQL中的SELECT 语法为:

SELECT 列名,列名……

INTO 变量1,变量2……

FROM 表

WHERE 条件……;

6.1.3 如何编写和编译PL/SQL程序块

因为PL/SQL是嵌入在Oracle服务器和Oracle开发工具中的,所以在Oracle客户端的各种工具和服务器中都可以编写PL/SQL程序。在客户端的PL/SQL Developer Tool开发工具、Developer6i开发工具或SQL*Plus工具中都可以编写PL/SQL块,在服务器端的PL/SQL DeveloperTool开发工具或SQL*Plus工具中也可以编写PL/SQL块。

以SQL*Plus工具为例,举例说明如何编写、编译和运行PL/SQL程序块,步骤如下:

启动SQL*Plus工具。单击“开始”→“程序”→“Oracle-OraHome92”→“Application Development”→“SQL Plus”,启动SQL*Plus工具,弹出登录窗口,要求输入用户名、口令和连接字符串。输入用户名为scott,口令为tiger,连接字符串是第4章介绍的网络服务名,输入ORCL1。此时出现SQL>提示符,表示SQL*Plus工具已连接到Oracle数据库。

在SQL>提示符下输入下列语句:

SQL>edit c:\plsqlblock1.sql

表示在C盘的根目录下编辑一个脚本文件plsqlblock1.sql,此时弹出一个窗口,询问此文件不存在,是否要建立一个新文件,选择“是”,系统启动记事本编辑此文件。

在记事本的编辑窗口中输入PL/SQL块的语句(PL/SQL块结构参见6.2.1.1节),在END结束符的下一行开头加“/”作为结束标志。

在记事本的编辑窗口中保存刚输入的PL/SQL块的语句,关闭该编辑窗口。

回到SQL>提示符,在该提示符下输入下列命令:

SQL>SET serveroutput ON

SQL>START c:\plsqlblock1.sql

首先激活dbmsoutput包,以便在PL/SQL块中可以引用dbmsoutput包将变量的值输出在屏幕上,接着编译和运行该PL/SQL块,查看该块是否有语法错误和逻辑错误。

如果显示已成功运行的提示信息,说明上述PL/SQL块没有语法错误。可以将PL/SQL块的运行结果输出,或以别的形式验证块是否有逻辑错误。如果显示编译有错,应该检查PL/SQL块的语句和语法,然后重新编译,直到编译成功为止。

6.2 PL/SQL 程序结构

6.2.1 块结构

PL/SQL是块结构化的语言。组成一个PL/SQL程序的单元是逻辑块(BLOCK)。PL/SQL程序由一个或多个块组成。这些块可以顺序出现、也可以相互嵌套。

6.2.1.1 块的基本结构

每一个块分成三部分,其基本结构如下:

[DECLARE]

——说明部分(可选的)

BEGIN

——语句执行部分(必需的)

[EXCEPTION]

——出错处理程序(可选的)

END;

/

其中:只有语句执行部分是必需的,其他两部分都是可选的。

说明部分包含在块的可执行部分中要用到的所有变量、常量、数据类型、游标和用户定义的错误等对象的定义。以关键字DECLARE开始,所有对象在使用之前必须定义。假如不需要定义变量等,可省略这部分。

执行部分是PL/SQL块中必需的,定义块要完成的处理工作。以关键字BEGIN开始。可以包含操作数据库数据的SQL语句和操作块中数据的PL/SQL语句。

出错处理部分是一个可选部分,指定在执行部分中发生了错误和非正常条件时执行的动作。定义了对各种错误的处理方法,由可执行语句去处理每一个错误。

注意:各部分的关键字DECLARE、BEGIN、EXCEPTION不必用分号(;)结束,而END和所有其他的PL/SQL语句都要求以分号(;)结束。分号(;)是PL/SQL中语句的分界符。一行的注释可以用两个连接符(——)开头,一段语句的注释用/*和*/包围。

6.2.1.2 嵌套块结构

PL/SQL块中可以包含子块,子块可位于PL/SQL块中的任何部分。子块也可是一条PL/SQL命令。

例6-1 举例说明块的嵌套结构。

[DECLARE]

……/*说明部分*/

BEGIN

……/*主块的语句执行部分*/

BEGIN

……/*子块的语句执行部分*/

[EXCEPTION]

……/*子块的出错处理程序*/

END

[EXCEPTION]

……/*主块的出错处理程序*/

END