7.4 PL/SQL结构控制

PL/SQL既然是面向过程的编程语言,那么它就有针对逻辑的控制语句,这些语句在日常的PL/SQL编程中起着很重要的作用,可以完成业务逻辑的框架部分。本节就介绍PL/SQL的逻辑控制语句。

7.4.1 IF条件控制语句

条件控制语句就是根据当前某个参数的值来判断进入哪一个流程,这就好像做选择题一样,当满足某个条件时就进入对应的流程,否则进入另外一个流程。

IF条件语句是编程语言中最常见的结构形式,这种结构有着一个或多个布尔表达式,一旦给出的数据使得布尔表达式成立,那么将执行该表达式对应的语句,而后继续往下执行。当布尔表达式不成立时,程序会跳过该表达式对应的语句而继续往下执行。IF语句的整体流程如图7.13所示。

7.4 PL/SQL结构控制 - 图1

图 7.13 IF条件语句流程图

在IF语句中有三种使用方式:IF…、IF…ELSE…、IF…ELSIF…。这三种方式可以根据实际的业务灵活选择。下面分别介绍这三种结构的具体使用方式。

1.IF…结构

这是IF语句中最简单的结构方式,它只有一个IF语句,如果给定的表达式不成立,那么将继续向下执行。其语法结构如下:


IF condition THEN

statements;

END IF;


当condition为TRUE的时候程序会执行IF语句对应的statements。需要注意的是,IF后面有关键词"THEN",这一点和其他编程语言中的IF语句不一样。

【示例12】IF…结构示例

示例演示如何使用IF…结构语句。该示例计算了figure_0148_0234的值并赋给变量,利用IF语句判断,如果变量的值大于10,则将其结果输出。脚本如下:


01 DECLARE

02 v_result NUMBER(10,4);

03 BEGIN

04 v_result:=SQRT(58+253+(19-9)*2);

05 IF v_result>10 THEN

06 DBMS_OUTPUT.PUT_LINE('v_result大于10结果是:'||v_result);

07 END IF;

08 DBMS_OUTPUT.PUT_LINE('IF条件语句已经执行完毕!');

09 END;

10 /


【代码解析】

❑第5~7行是一个IF条件语句,第5行的v_result>10是条件,这行代码的含义是如果v_result的值大于10,那么执行第6行的内容。第6行表示把结果输出到屏幕。第7行是该IF语句的结束标志,并且使用了“;”号。

❑第8行在IF语句执行完成后会继续执行。

以上是一个最简单的IF条件语句的示例,具体的执行效果见图7.14。

7.4 PL/SQL结构控制 - 图3

图 7.14 IF语句示例

示例演示的是条件v_result>10为TRUE时的执行结果,如果该条件为FALSE,那么最终输出结果将只有:


IF条件语句已经执行完毕!


2.IF…ELSE…结构

该类型的结构表示不是选A就是选B。该结构表示要么执行IF后面的语句,要么执行ELSE后面的语句,是二选一的模式。该结构执行完成后,程序会继续向后执行。其语法结构如下:


IF condition THEN

statements;

ELSE

statements;

END IF;


当condition为TRUE的时候程序会执行IF语句对应的statements。当condition为FALSE时会执行ELSE对应的statements。这两个条件二选一地执行。

【示例13】IF…ELSE结构示例

示例很简单,给变量赋值,判断如果变量大于20则执行其对应的语句,否则提示变量小于20。脚本如下:


01 DECLARE

02 v_if_con NUMBER(10);

03 BEGIN

04 v_if_con:=10;

05 IF v_if_con>20 THEN

06 DBMS_OUTPUT.PUT_LINE('v_if_con>20');

07 ELSE

08 DBMS_OUTPUT.PUT_LINE('v_if_con<20');

09 END IF;

10 DBMS_OUTPUT.PUT_LINE('IF…ELSE…已结束!');

11 END;

12 /


【代码解析】

❑第4行为变量v_if_con赋值,值为10。

❑第5~9行属于IF…ELSE…语句结构。第5行表示判断如果v_if_con的值大于20则执行下面的第6行语句。与第5行对应的是第7行,表示当v_if_con小于或等于20时则执行第8行的语句。

❑第9行表示该IF语句结束。

【执行效果】

在SQL*Plus中执行以上脚本,执行效果见图7.15。

7.4 PL/SQL结构控制 - 图4

图 7.15 IF…ELSE语句执行过程

3.IF…ELSIF…结构

该结构是前面两种使用方式的综合,它可以提供多个IF条件选择,当程序执行到该结构部分时,它会对每一个条件进行判断,一旦条件为TRUE,程序会执行对应的语句,而后继续判断下一个条件,直到所有条件判断完成。其语法结构如下:


01 IF condition1 THEN

02 statements;

03 ELSIF condition2 THEN

04 statements;

05 …

06 [ELSE statements;]

07 END IF;


【语法说明】

❑该结构执行的流程是当第1行的condition1为TRUE时,执行第2行的语句,而后判断第3行的condition2是否为TRUE,如果为TRUE则执行第4行的语句,如果为FALSE则跳过第4行所代表的部分,然后继续向后执行。

❑该结构中可以有多个"ELSIF"分支条件,但每个ELSIF关键词后都需要有THEN关键词。

