7.1.3 PL/SQL的结构

PL/SQL程序的基本单位是块(block),而PL/SQL块很明确地分三部分,其中包括声明部分、执行部分和异常处理部分。其中,声明部分以DECLARE作为开始标志,执行部分用BEGIN作为开始标志,而异常处理部分则以EXCEPTION为开始标志。其中的执行部分是必需的,而其余的两个部分则可选。下面的一段文字描述了PL/SQL块的三部分:


[DECLARE]—声明开始关键字

/这里是声明部分,包括PL/SQL中的变量、常量以及类型等/

BEGIN—执行部分开始的标志

/这里是执行部分,是整个PL/SQL块的主体部分,该部分在PL/SQL块中必须存在,可以是SQL语句或者程序流程控制语句等/

[EXCEPTION]—异常开始部分的关键字

/这里是异常处理部分,当出现异常时程序流程可以进入此处/

END;—执行结束标志


需要记住:无论PL/SQL程序段的代码量有多少,它的基本结构只是由这三部分组成。下面将以3个示例演示PL/SQL语句块的3种情况。

【示例1】只有执行体部分的结构

该示例只有执行体部分,也就是只有"BEGIN…END;"部分,该语句块中将输出一句话,这已经是最简单的执行体了。脚本如下:


01 BEGIN

02 DBMS_OUTPUT.PUT_LINE('这是执行体部分…');

03 END;

04 /


【代码解析】

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

❑第2行表示输出一句话到屏幕。

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

【执行效果】

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

7.1.3 PL/SQL的结构 - 图1

图 7.2 只有执行体的PL/SQL块

从图7.2中可以看到"SET SERVEROUTPUT ON"这么一行脚本,利用该脚本可以打开SQL*Plus的输出功能,否则会看不到输出的语句。后面的章节会频繁用到输出语句,希望读者注意这一点。

【示例2】包含声明和执行体两部分的结构

该示例除了执行体外还有声明部分,具体操作是声明一个变量,然后为变量赋值,最后输出该变量的值。脚本如下:


01 DECLARE

02 v_result NUMBER(8,2);

03 BEGIN

04 v_result:=100/6;

05 DBMS_OUTPUT.PUT_LINE('最后结果是:'||v_result);

06 END;


【代码解析】

❑第1行表示声明变量的关键字。

❑第2行表示声明一个变量,名称是v_result,数据类型为NUMBER。

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

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

【执行效果】

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

7.1.3 PL/SQL的结构 - 图2

图 7.3 有声明和执行体的示例

通常在PL/SQL编程中,变量都是存储动态得到的数据,这种情况在下一个示例中将演示。

【示例3】包含声明、执行体和异常部分的结构

该示例将从产品类型表CATEGORYINFO中查询产品类型“雨具”对应的产品类型编码,并把该编码存储到变量中,最后输出到屏幕。脚本如下:


01 DECLARE

02 v_categoryid VARCHAR2(12);

03 BEGIN

04 SELECT CATEGORYID

05 INTO V_CATEGORYID

06 FROM CATEGORYINFO

07 WHERE CATEGORYINFO.CATEGORYNAME='雨具';

08 DBMS_OUTPUT.PUT_LINE('雨具对应的编码是:'||v_categoryid);

09

10 EXCEPTION

11 WHEN NO_DATA_FOUND THEN

12 DBMS_OUTPUT.PUT_LINE('没有对应的编码!');

13 WHEN TOO_MANY_ROWS THEN

14 DBMS_OUTPUT.PUT_LINE('对应数据过多,请确认!');

15

16 END;

17 /


【代码解析】

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

❑第3~16行是执行体部分,不过异常部分是在执行体内的。

❑第4~7行表示把“雨具”对应的产品编码查询出来后放入变量v_categoryid中。

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

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

【执行效果】

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

7.1.3 PL/SQL的结构 - 图3

图 7.4 完整的PL/SQL块

SELECT…INTO…语句是PL/SQL特有的赋值语句,该语句表示的意思是SELECT后面列出要查询的字段列表,INTO后面是变量名称,它表示把查询出来的值存储到变量中。这里有两个问题需要注意,就是SELECT列名顺序和INTO后面的变量名顺序要一一对应,还有就是该类型语句每次只能返回一条记录,如果返回记录超过一条或没有返回记录都会引发异常。