Oracle 循环中continue、exit、return的用法区别

613 阅读2分钟

    在一次存储过程问题排查中,发现需要对于进入for循环的数据再增加一层校验,如果不满足执行条件,则不执行for循环内的脚本。

    之前使用if的方式,来判断是否执行某段脚本。对于脚本少的情况影响不大,但是这次存储过程的脚本较多,在大段的脚本上添加if与end if即不方便也容易出错。

    所以使用continue的方式,在不满足执行条件时,跳出本次循环,执行下次循环。

    另外再对比exit与return用法效果。

Continue:本次循环continue之后的代码不执行,跳出本次循环,执行本循环的下一个循环;

Exit:跳出本循环,执行之后的内容;如果存在上一级循环,则会执行上一级循环的下一次循环;

Return:直接跳出存储过程或函数,即结束。

一、单层循环样例

Continue

declare
 
begin
  for cu in 1..10 loop
      if cu = 3 then
         continue;
         --exit;
      end if;
      dbms_output.put_line('the cu value is :'||cu);
  end loop;
  dbms_output.put_line('end loop');
end;

执行结果:


Exit

declare
 
begin
  for cu in 1..10 loop
      if cu = 3 then
         --continue;
         exit;
      end if;
      dbms_output.put_line('the cu value is :'||cu);
  end loop;
  dbms_output.put_line('end loop');
end;

执行结果:


Return

declare
 
begin
  for cu in 1..10 loop
      if cu = 3 then
         --continue;
         --exit;
         return;
      end if;
      dbms_output.put_line('the cu value is :'||cu);
  end loop;
  dbms_output.put_line('end loop');
end;

执行结果:


二、双层循环样例

Continue

declare
 
begin
  
for cu1 in 1..3 loop
  for cu2 in 11..15 loop
      if cu2 = 13 then
         continue;
         --exit;
         --return;
      end if;
      dbms_output.put_line('the second loop cu value is :'||cu1||':'||cu2);
  end loop;
  dbms_output.put_line('end the second loop');
  dbms_output.put_line('the first loop cu1 value is :'||cu1);
 
end loop;
dbms_output.put_line('end the first loop');
 
end;

执行结果:


Exit

declare
 
begin
  
for cu1 in 1..3 loop
  for cu2 in 11..15 loop
      if cu2 = 13 then
         --continue;
         exit;
         --return;
      end if;
      dbms_output.put_line('the second loop cu value is :'||cu1||':'||cu2);
  end loop;
  dbms_output.put_line('end the second loop');
  dbms_output.put_line('the first loop cu1 value is :'||cu1);
 
end loop;
dbms_output.put_line('end the first loop');
 
end;

执行结果:


Return

declare
 
begin
  
for cu1 in 1..3 loop
  for cu2 in 11..15 loop
      if cu2 = 13 then
         --continue;
         --exit;
         return;
      end if;
      dbms_output.put_line('the second loop cu value is :'||cu1||':'||cu2);
  end loop;
  dbms_output.put_line('end the second loop');
  dbms_output.put_line('the first loop cu1 value is :'||cu1);
 
end loop;
dbms_output.put_line('end the first loop');
 
end;

执行结果:


三、扩展:oracle的三类循环写法

for ...... loop
......
end loop;
 
while ...... Loop
......
end loop;
Loop 
......
Exit when
......
End loop

参考资料:

www.cnblogs.com/fuchangmeng…

jingyan.baidu.com/article/c27…