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