❑第6行的ELSE部分可以存在也可以不存在,如果存在,则在前面所有条件均为FALSE时会执行其对应的程序。

【示例14】IF…ELSIF结构示例

示例演示了该结构执行过程,该示例生成一个100~200的随机数,然后利用IF语句判断该随机数所在范围。具体脚本如下:


01 DECLARE

02 v_if_con NUMBER(10);

03

04 BEGIN

05 v_if_con:=DBMS_RANDOM.VALUE(100,200);

06 IF v_if_con>100 AND v_if_con<150 THEN

07 DBMS_OUTPUT.PUT_LINE('v_if_con值在100~150的范围内');

08 ELSIF v_if_con>150 AND v_if_con<180 THEN

09 DBMS_OUTPUT.PUT_LINE('v_if_con值在150~180的范围内');

10 ELSIF v_if_con>180 AND v_if_con<200 THEN

11 DBMS_OUTPUT.PUT_LINE('v_if_con值在180~200的范围内');

12 ELSE

13 DBMS_OUTPUT.PUT_LINE('v_if_con的值是一个边缘值');

14 END IF;

15 DBMS_OUTPUT.PUT_LINE('IF…ELSE…已结束!');

16 DBMS_OUTPUT.PUT_LINE('v_if_con的值是'||v_if_con);

17 END;

18 /


【代码解析】

❑第2行声明数值类型变量v_if_con。

❑第5行表示为该变量赋值,赋值利用随机函数,利用DBMS_RANDOM.VALUE可以得到随机数值,该方式可以得到两个参数之间的38位小数。也就是说,第5行可以得到100~200之间的38位小数,不过由于声明的变量是整数类型,所以Oracle会隐式转换,自动截取整数部分,最终得到一个100~200之间的整数。

❑第6~14行是一个IF语句结构。第6行判断变量是否大于100并且小于150。当这两个条件同时满足时会执行第7行的内容。IF语句的条件中间使用了逻辑与连接。第8行同第6行一样,不过要求范围在150~180。第12行表示以上条件都失败的情况下会执行第13行。

【执行效果】

在SQL*Plus中执行以上代码,其运行过程见图7.16。

7.4 PL/SQL结构控制 - 图5

图 7.16 IF…ELSIF执行过程

4.嵌套使用IF语句

IF语句可以嵌套使用,这使得判断的条件更加精细。

【示例15】嵌套结构示例

示例演示了如何使用IF嵌套语句。该示例将首先判断产品表中产品的价格范围,并做出提示,然后在价格范围的基础上进行产品数量的判断,并给出产品数量是否满足需求的提示。具体脚本如下:


01 DECLARE

02 v_product productinfo%ROWTYPE;

03

04 BEGIN

05 SELECT*INTO v_product

06 FROM productinfo

07 WHERE productid='0240040001';

08

09 IF v_product.productprice>3000 THEN

10 DBMS_OUTPUT.PUT_LINE('该产品属于高价格产品');

11 IF v_product.quantity>50 THEN

12 DBMS_OUTPUT.PUT_LINE('该产品数量高于50,不缺货。');

13 ELSE

14 DBMS_OUTPUT.PUT_LINE('该产品数量低于50,需要补货。');

15 END IF;

16 ELSIF v_product.productprice<3000 AND v_product.productprice>1000 THEN

17 DBMS_OUTPUT.PUT_LINE('该产品属于中间价格产品');

18 IF v_product.quantity>80 THEN

19 DBMS_OUTPUT.PUT_LINE('该产品数量高于80,不缺货。');

20 ELSE

21 DBMS_OUTPUT.PUT_LINE('该产品数量低于80,需要补货。');

22 END IF;

23 ELSE

24 DBMS_OUTPUT.PUT_LINE('该产品属于低价格产品');

25 IF v_product.quantity>200 THEN

26 DBMS_OUTPUT.PUT_LINE('该产品数量高于200,不缺货。');

27 ELSE

28 DBMS_OUTPUT.PUT_LINE('该产品数量低于200,需要补货。');

29 END IF;

30 END IF;

31

32 DBMS_OUTPUT.PUT_LINE('IF…ELSE…已结束!');

33 END;

34 /


【代码解析】

❑代码看起来比较多,但结构相当简单,核心部分由两个嵌套的IF条件语句构成。

❑该示例外层使用了IF…ELSIF…的结构,内层使用了IF…ELSE的结构。

❑第2行表示声明变量,类型为记录类型。

❑第5~7行表示为该变量赋值。

❑第9~30行表示一个IF语句的结构,这是最外层的IF条件判断,它实现了判断产品价格的功能。

❑第11~15行表示第二层的IF条件语句,它判断了产品的数量,并给出提示。

【执行效果】

在SQL*Plus中执行以上脚本,执行过程见图7.17。

7.4 PL/SQL结构控制 - 图6

图 7.17 IF嵌套语句执行过程

虽然IF嵌套语句的使用可以帮我们完成更为复杂的逻辑,但不建议过多地使用该类型语句。其原因主要有两点:

1)过多的嵌套使用会影响其执行效率。

2)过多的嵌套使用会影响其阅读效果,如果允许,应尽量把其改为单一的IF条件语句。