PL/SQL控制语句
本节要点:
- l 选择结构控制语句
- if条件控制语句
- Case语句
- l 循环结构控制语句
- 基本loop循环
- for循环
- while循环
- 嵌套循环
PL/SQL既然是面向过程的编程语言,那么它就有针对逻辑的控制语句,这些语句在日常的PL/SQL编程中起着很重要的作用,可以完成业务逻辑的框架部分。下面就来介绍PL/SQL的逻辑控制语句。
1 选择结构控制语句
1.1 If条件控制语句
条件控制语句就是根据当前某个参数的值来判断进入哪一个流程,这就好像做选择题一样,当满足某个条件时就进入对应的流程,否则进入另一个流程。
语法:
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
- l 在IF语句中,唯一一个必需的子句是IF子句。IF子句指出了要想执行THEN关键字之后列出的语句所必须满足的条件。如果这个条件计算为FALSE,并且提供了第一个ELSIF条件,那么Oracle将转到这个条件。
- l ELSIF子句用来指出在随后的条件得到满足时应该执行的另一个操作过程或一组语句。如果在ELSIF关键字之后列出的条件计算为TRUE,那么将执行在随后的THEN关键字之后列出的语句。
- l 如果在IF和ELSIF子句中提供的条件都是FALSE,将自动执行ELSE子句中提供的任何语句。
- l IF语句总是以END IF关键字结束。
注意:ELSIF子句的关键字是一个单词,不能写成“ELSEIF”或“ELSE IF”
示例:编写PL/SQL语句块,根据所购买图书的零售价,然后确定在发货时应该包括的礼品。
DECLARE
v_gift VARCHAR2(20);
c_retailprice NUMBER(5,2):=&price;
BEGIN
IF c_retailprice>56 THEN
v_gift:='FREE SHIPPING';
ELSIF c_retailprice>25 THEN
v_gift:='BOOKCOVER';
ELSIF c_retailprice>12 THEN
v_gift:='BOX OF BOOK LABELS';
ELSE
v_gift:='BOOKMARKER';
END IF;
DBMS_OUTPUT.PUT_LINE('The gift for a book costing '||c_retailprice||' is a '||v_gift);
END
示例:请按以下对应关系,根据成绩的不同,打印出对应的级别
>90 A
>80 B
>70 C
>=60 D
<60 E
DECLARE
v_grade VARCHAR2(20);
c_score NUMBER(5, 2) := &score;
BEGIN
IF c_score > 90 THEN
v_grade := 'A';
ELSIF c_score > 80 THEN
v_grade := 'B';
ELSIF c_score > 70 THEN
v_grade := 'C';
ELSIF c_score >= 60 THEN
v_grade := 'D';
ELSIF c_score < 60 THEN
v_grade := 'E';
ELSE
v_grade := 'Error put in';
END IF;
DBMS_OUTPUT.PUT_LINE('The grade is ' || v_grade);
END;
1.2 CASE语句
CASE语句同IF语句类似,也是根据条件选择对应的语句执行。
语法:
CASE selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
WHEN expressionN THEN resultN
[ ELSE resultN+1]
END;
示例:根据不同的输入打印不同的信息
DECLARE
v_grade char(1) := UPPER('&p_grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE v_grade WHEN 'A' THEN 'Excellent' WHEN 'B' THEN 'Very Good' WHEN 'C' THEN 'Good' ELSE 'No such grade' END;
DBMS_OUTPUT.PUT_LINE(' Grade: ' || v_grade || ' Appraisal: ' ||
v_appraisal);
END;
2 循环结构控制语句
希望反复执行PL/SQL块的可执行部分中的语句。创建一个循环,其中包括要执行的语句,这个循环一直重复,直到满足某个条件为止,这时将会退出循环。有三种类型的循环,你可以在PL/SQL块的可执行部分使用它们,以便重复执行一组语句:
- l 基本loop循环
- l FOR循环
- l WHILE循环
2.1 基本loop循环
语法:
LOOP
statements;
EXIT [WHEN condition];
END LOOP;
- l 基本loop循环用来执行循环语句,直到满足了EXIT子句指定的条件为止。
- l 根据指定的条件,执行循环的次数在各次执行时可能是不同的。
- l LOOP关键字指出循环的开始,END LOOP指出循环的结束。LOOP与END LOOP之间的所有语句将一直重复执行,直到退出循环为止。
- l EXIT关键字指出应该何时退出循环。
注意:因为要执行的语句之后列出了EXIT的关键字,所以循环中任何语句至少自动执行一次。这被称为“后测试”(post-test)。在执行语句之后,将评估EXIT子句中列出的任何条件,如果添加为TRUE,那么循环将会结束,然后将执行PL/SQL块的其余部分。
示例:创建一个打印一系列数字的循环。
DECLARE
v_counter NUMBER(1) := 0;
BEGIN
LOOP
v_counter := v_counter + 1;
DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||
v_counter);
EXIT WHEN v_counter = 4;
END LOOP;
END;
示例:打印1-10之间的偶数
DECLARE
v_counter NUMBER(2) := 1;
BEGIN
LOOP
if mod(v_counter, 2) = 0 then
DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||
v_counter);
end if;
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
END;
2.2 for循环
语法:
FOR counter IN[REVERSE] lower_limit..upper_limit LOOP
statements;
END LOOP;
- l FOR循环也使用一个计数器来控制循环的执行次数。
- l 计数器不是一个必须在PL/SQL块的声明部分声明的变量。在第一次执行LOOP时,将隐含声明计数器。
- l FOR子句要求用户指出计数器的上限和下限。也即,必须指定计数器的初始值(lower_limit)以及终止循环的值(upper_limit)。
- l 在每一次执行循环时,计数器都将增加1。到达定义为计数器上限的值之后,就将退出这个循环。
- l 如果在这个子句中包括了REVERSE关键字,那么计数器可以采取相反的方式(计数器减少)
示例:FOR循环使用i作为循环计数器,IN关键字指定范围
BEGIN
FOR I IN 1 .. 10 LOOP
DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' || i);
END LOOP;
END;
2.3 while循环
执行一系列语句,直到条件变为FALSE为止。与前面循环不同,如果条件最初为FALSE,那么永远不能进入这个循环。 在WHILE子句提供的条件决定了循环将在何时终止。
语法:
WHILE condition LOOP
statements;
END LOOP;
示例:PL/SQL块中使用WHILE循环来显示变量的值,直到指定的条件为FALSE为止。
DECLARE
v_counter NUMBER(2):=0;
BEGIN
WHILE v_counter<15 LOOP
DBMS_OUTPUT.PUT_LINE('The current value of the counter is '||v_counter);
v_counter:=v_counter+1;
END LOOP;
END;
示例:请打印出1~10之间的偶数(注:请用While loop的语法实现)
DECLARE
v_counter NUMBER(2) := 1;
BEGIN
WHILE v_counter <= 10 LOOP
if mod(v_counter, 2) = 0 then
DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||v_counter);
end if;
v_counter := v_counter + 1;
END LOOP;
END;
2.4 嵌套循环
任何类型的循环都可以嵌套在另一个循环中。
注意:在控制返回外部循环之前,必须完成内部循环的执行。在控制返回循环之后,只要外部循环的条件有效,就会再次执行外部循环,这包括了内部循环的执行。这个过程将一直继续,直到外部循环结束为止。
示例:PL/SQL块包含了一个嵌套的FOR循环
DECLARE
v_counter NUMBER(2):=0;
BEGIN
WHILE v_counter<3 LOOP
FOR i IN 1..2 LOOP
DBMS_OUTPUT.PUT_LINE('The current value of the FOR LOOP counter is '||i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('The current value of the WHILE counter is '||v_counter);
v_counter:=v_counter+1;
END LOOP;
END;