科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道谈谈Oracle PL/SQL循环处理

谈谈Oracle PL/SQL循环处理

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Oracle PL/SQL中的循环处理,PL/SQL也和我们常用的编程语言一样,提供了While、For等循环,我们建几个例子来说明演示下。

来源:中国IT实验室 2013年3月3日

关键字: PL/SQL ORACLE

  • 评论
  • 分享微博
  • 分享邮件

ZDNet至顶网软件频道  今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在这里说下个人的理解。

PL/SQL也和我们常用的编程语言一样,提供了While、For等循环,我们建几个例子来说明演示下。

首先是While循环:

--while循环

procedure loop_while

start_value in number,

end_value in number

is

current_value number := start_value;

begin

while current_value <=end_value

loop

dbms_output.put_line("now number:" || current_value);

current_value:=current_value+1;

end loop;

end loop_while;

指定循环的初始值和结束值之后,就可以看到将这2个值之间的数字一行行打印出来了;当然只要while循环条件的求值结果是true,循环就会继续下去,

如果求值条件为false或者null,循环就会终止。这个循环条件每执行一次循环体之前都会先进行判断,因此while循环并不能保证循环体一定能被执行。

所以如果我们无法提前预知所需要巡检的次数的情况下,就可以使用While来进行循环处理。

For循环有2种,分别是数值型FOR循环和游标型FOR循环:

--数值型For循环

procedure loop_num_for

lowest in number,

highest in number

is

begin

FOR even_number in lowest highest --升序

loop

--处理非平滑增长的索引

if mod(even_number,2)=0

then

dbms_output.put_line("now number:" || even_number);

end if;

end loop;

end loop_num_for;

这种循环在开始的时候就已经知道循环的次数了,注意这里不需要声明循环索引,因为PL/SQL会自动隐式的用一个integer类型的局部变量作为它的循环索引;

如果要降序循环,必须加上reverse关键字,并且循环上边界和下边界的顺利无需改变:

FOR even_number in reverse lowest highest

loop

dbms_output.put_line("now number:" || even_number);

end loop;

另外需要说明的是,数值型FOR循环中,索引总是以1为单位递增或递减,所以如果我们的循环条件并非如此理想的平滑增长,我们就必须用一些逻辑代码或者技巧来

达到我们的目的。

如果我们需要对很多行记录做处理时,就可以使用游标型FOR循环:

--游标型For循环

procedure loop_cursor_for

is

begin

declare cursor userinfo_cur is select * from userinfo_table;

begin

FOR userinfo_rec in userinfo_cur

loop

dbms_output.put_line("username is:" || userinfo_rec.user_name);

end loop;

end;

end loop_cursor_for;

当游标中的所有记录都取出来后,FOR循环就会自动终止,这里不用显示OPEN、CLOSE游标,PL/SQL引擎会自动处理。

上面的循环语句都可以用EXIT 或者 EXIT WHEN来终止其循环,但最好不要这样做,因为这样可能会造成循环的逻辑出现问题,最终造成SQL代码难于跟踪和调试。

最后附上测试用的SQL:

循环

create or replace package body LOOP_TEST_DEMO IS

--while循环

procedure loop_while(start_value in number, end_value in number) is

current_value number := start_value;

begin

while current_value <= end_value loop

dbms_output.put_line("now number:" || current_value);

current_value := current_value + 1;

end loop;

end loop_while;

--数值型For循环

procedure loop_num_for(lowest in number, highest in number) is

begin

FOR even_number in lowest highest

--升序

loop

--dbms_output.put_line(even_number);

--处理非平滑增长的索引

if mod(even_number, 2) = 0 then

dbms_output.put_line("now number:" || even_number);

end if;

end loop;

--降序

FOR even_number in reverse lowest highest loop

dbms_output.put_line("now number:" || even_number);

end loop;

end loop_num_for;

--游标型For循环

procedure loop_cursor_for is

begin

declare

cursor userinfo_cur is

select * from greenet_user_info;

begin

FOR userinfo_rec in userinfo_cur loop

dbms_output.put_line("username is:" || userinfo_rec.user_name);

end loop;

end;

end loop_cursor_for;

end LOOP_TEST_DEMO;

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章