可以参考这个 create or replace procedure csnd_loop is i number; j number; s number; begin for i in 1..50 loop for j in 1..50 loop s:=i+j; exit when s>10; dbms_output.put_line('j is '||to_char(j)); end loop; dbms_output.put_line('i is '||to_char(i)); end loop; end ;
可以结合GOTO语句和Label标签来达到目的. 或者干脆把内层循环写成一个子存储过程.
楼上正解,你可以在程序中定义一个标签,然后goto 如: begin .... <<break_point>> loop ...... if.... then goto break_point;
用goto不大好,这样写 begin <<outer>> for ....loop <<inter>> for....loop ... exit inter when ... 只退出内层循环条件 exit outer when ... 退出外循环条件 end loop inter end loop outer end ;
错误捕捉也可以考虑一下 declare err exception; begin for .. loop begin for .. loop if then raise err end if; end loop; exception when err then null; when others then null; end; end loop; end;
create or replace procedure csnd_loop is
i number;
j number;
s number;
begin
for i in 1..50 loop
for j in 1..50 loop
s:=i+j;
exit when s>10;
dbms_output.put_line('j is '||to_char(j));
end loop;
dbms_output.put_line('i is '||to_char(i));
end loop;
end ;
或者干脆把内层循环写成一个子存储过程.
如:
begin
....
<<break_point>>
loop
......
if.... then
goto break_point;
begin
<<outer>>
for ....loop
<<inter>>
for....loop
...
exit inter when ... 只退出内层循环条件
exit outer when ... 退出外循环条件
end loop inter
end loop outer
end ;
declare
err exception;
begin
for .. loop
begin
for .. loop
if then
raise err
end if;
end loop;
exception
when err then
null;
when others then
null;
end;
end loop;
end;