Oracle-PL/SQL中条件顺序判断

目录

一、IF语句

1.1IF-THEN 组合

1.2IF-THEN-ELSE 组合

1.3 IF-THEN-ELSIF 组合

1.4区别/注意

1.4.1IF-THEN-ELSIF 和 IF-THEN-ELSE 的区别

1.4.2注意

1.5嵌套 IF 语句

二、 CASE语句

2.1简单的CASE语句

2.2搜索型CASE语句

2.3嵌套的CASE语句

2.4区别


在 Oracle 数据库中,可以使用多种条件和顺序控制语句来实现程序流程的控制。下面将介绍PL/SQL的两类控制语句:条件控制语句和顺序控制语句。其中,条件控制语句赋予了代码能够根据条件改变执行流程的能力。IF-THEN-ELSE和CASE语句就可以实现条件控制。除了CASE语句外,还有CASE表达式,二者并不完全相同,CASE表达式在某些场合下可以取代IF和CASE语句。

一、IF语句

IF 语句用于控制程序流程,根据一个条件表达式的值来选择执行不同的代码块。它的基本语法格式如下:

if 条件1 then 要执行的语句;
...
[elsif 条件2 then 要执行的语句;]
...
[else 要执行的语句;]
end if;

那么根据上面的语法,可以将IF语句分为3种使用方法,如下表详情所示:

IF ..THEN..

END IF;

这是IF语句最简单的用法。IF和THEN之间的条件决定了在THEN和END IF之间的一系列语句是否会被执行。
如果条件部分的求值结果是FALSE或者NULL,这些代码
就不会执行。

IF ..THEN..

ELSE ..

END IF;

这种组合形式的IF语句实现了二选一的逻辑。根据对位于IF和THEN两个关键字之间的条件的求值结果,或者是THEN和ELSE之间的代码被执行,或者是ELSE和END IF之间的
代码被执行。总之,这两部分代码肯定有一个会被执行。

IF ..THEN.. ELSIF..

ELSE ..

END IF;

这是IF语句最后一个也是最复杂的使用形式。IF语句会
从一系列互斥条件中选择一个是TRUE的,然后执行该条
件关联的语句。如果是在Oracle9 i Database Release 1之后
的版本中使用这样的IF语句,应该考虑使用CASE语句。

注意:

IF 语句只能用于 PL/SQL 语言中,而不能直接用于 SQL 中。

1.1IF-THEN 组合

IF-THEN 组合是一种常见的条件控制结构,可以基于某个条件表达式的值来选择执行不同的代码块。IF-THEN 语句的基本语法格式如下:

IF condition 
THEN
     statement or block of statements;
END IF;

condition 是要判断的条件表达式,如果满足该条件,就会执行 THEN 代码块中的语句。

注意:

THEN 后面必须以 END IF 结尾,表示 IF-THEN 语句的结束。

这里举一个简单的例子来说明 IF-THEN 的用法。假设需要根据某一条件是否成立来输出不同的结果,那么可以使用 IF-THEN 语句来实现。例如,以下代码展示了如何判断一个数是否为偶数,并输出不同的结果:

DECLARE
    v_num NUMBER := 5;
BEGIN
    IF MOD(v_num, 2) = 0 THEN
        DBMS_OUTPUT.PUT_LINE('The number is even');
    END IF;
END;

在上述代码中,首先声明了一个变量 v_num 并将其赋值为 5。然后,通过 IF-THEN 语句来检查该变量是否为偶数,如果成立,则输出 The number is even

再比如一个示例,代码如下所示:

DECLARE
    x INTEGER := 7;
BEGIN
    IF x < 10 THEN
        DBMS_OUTPUT.PUT_LINE(x || ' is less than 10.');
    END IF;
END;

以上代码中,定义了一个整型变量 x,然后使用 IF-THEN 语句判断 x 是否小于 10,如果成立则输出 "7 is less than 10."。 

1.2IF-THEN-ELSE 组合

