Oracle中的循环

本文详细介绍了Oracle数据库中的四种主要循环结构(loop,while,for,goto),展示了它们的语法、实例,并比较了continue和return在控制循环流程方面的差异。

一.循环

  在所有的编程语言中,循环都是一个非常重要的语法,掌握循环,是程序员必不可少的工具。

  在Oracle中,常用的有四种循环,loop循环,while循环,for循环和goto循环,在本篇文章中,会向大家分别介绍这几种循环的语法,实例和基本使用注意等。(均为匿名块或有名块)

1. loop循环

  loop经常会与exit when关键字结合使用,具体语法如下:

1

2

3

4

5

loop    --开始循环的标志

  loop_body;   --要执行的语句           

  exit when 条件;  --退出循环的条件

  [loop_body;]   --要执行的语句

end loop;    --结束循环的标志

循环输出数值:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

1. 循环打印0-100之间的所有偶数,并求和

declare

var_num int:=0;

var_sum int:=0;

begin

  loop

    dbms_output.put_line(var_num);

    var_sum := var_sum + var_num;

    var_num := var_num + 2;

    exit when var_num >100;

  end loop;

  dbms_output.put_line(var_sum);

end;

2. 循环打印1+2+3+4+...+10 = 55这个式子和结果

declare

var_num int:= 1;

var_sum int:= 0;

begin

  loop

    dbms_output.put(var_num);

    var_sum := var_sum + var_num;

    var_num := var_num + 1;

    exit when var_num > 10;

    dbms_output.put('+');

   end loop;

   dbms_output.put_line('='||var_sum);

end; 

2. while循环

  while循环和loop循环的语法非常相似,不过相较于loop循环,while循环多出了进入循环的条件,具体语法如下:

1

2

3

4

5

6

while 条件   --进入循环的条件

  loop         --循环开始的标志

    loop_body;      --要执行的循环语句

    [exit when 条件;]   --中途退出的条件

  end loop;

end;

  依旧是循环打印1-100之间的所有偶数,观察两者之间的区别

1

2

3

4

5

6

7

8

9

10

declare

var_num int := 0;

begin

  while var_num <= 100

    loop

      dbms_output.put_line(var_num);

      var_num := var_num + 2;

      exit when var_num >100;

    end loop;

end;

  循环打印1+2+3+...+10=55这个式子和结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

declare

var_num int := 1;

var_sum int := 0;

begin

  while var_num <= 10

    loop

      dbms_output.put(var_num);

      var_sum := var_sum + var_num;

      var_num := var_num + 1;

      exit when var_num > 10;

      dbms_output.put('+');

     end loop;

     dbms_output.put_line('='||var_sum);

end;

3. for 循环

  for循环是四种循环中最为简单的一种,具体语法如下:

1

2

3

4

for 变量 in [reverse] 小值..大值 loop

  loop_body;

  [exit when 条件];

end loop;

  reverse是逆转的意思,当有reverse关键字时,后面紧跟的值要反过来写,即大值..小值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# 循环打印0-100之间的所有偶数

begin

  for var_num in 0..100 loop

    if mod(var_num,2) = 0 then

      dbms_output.put_line(var_num);

    end if;

  end loop;

end;

# 循环打印1+2+3+...+10=55的式子和结果

declare

var_sum int := 0;

begin

  for var_num in 1..10-1 loop

    dbms_output.put(var_num);

    dbms_output.put('+');

    var_sum := var_sum + var_num;

  end loop;

  dbms_output.put_line('10='||(var_sum+10));

end;

4. goto循环

  goto的用法和其他三种循环都不一样,当使用goto时,可以无条件的跳到处于同一个PL/SQL块的任意执行语句处。具体使用方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

循环打印0-100之间的所有偶数,并求和<br>declare

var_num int := 0;

var_sum int := 0;

begin

  <<routine>>        --定义goto标签

  var_num := var_num + 1;                 --循环体,也就是需要执行的循环部分

  if mod(var_num,2) = 0 then

    dbms_output.put_line(var_num);

    var_sum := var_sum + var_num;

  end if;

  if var_num <= 100 then          --进入循环的条件

    goto routine;                        --返回上面的循环

  end if;

  dbms_output.put_line(var_sum);

end;

  利用goto循环,循环打印1+2+3+...+10=55这个式子和结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

declare

var_num int := 1;

var_sum int := 0;

begin

  <<circulate>>

  dbms_output.put(var_num);

  var_sum := var_sum + var_num;

  var_num := var_num + 1;

# 加号也是重复出现的,所以利用循环进行循环打印

# 当var_sum+10,var_num再加上一等于11时,就不再需要加号

  if var_num <= 10 then       

    dbms_output.put('+');

  end if;

  if var_num <= 10 then

    goto circulate;

  end if;

  dbms_output.put_line('='||var_sum);

