记oracle里continue关键字的陷阱

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

造数据:


1

2

3

4

5

6

7

8

9


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;

遍历:


1

2

3

4

5

6


declare

begin

for i in 1..5 loop

dbms_output.put_line(i);

end loop;

end ;

打印结果:
1
2
3
4
5


1

2

3

4

5

6


declare

begin

for i in (select * from address) loop

dbms_output.put_line(i.addr);

end loop;

end;

打印结果:
a
b
c
d

使用continue:


1

2

3

4

5

6

7

8

9


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

惯性:


1

2

3

4

5

6

7

8

9


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。

正确解法:


1

2

3

4

5

6

7

8

9

10


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的效果,收工。

时间: 2024-12-02 00:42:22

记oracle里continue关键字的陷阱的相关文章

在ORACLE里用存储过程定期分割表

Oracle数据库里存放着各种各样的数据,其中有一些数据表会随着时间的推移,越来越大.如交友聊天的日志. 短信收发的日志.生产系统的日志.动态网站发布系统的日志等等.这样的信息又和时间紧密相关,有没有办法 让这些日志表能到时间自动分割成历史年月(如log200308,log200309)的表呢? 请看看我用存储过程定期分割表的 方法吧. 一.问题的引出 1.初学数据库时只知道用delete来删除表里的数据.但在Oracle数据库里,大量delete记录后,并不能释放表 所占用的物理空间,这里面有

数据库-navicat for oracle里报表和计划这两个是按钮是什么功能?

问题描述 navicat for oracle里报表和计划这两个是按钮是什么功能? 开发"> 表 查看当前数据库的表 试图 相当于临时表 函数 在Oracle里写的程序 数据泵 导入导出数据 查询 写SQL语句 报表 ? 计划 ? 模型 创建数据库模型,可以形成SQL 解决方案 报表 对数据进行统计 计划 定时的任务

oracle10-关于oracle的continue

问题描述 关于oracle的continue 在不支持continue的oracle版本(11G之前),怎么实现continue功能呢?求大神解惑. 解决方案 http://blog.csdn.net/topwqp/article/details/47169801 参考下这个

Java中的break和continue关键字的使用方法总结_java

一.作用和区别   break的作用是跳出当前循环块(for.while.do while)或程序块(switch).在循环块中的作用是跳出当前正在循环的循环体.在程序块中的作用是中断和下一个case条件的比较.   continue用于结束循环体中其后语句的执行,并跳回循环程序块的开头执行下一次循环,而不是立刻循环体.  二.其他用途   break和continue可以配合语句标签使用. 这个都很简单,下面给个综合实例,看看就明白 了: /** * Created by IntelliJ I

Oracle里去掉字符串空格

Oracle里去掉字符串空格 去除两侧空间 SQL> select trim(' 123 ') from dual; TRI --- 123 SQL> Oracle里去掉右侧字符串空格(RTRIM) select rtrim(' 123 ') from dual; SQL> select ltrim(' 123 ') from dual; LTRI ---- 123 SQL>

Oracle里批量更新列数据的问题

问题描述 各位大侠好,现在遇到一个问题求教Oracle里有两张表,一张人员信息表,里面包含了人员和各项基本信息,其中包括了银行代码和银行卡号两个字段.另一张表是记录的银行代码和所有人的银行卡号.现在人员表里只存了银行卡号,我想把银行代码先根据卡号从银行表里查出来,再写入到人员表里的银行代码字段.使用了游标,发现效率很低,约20W条数据,已经执行一个多小时了,各位高手有没有其他更好的办法问题补充首先感谢楼上的兄弟.我现在用的就是方法一,但是银行表里会有重复的银行卡号,要取重复的卡号中银行代码较大的

Java里volatile关键字是什么意思_java

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法 或者 代码块.

在Oracle里使用RAID

RAID,即廉价磁盘冗余阵列,是一种将相同的数据放在多个硬盘上不同位置的方法.RAID有很多不同的类型(叫做RAID"级"),每种类型都有其相对的优势和劣势.   对于Oracle9i的数据库而言,很多RAID方案都不具备Oracle数据库所要求的高性能.大多数Oracle的专家都会选择一种结合了镜像(mirroring)和数据块分段(block-level striping)的RAID方案. 要注意的是,使用RAID并不能防止磁盘灾难性的故障,这一点极其重要.Oracle专门推荐将所

在Oracle里设置访问多个SQL Server

1.在安装了ORACLE9i Standard Edition或者ORACLE9i Enterprise Edition的windows机器上(IP:192.168.0.2), 产品要选了透明网关(Oracle Transparent Gateway)里访问Microsoft SQL Server数据库 $ORACLE9I_HOME\tg4msql\admin下新写initpubs.ora和initnorthwind.ora配置文件. initpubs.ora内容如下: HS_FDS_CONNE