IF-THEN-ELSE 组合也是一种常见的条件控制结构,在 IF-THEN 的基础上增加了 ELSE 分支,可以在条件不成立时执行另外一段代码块。IF-THEN-ELSE 语句的基本语法格式如下:

IF condition THEN
    statement or block of statements;
ELSE
    statement or block of statements;
END IF;

如果 condition 条件表达式为真,则执行 THEN 代码块中的语句;否则将执行 ELSE 代码块中的语句。在这种情况下,ELSE 关键字后的句号(.)和 END IF 之间不需要有其他内容。

那么再举一个利用 IF-THEN-ELSE 语句来判断一个数是否为偶数的例子。与上一个IF-THEN 组合例子不同的是,在这里需要处理两种不同情况,分别输出两种不同的结果。代码示例如下:

DECLARE
    v_num NUMBER := 6;
BEGIN
    IF MOD(v_num, 2) = 0 THEN
        DBMS_OUTPUT.PUT_LINE('The number is even');
    ELSE
        DBMS_OUTPUT.PUT_LINE('The number is odd');
    END IF;
END;

在上述代码中,首先声明了一个变量 v_num 并将其赋值为 6。然后,通过 IF-THEN-ELSE 语句来检查该变量是否为偶数,如果成立,则输出 The number is even;否则输出 The number is odd

再比如这个示例,代码如下所示:

DECLARE
    score INTEGER := 87;
    grade CHAR(1);
BEGIN
    IF score >= 90 THEN
        grade := 'A';
    ELSE
        grade := 'B';
    END IF;
    DBMS_OUTPUT.PUT_LINE('The grade is ' || grade || ', and the score is ' || score || '.');
END;

以上代码中,定义了一个整型变量 score 和一个字符类型变量 grade,使用 IF-THEN-ELSE 语句根据 score 的分值来确定考试等级,并将结果保存到 grade 变量中。最后通过 DBMS_OUTPUT 输出结果:“The grade is B, and the score is 87.” 

1.3 IF-THEN-ELSIF 组合

IF-THEN-ELSIF 组合是在 IF-THEN 的基础上增加了一个或多个 ELSIF 分支,能够处理多个条件分支情况,并在每个分支中执行不同的代码块。IF-THEN-ELSIF 语句的基本语法格式如下:

IF condition1 THEN
    statement1;
ELSIF condition2 THEN
    statement2;
...
ELSIF conditionN THEN
    statementN;
ELSE
    statement or block of statements;
END IF;

其中 condition1condition2、...、conditionN 分别是要进行判断的多个条件表达式,如果第一个条件表达式不成立,则继续判断下一个条件表达式,直到所有条件都被检查过了为止。如果所有条件都不成立,则将执行 ELSE 分支中的代码块。

下面利用 IF-THEN-ELSIF 语句来实现多重分支控制的例子。

示例1.假设我们需要根据考试成绩来判断学生所处的等级,并输出相应的结果。代码示例如下:

DECLARE
    v_score NUMBER := 75;
BEGIN
    IF v_score >= 90 THEN
        DBMS_OUTPUT.PUT_LINE('Grade A');
    ELSIF v_score >= 80 THEN 
        DBMS_OUTPUT.PUT_LINE('Grade B');
    ELSIF v_score >= 70 THEN 
        DBMS_OUTPUT.PUT_LINE('Grade C');
    ELSIF v_score >= 60 THEN 
        DBMS_OUTPUT.PUT_LINE('Grade D');
    ELSE 
        DBMS_OUTPUT.PUT_LINE('Grade E');
    END IF;
END;

以上代码使用 IF-THEN-ELSIF 语句实现了根据考试成绩来判断学生所处的等级,并输出相应的结果。根据分数的不同,执行相应的分支并输出对应的成绩等级。

  • 如果 v_score 大于等于 90,则执行 IF 分支,输出 "Grade A";
  • 如果 v_score 在 80 到 89 之间,则执行第一个 ELSIF 分支,输出 "Grade B"; 依次类推,判断学生的成绩等级。
  • 如果 v_score 小于 60,则执行 ELSE 分支,输出 "Grade E"。
  • 最后输出结果为 "Grade C",因为 v_score 等于 75,符合条件 v_score >= 70 且 v_score < 80,所以执行第二个 ELSIF 分支并输出 "Grade C"。