end; 

二. continue,retune,exit的使用

1. continue

  continue在英文中有继续的意思,在oracle中结合循环使用,则是跳过本次循环,继续下一次循环。

  利用cintinue关键字,可以轻松的做到数据的筛选,例如打印0-100之间的所有偶数:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

declare

var_num int := -1;

begin

  loop

    var_num := var_num +1;

# 当大于100时,会结束整个循环

    exit when var_num > 100;

# 当变量为奇数时,会跳过之后的执行语句,结束这次循环,从而进入下次循环 

    if mod(var_num,2) =1 then

        continue;

    end if;

    dbms_output.put_line(var_num);

  end loop;

end;   

  和exit比较,continue不会跳出整个循环,它只是跳过不符合条件的本次循环,从而开启新的循环,依旧处于循环阶段,直到所有数据全部循环完毕。而exit则是在符合条件后,直接结束整个循环部分,转而去执行循环体外的其他内容。

2. return 

  在循环中使用exit和return时,两者的作用都是跳出整个循环,不过不同于exit ,return在跳出整个循环的同时,循环体外的其他内容也不会执行。

  下面给出几段代码,查看两者的不同:

1

2

3

4

5

6

7

8

9

10

begin

  for var_num in 1..5 loop

    if var_num = 3 then

      exit;

     --return;

    end if;

    dbms_output.put_line(var_num);  

  end loop;

  dbms_output.put_line('I love oracle!');

end; 

  结果:

1

2

3

4

5

6

7

8

exit:

1

2

I love oracle!

return

1

2

  可以看出相较于exit,return直接跳出了整个循环,同时还跳过了循环外的执行语句,直接结束了整段代码。结合网上查到的资料,则可以总结到:在oracle中,return的作用,是跳出整个语句,如果是存储过程,则跳出存储过程,如果是函数,则跳出整个函数。

### 在 Oracle PL/SQL 游标循环中执行 INSERT 操作的实现方法 在 Oracle PL/SQL 中,可以结合游标和循环来处理数据,并通过 `INSERT` 语句将查询结果插入到目标表中。以下是实现此功能的详细方法和代码示例。 #### 示例代码:使用游标循环执行 INSERT 操作 ```plsql DECLARE -- 定义游标 CURSOR source_cursor IS SELECT column1, column2 FROM source_table WHERE condition = 'some_value'; -- 定义局部变量 v_column1 source_table.column1%TYPE; v_column2 source_table.column2%TYPE; BEGIN -- 打开游标 OPEN source_cursor; -- 循环提取数据并执行插入操作 LOOP FETCH source_cursor INTO v_column1, v_column2; EXIT WHEN source_cursor%NOTFOUND; -- 当没有更多记录时退出循环[^1] -- 执行插入操作 INSERT INTO target_table (target_column1, target_column2) VALUES (v_column1, v_column2); END LOOP; -- 提交事务 COMMIT; -- 关闭游标 CLOSE source_cursor; END; ``` #### 说明 - 游标 `source_cursor` 被定义为从 `source_table` 查询数据的指针。通过 `SELECT` 语句指定需要提取的列和条件。 - 使用 `OPEN` 打开游标,然后通过 `FETCH` 提取每一条记录到局部变量中。 - 当 `source_cursor%NOTFOUND` 返回 `TRUE` 时,表示没有更多记录可提取,循环结束。 - 在循环内部,执行 `INSERT` 语句将提取的数据插入到目标表 `target_table` 中。 - 最后通过 `COMMIT` 提交事务以确保数据持久化,并通过 `CLOSE` 关闭游标释放资源[^2]。 #### 使用 `FOR` 循环简化代码 如果不需要显式管理游标的打开和关闭,可以使用 `FOR` 循环简化代码: ```plsql BEGIN -- 使用 FOR 循环自动管理游标 FOR rec IN (SELECT column1, column2 FROM source_table WHERE condition = 'some_value') LOOP -- 执行插入操作 INSERT INTO target_table (target_column1, target_column2) VALUES (rec.column1, rec.column2); END LOOP; -- 提交事务 COMMIT; END; ``` #### 说明 - 使用 `FOR` 循环时,Oracle 自动管理游标的打开、提取和关闭过程,减少了代码量。 - 每次循环中,当前记录被存储在隐式定义的记录变量 `rec` 中,可以直接引用其字段进行操作[^3]。 #### 注意事项 - 确保目标表 `target_table` 的列与插入值匹配,避免出现类型不一致或列数不匹配的错误。 - 如果需要插入大量数据,建议使用批量插入(如 `BULK COLLECT` 和 `FORALL`)以提高性能[^4]。 - 在事务提交前,确保所有插入操作都已正确执行,否则可以通过 `ROLLBACK` 回滚事务。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值