ORACLE 第 5 章

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; 
/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑石课堂

请给我打钱!!!谢谢,不客气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值