欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

oracle中嵌套循环跳出内部循环体实例

程序员文章站 2022-05-10 16:41:37
...

在很多数据库都有循环这种简单的语法,我们oracle中也不例外,下面我们先来看一个oracel中的嵌套循环再以实例2来详解说明跳出内部循环体.

在很多数据库都有循环这种简单的语法,我们oracle中也不例外,下面我们先来看一个oracel中的嵌套循环再以实例2来详解说明跳出内部循环体.

代码如下 复制代码

PROCEDURE test(P_MSG out VARCHAR2) is
begin
>
for i in 1 .. 10 loop
>
for j in 1 .. 5 loop
dbms_output.put_line('i:' || i || ' j :' || j);
EXIT jloop when j = 3;
end loop jloop;
end loop illoop;
end;

实例2

代码如下 复制代码

declare
result int;
begin
>
for i in 1..100 loop
>
for j in 1..100 loop
result:=i*j;
exit outer when result=1000;
exit when result=500;
end loop inner;
dbms_output.put_line(result);
end loop outer;
dbms_output.put_line(result);
end;

上面说明

①i=1
j从1取到100,result都不会等于500,故内循环完全执行。即下一个外循环之前的result应该是1*100(i=1,j=100)。
②接下来:i=2,类似i=1,result ③一直到:i=5,result=500的时候内循环也执行完了。
④当i=6,7,8,9,i*j永远不会等于500,故每次内循环都执行完毕才打印result,因此result依次等于600,700,800,900.
⑤当i=10,内循环j=50的时候,result=500,这时候(exit when result=500),所以跳出本次内循环,接着执行下一个外循环i=11.
⑥……等等 往下你可以思考一下,有哪些i会使内循环提前跳出?

对,很聪明,当i是500的约数的时候,内循环中会产生等于500的result,所以会提前跳出内循环。

同理,当i*j=1000的时候跳出外循环,也就是整个循环。最早发生的应该是i=10,j=100,但i=10的时候,不等j取到100的时候result会取到500(i=10,j=50),因此这个被pass掉。
这种情况也要求i是1000的约数,由于500 因此我们要找的是能整除1000而不能整除500的自然数里面最小的那个!
于是,i=40!
于是,当i=40,j=25的时候会跳出循环。上一个打印的时候i=39,j=100.

其实嵌套循环就是循环里面套循环,这个只不过是加上了循环控制标识>和>(放在for前面,用于标记是哪个循环,里面的名字可以随便起),这样一来,我们就可以通过exit outer/inner…语句来控制跳出哪个循环了。


oracle的循环讲解

Oracle嵌套循环(Nested Loo, NL):

a) 如果driving row source(外部表)比较小,并且在inner row source(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。

b) NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。

哈希连接(Hash Join, HJ):

a) 这种方法是在Oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。

b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。

c) 只能用于等值连接中

笛卡儿乘积(Cartesian Product)

当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量使用笛卡儿乘积

相关标签: oracle 嵌套循环