记oracle里continue关键字的陷阱

这几天在写pl/sql,中间用到continue关键字,一不小心就掉进坑里。
oracle版本是11g,贴sql:

造数据:

create table address(
addr varchar2(10)
);

insert into address values('a');
insert into address values('b');
insert into address values('c');
insert into address values('d');
commit;

遍历:

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

打印结果:
1
2
3
4
5

declare
begin
    for i in (select * from address)  loop
        dbms_output.put_line(i.addr);
    end loop;
end; 

打印结果:
a
b
c
d

使用continue:

declare 
begin
    for i in 1..5 loop
        if i = 3 then
            continue;
        end if ;
        dbms_output.put_line(i);
    end loop;
end ;

打印结果:
1
2
4
5

惯性:

declare
begin
  for i in (select * from address)  loop
    if i.addr = 'c'then
       continue;
    end if;
    dbms_output.put_line(i.addr);
  end loop;
end; 

打印结果:
a
b
这里像break。

正确解法:

declare
begin
  for i in (select * from address)  loop
    if i.addr = 'c'then
        goto next_tag;
    end if;
    dbms_output.put_line(i.addr);
    <<next_tag>> null;
  end loop;
end; 

打印结果:
a
b
d
打印出continue的效果,收工。

此条目发表在数据库分类目录。将固定链接加入收藏夹。