示例2.代码如下所示:

DECLARE
    num INTEGER := 5;
BEGIN
    IF num = 0 THEN
        DBMS_OUTPUT.PUT_LINE(num || ' is zero.');
    ELSIF num > 0 THEN
        DBMS_OUTPUT.PUT_LINE(num || ' is a positive number.');
    ELSE
        DBMS_OUTPUT.PUT_LINE(num || ' is a negative number.');
    END IF;
END;

以上代码中,定义了一个整型变量 num,使用 IF-THEN-ELSIF 语句判断 num 是否是 0、正数或负数,并输出相应的结果。如果 num 不属于上述任何一种情况,则执行 ELSE 分支的语句。最终输出 "5 is a positive number."

示例3.依旧判断正负数,要求是键盘输入一个数,如果大于0,打印正数,小于0,打印负数,等于零,打印零。代码如下所示:

begin
  if &a>0 then
    dbms_output.put_line('&a 是正数');
  elsif &a<0 then
    dbms_output.put_line('&a 是负数');
  else
    dbms_output.put_line('&a 是零');
  end if;
end;

注释:

在Oracle数据库中,&符号用于参数替换功能,可以用于几乎所有版本的Oracle数据库,包括Oracle 8i、9i、10g、11g、12c等版本。在不同的版本中,&符号的使用方式可能会有所不同。

它可以用来在SQL语句中引用用户输入的参数值。当你在SQL语句中使用&符号时,Oracle会提示你输入一个值,然后将该值替换掉&符号。

例如,你可以使用如下的SQL语句来查询指定员工的工资:

SELECT salary FROM employees WHERE employee_id = &emp_id;

当执行这个SQL语句时,Oracle会提示你输入一个员工ID的值,然后将该值替换掉&emp_id。这样就能查询指定员工的工资了。

但是在使用&符号时,如果用户输入的值中包含了单引号、双引号等特殊字符,可能会导致SQL语句执行失败。为了避免这种情况,可以使用两个&符号(&&)来进行参数替换,这样Oracle会自动对特殊字符进行转义处理。例如:

SELECT * FROM employees WHERE department_name = '&&dept_name';

其实这个符号在分页查询的这篇文章中第一小节也有使用到了该符号,详情请看http://t.csdn.cn/S0G1P

示例4.从键盘输入一个员工编号,如果他的工资大于2999,打印'该员工是高薪人士';
大于1999,打印'该员工是中薪人士';大于999,打印'该员工是低薪人士';否则,打印'我不认识该员工' ;代码如下所示:

declare
v_sal number;
begin
  select sal into v_sal from emp where empno=&a;
  if v_sal>2999 then
    dbms_output.put_line(&a||'该员工是高薪人士');
  elsif v_sal>1999 then
    dbms_output.put_line(&a||'该员工是中薪人士');
  elsif v_sal>999 then
    dbms_output.put_line(&a||'该员工是低薪人士');
  else dbms_output.put_line(&a||'你不配');
  end if;
end;

1.4区别/注意

1.4.1IF-THEN-ELSIF 和 IF-THEN-ELSE 的区别

  • IF-THEN-ELSE 语句只有一个 ELSE 分支,如果条件不符合,则会执行 ELSE 分支中的代码;
  • IF-THEN-ELSIF 语句可以有多个 ELSIF 分支,可以对多个条件进行判断;
  • IF-THEN-ELSIF 主要用于多重条件判断,而 IF-THEN-ELSE 则用于单一条件情况下的处理;
  • IF-THEN-ELSIF 允许在条件不满足时再次对代码进行评估或检查,从而实现更加灵活和复杂的条件控制操作。

