博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle PL/SQL中的循环处理(sql for循环)
阅读量:5116 次
发布时间:2019-06-13

本文共 2991 字,大约阅读时间需要 9 分钟。

    今年春节算是休了个长假,调整好心态,迎接新一年的挑战。

    今天来说下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)isbegin   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_forisbegin     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;

转载于:https://www.cnblogs.com/maoniu602/archive/2013/03/01/2938758.html

你可能感兴趣的文章
第一个Java Web程序
查看>>
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
Repeater + Resources 列表 [原创][分享]
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>