PL/SQL条件控制
在本章中,我们将讨论PL/SQL中的条件。决策结构要求程序员指定要由程序评估或测试一个或多个条件,以及如果条件确定为真(true),则执行对应的语句块,以及可选地,如果执行其他语句条件被确定为假(false)。
以下是大多数编程语言中的典型条件(即决策)结构的一般形式 -
PL/SQL编程语言提供以下类型的决策语句。请点击以下链接来查看它们的细节。
语句 | 说明 |
if-then语句 | IF语句将条件与关键字THEN和END IF包含语句序列相关联。如果条件为true,则语句将被执行,如果条件为false或NULL,则IF语句不会执行任何操作。 |
if-then-else语句 | IF语句添加了关键字ELSE,后跟一个备选的语句序列。如果条件为false或NULL,则只有备选的语句序列被执行。它只执行语句序列中的任一个。 |
if-then-elsif语句 | 它允许选择几种备选方案。 |
case语句 | 像IF语句一样,CASE语句选择要执行的一个语句序列。但是,要选择序列,CASE语句使用选择器而非多个布尔表达式。选择器是一个表达式,它的值用于选择几种备选方案之一。 |
搜索CASE语句 | 被搜索CASE语句没有选择器,它的WHEN子句将包含产生布尔值的搜索条件。 |
嵌套if-then-else语句 | 可以在一个IF-THEN或IF-THEN-ELSIF语句中使用另一个IF-THEN或IF-THEN-ELSIF语句。 |
PL/SQL IF-THEN语句
if-then语句是IF控制语句中最简单的形式,经常用于决策和更改程序执行的控制流程。
IF语句将条件与关键字THEN和END IF所包含的语句序列相关联。如果条件为TRUE,则语句将被执行,如果条件为FALSE或NULL,则IF语句块不会执行任何操作。
语法
IF-THEN语句的语法是 -
IF condition THEN
S;
END IF;
在这里,condition是布尔或关系条件,S是简单或复合语句。 以下是IF-THEN语句的一个例子 -
IF (a <= 20) THEN
c:= c+1;
END IF;
如果布尔表达式条件求值为true,则if语句中的代码块将被执行。如果布尔表达式求值为false,则if语句结束后的第一组代码(在结束结束if之后)将被执行。
流程图
示例 - 1
下面来看看一个例子来理解上面的执行流程
DECLARE
a number(2) := 10;
BEGIN
a:= 10;
-- check the boolean condition using if statement
IF( a < 20 ) THEN
-- if condition is true then print the following
dbms_output.put_line('a is less than 20 ' );
END IF;
dbms_output.put_line('value of a is : ' || a);
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果 -
a is less than 20
value of a is : 10
PL/SQL procedure successfully completed.
示例 - 2
我们在PL/SQL变量类型中创建了一个表和几个记录,参考以下语句操作上述表和数据
DECLARE
c_id customers.id%type := 1;
c_sal customers.salary%type;
BEGIN
SELECT salary
INTO c_sal
FROM customers
WHERE id = c_id;
IF (c_sal <= 2000) THEN
UPDATE customers
SET salary = salary + 1000
WHERE id = c_id;
dbms_output.put_line ('Salary updated');
END IF;
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果 -
Salary updated
PL/SQL procedure successfully completed.
PL/SQL IF-THEN-ELSE语句
IF-THEN语句的序列之后的ELSE语句的可选序列,ELSE语句块在IF条件为FALSE时执行。
语法
IF-THEN-ELSE语句的语法是
IF condition THEN
S1;
ELSE
S2;
END IF;
其中,S1和S2是不同的语句序列。 在IF-THEN-ELSE语句中,当测试条件为TRUE时,执行语句S1并跳过S2; 当测试条件为FALSE时,则跨过S1并执行语句S2中的语句块。 例如
IF color = red THEN
dbms_output.put_line('You have chosen a red car')
ELSE
dbms_output.put_line('Please choose a color for your car');
END IF;
如果布尔表达式条件求值为真,则将执行if-then代码块,否则将执行else代码块。
流程图
示例
请看下面一个例子,演示如何使用
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
a number(3) := 100;
BEGIN
-- check the boolean condition using if statement
IF( a < 20 ) THEN
-- if condition is true then print the following
dbms_output.put_line('a is less than 20 ' );
ELSE
dbms_output.put_line('a is not less than 20 ' );
END IF;
dbms_output.put_line('value of a is : ' || a);
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果
a is not less than 20
value of a is : 100
PL/SQL 过程已成功完成。
PL/SQL IF-THEN-ELSIF语句
在PL/SQL中,IF-THEN-ELSIF语句允许在多种选择之间进行选择。IF-THEN语句后面可以有一个可选的ELSIF ... ELSE语句。 ELSIF子句可用于添加附加条件。
使用IF-THEN-ELSIF语句时需要注意几点。
需要看清楚,它是ELSIF,并不是ELSEIF。
IF-THEN语句可以有零个或一个ELSE,它必须在ELSIF之后。
IF-THEN语句可以有零或多个ELSIF,它们必须在ELSE之前。
一旦有一个ELSIF条件测试成功,其余的ELSIF或ELSE都不会再被测试。
语法
PL/SQL编程语言中的IF-THEN-ELSIF语句的语法是
IF(boolean_expression 1)THEN
S1; -- Executes when the boolean expression 1 is true
ELSIF( boolean_expression 2) THEN
S2; -- Executes when the boolean expression 2 is true
ELSIF( boolean_expression 3) THEN
S3; -- Executes when the boolean expression 3 is true
ELSE
S4; -- executes when the none of the above condition is true
END IF;
示例
参考以下示例代码
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
a number(3) := 100;
BEGIN
IF ( a = 10 ) THEN
dbms_output.put_line('Value of a is 10' );
ELSIF ( a = 20 ) THEN
dbms_output.put_line('Value of a is 20' );
ELSIF ( a = 30 ) THEN
dbms_output.put_line('Value of a is 30' );
ELSE
dbms_output.put_line('None of the values is matching');
END IF;
dbms_output.put_line('Exact value of a is: '|| a );
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果
None of the values is matching
Exact value of a is: 100
PL/SQL 过程已成功完成。
PL/SQL CASE语句
像IF语句一样,CASE语句选择要执行的一个语句序列。 但是,要选择序列,CASE语句使用选择器而不是多个布尔表达式。选择器是一个表达式,其值用于选择几种替代方法之一。
句法
PL/SQL中的case语句的语法是
CASE selector
WHEN 'value1' THEN S1;
WHEN 'value2' THEN S2;
WHEN 'value3' THEN S3;
...
ELSE Sn; -- default case
END CASE;
流程图
实例
请参考以下示例代码
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
grade char(1) := 'A';
BEGIN
CASE grade
when 'A' then dbms_output.put_line('Excellent');
when 'B' then dbms_output.put_line('Very good');
when 'C' then dbms_output.put_line('Well done');
when 'D' then dbms_output.put_line('You passed');
when 'F' then dbms_output.put_line('Better try again');
else dbms_output.put_line('No such grade');
END CASE;
END;
/
-- 成绩 A B C D E
declare
g char(1) := 'E';
begin
case g
when 'A' then dbms_output.put_line('特等生');
when 'B' then dbms_output.put_line('良好');
when 'C' then dbms_output.put_line('及格');
else dbms_output.put_line('未及格');
end case;
end;
当上述代码在SQL提示符下执行时,它会产生以下结果
Excellent
PL/SQL 过程已成功完成。
PL/SQL可搜索CASE语句
可搜索的CASE语句没有选择器,语句中的WHEN子句包含给出布尔值的搜索条件。
语法
PL/SQL中可搜索的case语句的语法是
CASE
WHEN selector = 'value1' THEN S1;
WHEN selector = 'value2' THEN S2;
WHEN selector = 'value3' THEN S3;
...
ELSE Sn; -- default case
END CASE;
流程图
实例
请参考以下示例代码
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
grade char(1) := 'B';
BEGIN
case
when grade = 'A' then dbms_output.put_line('Excellent');
when grade = 'B' then dbms_output.put_line('Very good');
when grade = 'C' then dbms_output.put_line('Well done');
when grade = 'D' then dbms_output.put_line('You passed');
when grade = 'F' then dbms_output.put_line('Better try again');
else dbms_output.put_line('No such grade');
end case;
END;
declare
age int := 25;
begin
case
when age < 20 and age > 10 then dbms_output.put_line('年轻');
when age < 30 and age > 25 then dbms_output.put_line('壮年');
when age < 40 then dbms_output.put_line('中年');
else
dbms_output.put_line('未知');
end case;
end;
当上述代码在SQL提示符下执行时,它会产生以下结果
Very good
PL/SQL 过程已成功完成。
PL/SQL嵌套IF-THEN-ELSE语句
在PL/SQL编程中嵌套IF-ELSE语句总是合法的,也就是说可以在一个IF或ELSE IF语句中使用另一个IF或ELSE IF语句。
语法
PL/SQL中嵌套IF-ELSE语句的语法是
IF( boolean_expression 1)THEN
-- executes when the boolean expression 1 is true
IF(boolean_expression 2) THEN
-- executes when the boolean expression 2 is true
sequence-of-statements;
END IF;
ELSE
-- executes when the boolean expression 1 is not true
else-statements;
END IF;
实例
请参考以下示例代码
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
a number(3) := 100;
b number(3) := 200;
BEGIN
-- check the boolean condition
IF( a = 100 ) THEN
-- if condition is true then check the following
IF( b = 200 ) THEN
-- if condition is true then print the following
dbms_output.put_line('Value of a is 100 and b is 200' );
END IF;
END IF;
dbms_output.put_line('Exact value of a is : ' || a );
dbms_output.put_line('Exact value of b is : ' || b );
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果
Value of a is 100 and b is 200
Exact value of a is : 100
Exact value of b is : 200
PL/SQL 过程已成功完成。
PL/SQL循环
在本章中,我们将讨论和学习PL/SQL中的循环。当需要执行一段代码多次时可能会出现以下这种情况:一般来说,语句依次执行,首先执行函数中的第一个语句,然后执行第二个语句,依此类推。
编程语言提供了允许更复杂的执行路径的各种控制结构。
循环语句允许多次执行一个语句或一组语句,以下是大多数编程语言中循环语句的一般流程图
PL/SQL提供以下类型的循环来处理循环需求。可点击以下链接查看每个循环类型如何使用。
循环类型 | 描述 |
PL/SQL基本LOOP循环 | 在这个循环结构中,语句序列包含在LOOP和END LOOP语句之间。在每次迭代时,执行语句序列,然后在循环顶部继续控制。 |
PL/SQL while循环 | 当给定条件为真时,重复一个语句或一组语句。它在执行循环体之前测试状态。 |
PL/SQL for循环 | 多次执行一系列语句,并缩写管理循环变量的代码。 |
PL/SQL基本循环语句
基本循环结构包含LOOP和END LOOP语句之间的语句序列。通过每次迭代,执行语句序列,然后在循环顶部继续控制。
语法
PL/SQL编程语言的基本循环语法是
LOOP
Sequence of statements;
END LOOP;
这里,语句序列(Sequence of statements;)可以是单个语句或一组语句。需要一个EXIT语句或一个EXIT WHEN语句来中断循环。
示例
通过下面一个简单的示例来演示LOOP语句如何使用
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
x number := 10;
BEGIN
LOOP
dbms_output.put_line(x);
x := x + 10;
IF x > 50 THEN
exit;
END IF;
END LOOP;
-- after exit, control resumes here
dbms_output.put_line('After Exit x is: ' || x);
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果
10
20
30
40
50
After Exit x is: 60
PL/SQL 过程已成功完成。
可以使用EXIT WHEN语句来代替EXIT语句
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
x number := 10;
BEGIN
LOOP
dbms_output.put_line(x);
x := x + 10;
exit WHEN x > 50;
END LOOP;
-- after exit, control resumes here
dbms_output.put_line('After Exit x is: ' || x);
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果
10
20
30
40
50
After Exit x is: 60
PL/SQL 过程已成功完成。
PL/SQL while...loop循环语句
只要给定条件为真,PL/SQL编程语言中的WHILE LOOP语句重复执行目标语句。
语法
WHILE LOOP语句的语法如下
WHILE condition LOOP
sequence_of_statements
END LOOP;
示例
以下是有关WHILE LOOP语句的应用示例
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
a number(2) := 10;
BEGIN
WHILE a < 20 LOOP
dbms_output.put_line('value of a: ' || a);
a := a + 1;
END LOOP;
END;
/
PL/SQL for...loop循环语句
FOR LOOP语句是一种重复控制结构,可以有效地编写一个需要执行特定次数的循环。
语法
下面演示如何使用FOR LOOP语句
FOR counter IN initial_value .. final_value LOOP
sequence_of_statements;
END LOOP;
以下是FOR循环中的控制流程
首先执行初始步骤,只执行一次。 此步骤允许声明和初始化任何循环控制变量。
接下来,评估条件,即initial_value .. final_value。如果结果为TRUE,则执行循环的主体。如果结果为FALSE,则循环主体不执行,并且控制流程跳转到for循环之后的下一个语句。
执行for循环的主体后,增加或减少计数器变量的值。
现在再次评估条件。 如果计算为TRUE,则执行循环并且该过程重复(循环体,然后增量步,然后再次调节)。 条件变为FALSE后,FOR-LOOP终止。
以下是PL/SQL for循环的一些特殊特性
循环变量或计数器的initial_value和final_value可以是文字,变量或表达式,但必须对数字求值。 否则,PL/SQL引发预定义的异常VALUE_ERROR。
initial_value不必为1; 但是,循环计数器增量(或减量)必须为1。
PL/SQL允许在运行时动态地确定循环范围。
示例
以下示例演示如何使用for循环
SET SERVEROUTPUT ON SIZE 100000;
DECLARE
a number(2);
BEGIN
FOR a in 10 .. 20 LOOP
dbms_output.put_line('value of a: ' || a);
END LOOP;
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
value of a: 20
PL/SQL 过程已成功完成。
反转FOR LOOP语句
默认情况下,迭代从初始值到最终值,通常从下限到上限。但是也可以使用REVERSE关键字来反转这个顺序。 在这种情况下,迭代以另一种方式进行。每次迭代后,循环计数器递减。
但是,必须以升序(不降序)顺序写入范围界限。 以下程序说明了这一点
SET SERVEROUTPUT ON SIZE 100000;
DECLARE
a number(2) ;
BEGIN
FOR a IN REVERSE 10 .. 20 LOOP
dbms_output.put_line('value of a: ' || a);
END LOOP;
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果
value of a: 20
value of a: 19
value of a: 18
value of a: 17
value of a: 16
value of a: 15
value of a: 14
value of a: 13
value of a: 12
value of a: 11
value of a: 10
PL/SQL 过程已成功完成。
循环控制语句
循环控制语句从其正常顺序更改执行。当执行离开范围时,在该范围内创建的所有自动对象都将被销毁。
PL/SQL支持以下控制语句。标签循环也有助于控制环外的控制。点击以下链接查看它们的详细信息。
PL/SQL exit语句
PL/SQL编程语言中的EXIT语句有以下两种用法 -
当循环中遇到EXIT语句时,循环将立即终止,程序控制在循环之后的下一个语句处恢复。
如果使用嵌套循环(即在另一个循环中有一个循环),则EXIT语句将停止执行最内循环,并在块之后开始执行下一行代码。
语法
PL/SQL中EXIT语句的语法如下:
EXIT;
流程图
示例
下面演示如何使用exit语句,参考以下示例代码 -
SET SERVEROUTPUT ON SIZE 99999;
DECLARE
a number(2) := 10;
BEGIN
-- while loop execution
WHILE a < 20 LOOP
dbms_output.put_line ('value of a: ' || a);
a := a + 1;
IF a > 15 THEN
-- terminate the loop using the exit statement
EXIT;
END IF;
END LOOP;
END;
/
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
PL/SQL 过程已成功完成。
EXIT WHEN语句
EXIT-WHEN语句允许评估WHEN子句中的条件。如果条件为:TRUE,则循环完成,并且在END LOOP之后立即将控制传递给语句。
以下是EXIT WHEN语句的两个重点 -
在条件为真之前,EXIT-WHEN语句的作用就像一个NULL语句,除了评估条件,并且不终止循环。
循环内的语句必须改变条件的值。
语法
PL/SQL中的EXIT WHEN语句的语法如下:
EXIT WHEN condition;
EXIT WHEN语句替换if-then与EXIT语句一起使用的条件语句。
示例
SET SERVEROUTPUT ON SIZE 99999;
DECLARE
a number(2) := 10;
BEGIN
-- while loop execution
WHILE a < 20 LOOP
dbms_output.put_line ('value of a: ' || a);
a := a + 1;
-- terminate the loop using the exit when statement
EXIT WHEN a > 15;
END LOOP;
END;
/
PL/SQL continue语句
CONTINUE语句导致循环跳过其主体的剩余部分,并在重新执行之前立即重新测试其状态。换句话说,它强制循环的下一次迭代发生,跳过其间(之后)的任何代码。
语法
CONTINUE语句的语法如下
CONTINUE;
流程图
示例
以下示例演示如何使用continue语句,参考代码
SET SERVEROUTPUT ON SIZE 99999;
DECLARE
a number(2) := 10;
BEGIN
-- while loop execution
WHILE a < 20 LOOP
dbms_output.put_line ('value of a: ' || a);
a := a + 1;
IF a = 15 THEN
-- skip the loop using the CONTINUE statement
a := a + 1;
CONTINUE; -- 之后的代码跳过,回到条件开始重新迭代
END IF;
END LOOP;
END;
/