1.4.2注意

  • 一个IF总要有一个匹配的END IF;
  • 在 IF 语句中进行 NULL 值比较,应该使用 IS NULL 或 IS NOT NULL 运算符;
  • 在关键字END 和IF之间一定要有空格;
  • 关键字ELSIF不要加[E]。

1.5嵌套 IF 语句

IF 语句可以嵌套使用,以实现更复杂的条件逻辑。嵌套 IF 语句根据条件执行不同的代码块,每个代码块可能包含其他的嵌套 IF 语句。

IF 语句的一般格式如下:

IF condition THEN
  statement1;
  --...
ELSE
  statement2;
  --...
END IF;

其中,condition 是一个逻辑表达式,如果为真,则执行 statement1,否则执行 statement2。在嵌套 IF 语句中,statement1statement2 可以是嵌套的 IF 语句。

以下是一个简单的嵌套 IF 语句的示例:

DECLARE
   i number := 70;
BEGIN
   IF (i >= 0 AND i <= 50) THEN
      DBMS_OUTPUT.PUT_LINE('分数不及格');
   ELSE
      IF (i > 50 AND i <= 70) THEN
         DBMS_OUTPUT.PUT_LINE('分数及格');
      ELSE
         IF (i > 70 AND i <= 90) THEN
            DBMS_OUTPUT.PUT_LINE('分数良好');
         ELSE
            DBMS_OUTPUT.PUT_LINE('分数优秀');
         END IF;
      END IF;
   END IF;
END;

此示例使用了三个嵌套 IF 语句来根据给定的分数打印出相应的评价,它们依次判断分数是否不及格、及格、良好或优秀,并输出相应的信息。该示例中所有的 IF 语句都是紧密嵌套在一起的,它们可以使用 ELSEIF 关键字改写成更清晰的形式。

注意:

嵌套 IF 语句可以很方便地构造复杂的条件逻辑,但深度太深或太复杂的嵌套可能会影响代码的可读性和维护性。因此,在编写嵌套 IF 语句时,应该尽量使用合适的结构、注释和命名来使代码更加易懂。

二、 CASE语句

CASE 语句是一种强大的条件表达式,可以在一个 SQL 语句中根据一个或多个条件执行不同的操作。

2.1简单的CASE语句

它的一般格式如下:

CASE expression
   WHEN value1 THEN statement1;
   WHEN value2 THEN statement2;
   ...
   ELSE statementN;
END CASE;

其中,expression 是需要比较的表达式,value1, value2, ... 是表达式可能取到的值,如果 expression 的值等于某个 value,则执行相应的 statement;否则执行 ELSE 后面的语句。

注意:

CASE 语句中的条件顺序很重要,因为 Oracle 将按顺序执行每个 WHEN 子句,并在找到第一个匹配值后立即停止。

在没有 ELSE 的情况下,如果在所有的 WHEN 分支中都没有找到匹配的值,则该 CASE 表达式将返回空值 NULL。

一个简单的 CASE 语句示例:

DECLARE
   grade CHAR(1) := 'B';
BEGIN
   CASE grade
      WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优秀');
      WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
      WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('中等');
      WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('及格');
      ELSE DBMS_OUTPUT.PUT_LINE('不及格');
   END CASE;
END;

该示例使用 CASE 语句来根据给定的分数打印出相应的评价。它首先比较 grade 和每个可能的值,并在找到匹配值后输出相应的消息。如果没有匹配项,则输出 "不及格"。

2.2搜索型CASE语句

它的格式如下所示:

case when 条件1 then 要执行的语句;
     when 条件2 then 要执行的语句;
     ...
[else 要执行的语句;]
end case;

示例1.键盘输入一个字符,如果是大写字母,打印'大写字母';小写打印'小写字母'  ,否则打印'我不认识',代码如下:

