ORALCE的几种循环

本文深入解析PL/SQL中的基本循环、WHILE循环和FOR循环的使用方法,通过具体代码实例展示了如何在数据库环境中进行循环操作。同时,文章详细介绍了嵌套循环和标号的概念,以及如何在循环控制中实现复杂逻辑。此外,提供了FOR循环的使用技巧,包括如何利用隐含定义的循环控制变量和REVERSE选项进行倒序循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写循环控制结构时,用户可以使用基本循环,WHILE循环和FOR循环等三种类型的循环语句,下面分别介绍使用这三种循环

语句的方法。

1.基本循环
下面我来举基本循环的2个例子哈
declare  
  i integer; 
begin 
  i:=0; 
  LOOP 
  Exit When(i>5); 
       Dbms_Output.put_line(i); 
       i:=i+1; 
  END LOOP; 
end; 
/
0
1
2
3
4
5

 

declare

i int:=1;
 begin
 loop
 insert into testloop values(i);
 exit when i=10;
 i:=i+1;
 end loop;
 commit;
 end;
  /
SQL> select * from testloop;

         A
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

已选择10行。

当使用基本循环时,无论是否满足条件,语句至少会被执行一次,当condition为TRUE时,会退出循环,并执行END LOOP后的

相应操作。当编写基本循环时一定要包含EXIT语句,否则会陷入死循环。另外还应该定义循环控制变量,并且在循环体内修

改循环控制变量的值

 


2.WHILE循环
基本循环至少要执行一次循环体内的语句,而对于WHILE循环来说,只有条件为TRUE时,才会执行循环体内的语句。WHILE循

环以WHILE ...LOOP开始,以END LOOP结束。

WHILE condition LOOP

           statement1;

           statement2;

           .....

END LOOP;


declare  
  i integer; 
begin 
  i:=0; 
  while i<5 loop 
     i:=i+1; 
     dbms_output.put_line(i); 
  end loop; 
end;
/

 

 declare
  i int:=1;
  begin
   while i<=10 loop
  insert into testloop values(i);
    i:=i+1;
 end loop;
 end;
 /

当condition为TRUE时,执行循环体内的语句,而当condition为FALSE或NULL时,会退出循环,并执行END LOOP后的语句。当

使用WHILE循环时,应该定义循环控制变量,并在循环体内改变循环控制变量的值。

 


3.FOR循环
当使用基本循环或WHILE循环时,需要定义循环控制变量,并且循环控制变量不仅可以使用NUMBER类型,也可以使用其他数据

类型。当使用FOR循环时,ORACLE会隐含定义循环控制变量。

FOR counter in [REVERSE] lower_bound. .upper_bound LOOP

         statement1;

         statement2;

         .......

END LOOP;


declare  
  i integer; 
begin 
  i:=0; 
  for i in 1..5 loop 
      dbms_output.put_line(i); 
  end loop; 
end; 
/

 

declare  
  i integer; 
begin
 for i in reverse 1..10 loop
 insert into testloop values(i);
  end loop;
  end;
/
reverse --相反,倒叙

 

for游标循环
create or replace procedure proc_test_cursor is
userRow test%rowtype;
cursor userRows is
select * from test;
begin
for userRow in userRows loop
dbms_output.put_line(userRow.id||’,'||userRow.Name||’,'||userRows%rowcount);
end loop;
end proc_test_cursor;
counter是循环控制变量,并且该变量由oracle隐含定义,不需要显式定义。lower_bound和upper_bound分别对应于循环控制

变量的下界值和上界值,默认情况下,当使用FOR循环时,每次循环时循环控制变量会自动增1.如果指定REVERSE选项,那么

每次循环时循环控制变量会自动减1。


4.嵌套循环和标号
嵌套循环是指在一个循环语句之中嵌入另一个循环语句,而标号(label)则用于标记嵌套块或嵌套循环,通过在嵌套循环中

使用标号,可以区分内层循环和外层循环,并且可以在内层循环中直接退出外层循环,在编写时可以用<<label_name>>定义

标号。

declare
result int;
begin
<<outer>>
for i in 1..100 loop
<<inter>>
for j in 1..100 loop
result:=i*j;
exit outer when result=1000;
exit when result=500;
end loop inter;
dbms_output.put_line(result);
end loop outer;
dbms_output.put_line(result);
 end;
  /
当执行以上PL/SQL块时,如果result=1000,那么直接退出外层循环,而result=500时只会退出内层循环。
100
200
300
400
500
600
700
800
900
500
1100
1200
1300
1400
1500
1600
1700
1800
1900
500
2100
2200
2300
2400
500
2600
2700
2800
2900
3000
3100
3200
3300
3400
3500
3600
3700
3800
3900
1000

PL/SQL 过程已成功完成。

 

 

 

在Oracle数据库中,常见的几种执行计划包括全表扫描、索引扫描、索引范围扫描和连接(Join)操作等。它们的区别如下: 1. 全表扫描(Full Table Scan): 全表扫描是指对整个表进行顺序读取,适用于需要读取大部分或全部数据的情况。它会遍历整个表,并将相关数据读入内存进行处理。全表扫描适用于数据量较小或查询条件无法使用索引的情况。 2. 索引扫描(Index Scan): 索引扫描是通过使用索引来定位符合查询条件的数据。它会使用B树或位图索引来快速定位所需的数据块,然后读取相应的数据。索引扫描适用于查询条件与索引列匹配的情况,能够快速定位所需的数据。 3. 索引范围扫描(Index Range Scan): 索引范围扫描是在索引扫描的基础上,根据查询条件的范围进行进一步的筛选。它可以通过索引的有序性,有效地定位满足范围条件的数据块,并读取相应的数据。索引范围扫描适用于查询条件涉及范围查询(如BETWEEN、大于或小于等)的情况。 4. 连接操作(Join): 连接操作是在多个表之间根据关联条件进行数据匹配和合并。它可以通过嵌套循环连接、哈希连接或合并连接等方式来执行。连接操作通常需要使用索引来加快匹配过程,以避免全表扫描。 这些不同的执行计划适用于不同的查询条件和数据访问方式。Oracle优化器会根据查询语句、表结构和统计信息等因素,选择最合适的执行计划来执行查询操作。理解不同执行计划的特点及其适用场景,可以帮助优化查询性能和提高数据库的响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值