跳转至

PL/SQL 流程控制

本章介绍 PL/SQL 中的流程控制语句。流程控制用于决定程序的执行顺序,是实现业务判断、循环处理和批量逻辑的核心内容,在实际项目与面试中都非常重要。


1. 流程控制概述

PL/SQL 的流程控制主要分为三大类:

  • 条件控制(IF / CASE)
  • 循环控制(LOOP / WHILE / FOR)
  • 跳转与退出控制(EXIT / CONTINUE)

2. IF 语句

2.1 IF … THEN

if condition then
  statements;
end if;

示例

declare
  v_score number := 75;
begin
  if v_score >= 60 then
    dbms_output.put_line('Pass');
  end if;
end;
/

2.2 IF … THEN … ELSE

if condition then
  statements;
else
  statements;
end if;

示例

declare
  v_age number := 16;
begin
  if v_age >= 18 then
    dbms_output.put_line('Adult');
  else
    dbms_output.put_line('Minor');
  end if;
end;
/

2.3 IF … ELSIF … ELSE

if condition1 then
  statements;
elsif condition2 then
  statements;
else
  statements;
end if;

示例

declare
  v_score number := 85;
begin
  if v_score >= 90 then
    dbms_output.put_line('Excellent');
  elsif v_score >= 60 then
    dbms_output.put_line('Pass');
  else
    dbms_output.put_line('Fail');
  end if;
end;
/

3. CASE 语句

CASE 语句用于多分支判断,结构清晰,推荐在多条件场景使用


3.1 简单 CASE

case expression
  when value1 then statements;
  when value2 then statements;
  else statements;
end case;

示例

declare
  v_grade char(1) := 'B';
begin
  case v_grade
    when 'A' then dbms_output.put_line('Excellent');
    when 'B' then dbms_output.put_line('Good');
    when 'C' then dbms_output.put_line('Average');
    else dbms_output.put_line('Fail');
  end case;
end;
/

3.2 搜索 CASE(类似 IF/ELSIF)

case
  when condition1 then statements;
  when condition2 then statements;
  else statements;
end case;

示例

declare
  v_salary number := 8000;
begin
  case
    when v_salary >= 10000 then dbms_output.put_line('High');
    when v_salary >= 5000 then dbms_output.put_line('Middle');
    else dbms_output.put_line('Low');
  end case;
end;
/

4. LOOP 循环

4.1 基本 LOOP

loop
  statements;
  exit when condition;
end loop;

示例

declare
  v_cnt number := 1;
begin
  loop
    dbms_output.put_line(v_cnt);
    v_cnt := v_cnt + 1;
    exit when v_cnt > 5;
  end loop;
end;
/

5. WHILE 循环

while condition loop
  statements;
end loop;

示例

declare
  v_cnt number := 1;
begin
  while v_cnt <= 5 loop
    dbms_output.put_line(v_cnt);
    v_cnt := v_cnt + 1;
  end loop;
end;
/

6. FOR 循环(最常用)

FOR 循环语法最简洁,推荐在计数场景使用

for counter in lower_bound .. upper_bound loop
  statements;
end loop;

示例

begin
  for i in 1 .. 5 loop
    dbms_output.put_line(i);
  end loop;
end;
/

反向循环

begin
  for i in reverse 1 .. 5 loop
    dbms_output.put_line(i);
  end loop;
end;
/

7. EXIT 与 CONTINUE

EXIT

用于立即退出循环。

exit when condition;

CONTINUE(Oracle 11g+)

用于跳过本次循环,进入下一次循环。

continue when condition;

示例

begin
  for i in 1 .. 5 loop
    continue when i = 3;
    dbms_output.put_line(i);
  end loop;
end;
/

8. 流程控制中的 NULL 注意点

  • IF / CASE 中,条件结果为 NULL 时视为 不成立
  • 判断 NULL 必须使用 IS NULL
if v_val is null then
  dbms_output.put_line('Value is NULL');
end if;

9. 项目实践建议

  • 多分支判断优先使用 CASE,可读性更好
  • 计数循环优先使用 FOR
  • 循环内避免复杂 SQL,必要时使用批量处理(后续章节讲)
  • 一定设置退出条件,防止死循环

10. 本章小结(面试版)

  • IF / CASE 用于条件判断
  • CASE 比 IF/ELSIF 更清晰
  • LOOP / WHILE / FOR 用于循环控制
  • FOR 循环最常用、最安全
  • EXIT / CONTINUE 控制循环流程