declare
v1 char:='&a';
begin
case when V1 between 'A' and 'Z' then 
          dbms_output.put_line('大写字母');
     when V1 between 'a' and 'z' then 
          dbms_output.put_line('小写字母');
     else dbms_output.put_line('我不认识');
end case;
end;

示例2.从键盘上输入一个员工编号
如果他的名字的首字母是A,B,C,D,E之中的一个,打印1;
如果他的名字的首字母是F,G,H,I,J之中的一个,打印2;
如果他的名字的首字母是K,L,M,N,O之中的一个,打印3;
如果他的名字的首字母是P,Q,R,S,T之中的一个,打印4;
否则,打印5。

declare
v1 varchar2(20);
begin
  select substr(ename,1,1) into v1 from emp where empno=&a;
case when v1 between 'A' and 'E' then
          dbms_output.put_line(1);
     when v1 between 'F' and 'J' then
          dbms_output.put_line(2);
     when v1 between 'K' and 'O' then
          dbms_output.put_line(3);
     when v1 between 'P' and 'T' then
          dbms_output.put_line(4);
     else dbms_output.put_line(5);
 end case;
end;

2.3嵌套的CASE语句

当需要根据一个或多个条件组合来处理非常特定的情况时,可以使用嵌套 CASE 语句。它允许在一个 WHEN 子句中包含另一个 CASE 子句。

以下是一个示例,展示如何使用嵌套 CASE 语句:

DECLARE 
   score NUMBER := 88;
BEGIN 
   CASE 
      WHEN score >= 90 THEN -- 外层 CASE 子句
         CASE  
            WHEN score = 100 THEN DBMS_OUTPUT.PUT_LINE('完美成绩!'); -- 内层 CASE 子句
            ELSE DBMS_OUTPUT.PUT_LINE('优秀'); -- 内层 CASE 子句
         END CASE; 
      WHEN score >= 80 THEN DBMS_OUTPUT.PUT_LINE('良好');
      WHEN score >= 60 THEN DBMS_OUTPUT.PUT_LINE('及格');
      ELSE DBMS_OUTPUT.PUT_LINE('不及格');
   END CASE;
END;

该示例根据分数 score 输出一个相关的评价。

如果分数>= 90,则会触发外层 CASE 语句,并判断内层 CASE 子句是否成立;

如果分数>= 80,则直接输出 "良好",以此类推。

注意:CASE 子句也可以无限嵌套。

2.4区别

对于sql中的 case when 和pl/sql中的case when 有什么区别?

Ⅰ、从简单的视觉感官上可以发现的不同有如下:

  • 1.sql中的case when 是一个列(值),plsql中的case when是条件判断
  • 2.sql中的case when 内部不能加分号,plsql中的case when 每一个要执行的语句后都要加分号
  • 3.sql中的case when 以end 结尾,plsql中的case when 以end case 结尾
  • 4.sql中的case when 不能加dml,plsql中的case when 可以加dml

Ⅱ、从使用方式、范围和功能方面定义理解的不同有如下:

  • 1.语法不同:在 SQL 中,CASE WHEN 始终作为单独的语句出现,在 SELECT 语句中起到转换数据的作用;而在 PL/SQL 中,则与其他控制结构(如 IF 语句)一起使用,可以操作变量并控制程序流程。

  • 2.语句位置不同:在 SQL 中,CASE WHEN 只能用于查询过滤和结果集转换,而不能用于数据更新或删除;但在 PL/SQL 中,CASE WHEN 可以嵌套于其他表达式或语句之中,来实现更复杂的逻辑操作。

  • 3.功能不同:在 SQL 中,CASE WHEN 主要用于条件过滤、计算衍生列、排序等场景;而在 PL/SQL 中,则可以用于更高级的控制逻辑,包括比较、循环、异常处理、函数返回值等。

  • 4.返回类型不同:在 SQL 中,CASE WHEN 的返回值必须一致,且仅能返回单个值;而在 PL/SQL 中,其可以返回多种类型数据,例如字符型、数字型、日期型、表等。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

树贤森

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值