问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Oracle中游标与循环的问题

发布网友 发布时间:2022-04-21 09:16

我来回答

2个回答

懂视网 时间:2022-04-30 13:27

OR REPLACE TRIGGER trg_test before update ON cm_bogie_inandoutreport DECLARE //定义游标,查找表里边的每一列的值 cursor c_bogie is select s_bureaunumno c_b_bureaunumno, s_serialnum c_b_serialnum, s_trainsetid c_b_trainsetid from cm_bogie_inandoutreport; BEGIN //循环赋值 for v_record in c_bogie loop update test_mhb t set t.s_id=v_record.c_b_bureaunumno where t.s_sex = v_record.c_b_bureaunumno; dbms_output.put_line(c_b_bureaunumno); end loop; END trg_test;

循环
一般循环大概分为三种:基本循环(loop),WHILE循环, FOR循环

1.基本循环

LOOP 

  statement1; 

  ...... 

  EXIT [WHEN condition]; 

END LOOP; 

当使用基本循环时,无论是否满足条件,语句至少会被执行一次,当condition为TRUE时,会退出循环,并执行END LOOP后的相应操作。当编写基本循环时一定要包含EXIT语句,否则会陷入死循环。另外还应该定义循环控制变量,并且在循环体内修改循环控制变量的值。示例:

SQL> declare
 i int:=1;
 begin
 loop
 insert into testloop values(i);
 exit when i=10;
 i:=i+1;
 end loop;
 end;

2.WHILE循环

基本循环至少要执行一次循环体内的语句,而对于WHILE循环来说,只有条件为TRUE时,才会执行循环体内的语句。WHILE循环以WHILE …LOOP开始,以END LOOP结束。

WHILE condition LOOP 

  statement1; 

  statement2; 

  ..... 

END LOOP; 

当condition为TRUE时,执行循环体内的语句,而当condition为FALSE或NULL时,会退出循环,并执行END LOOP后的语句。当使用WHILE循环时,应该定义循环控制变量,并在循环体内改变循环控制变量的值。示例:

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

3.FOR循环

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

FOR counter in [REVERSE] lower_bound. .upper_bound LOOP 

  statement1; 

  statement2; 

  ....... 

END LOOP; 

在我们查询的时候是用select和into一起使用,把select的内容放到into里边,而cursor给我们提供了一个便利,那么问题来了
什么是游标?
①从表中检索出结果集,从中每次指向一条记录进行交互的机制。

②关系数据库中的操作是在完整的行集合上执行的。
由 SELECT 语句返回的行集合包括满足该语句的 WHERE 子句所列条件的所有行。由该语句返回完整的行集合叫做结果集。
应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的。
这些应用程序需要一种机制来一次处理一行或连续的几行。而游标是对提供这一机制的结果集的扩展。

 游标是通过游标库来实现的。游标库是常常作为数据库系统或数据访问 API 的一部分而得以实现的软件,
 用来管理从数据源返回的数据的属性(结果集)。这些属性包括并发管理、在结果集中的位置、返回的行数,
 以及是否能够在结果集中向前和/或向后移动(可滚动性)。

 游标跟踪结果集中的位置,并允许对结果集逐行执行多个操作,在这个过程中可能返回至原始表,也可能不返回至原始表。
 换句话说,游标从概念上讲基于数据库的表返回结果集。
 由于它指示结果集中的当前位置 ,就像计算机屏幕上的光标指示当前位置一样,“游标”由此得名。

2,游标有什么作用?
①指定结果集中特定行的位置。
②基于当前的结果集位置检索一行或连续的几行。
③在结果集的当前位置修改行中的数据。
④对其他用户所做的数据更改定义不同的敏感性级别。
⑤可以以编程的方式访问数据库。
3、游标怎么用

例子1:
 /* conn scott/tiger */
 Declare
 Cursor myCur is select empno,ename,sal from emp;
 vna varchar2(10);
 vno number(4);
 vsal number(7,2);
 Begin
 open myCur;
 fetch myCur into vno,vna,vsal;
 dbms_output.put_line(vno||‘ ‘||vna||‘ ‘||vsal);
 close myCur;
 End;
 /

 例子2:使用loop遍历游标。
 /* conn scott/tiger */
 Declare
 Cursor myCur is select ename,job,sal,empno from emp;
 varE myCur%rowType;
 Begin
 if myCur%isopen = false then
 open myCur;
 dbms_output.put_line(‘Opening...‘);
 end if;
 loop
 fetch myCur into varE;
 exit when myCur%notfound; 
 dbms_output.put_line(myCur%rowCount||‘ ‘||vare.empno||‘ ‘||vare.ename||‘ ‘||vare.sal);
 end loop;
 if myCur%isopen then
 Close myCur;
 dbms_output.put_line(‘Closing...‘);
 end if;
 End;
   其实游标还是挺好用的,就和Select 。。。into...一样,游标大家把他当作是一个表就可以,只不过这个游标还是指向咱们查询出来表的第一行。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Oracle的循环和Corsor

标签:数据库   cursor   

热心网友 时间:2022-04-30 10:35

如果表中存在数据的话,没差别。
但是如果表中没有数据的话,第一个不会打印任何结果,第二个会打印一个【'学号:'',姓名:''】
***补充:****
更正:
如果表中存在数据的话,第二个的最后一条记录重复出现一次。
但是如果表中没有数据的话,第一个不会打印任何结果,第二个会打印一个【'学号:'',姓名:''】
*************
@@@@补充2:@@@@@
出现重复记录的原因(以两条数据为例):
第一种情况:
1、循环外先fetch一条,发现不是mycur%notfound,进入循环体打印第一条记录。
2、再fetch一条,发现不是mycur%notfound,继续循环打印第二条记录。
3、再fetch一条,发现是mycur%notfound,停止循环。
第二种情况:
1、直接进入循环fetch一条,发现不是mycur%notfound,打印第一条记录。
2、再循环fetch一条,发现不是mycur%notfound,打印第二条记录。
3、再循环fetch一条,发现是mycur%notfound,但程序顺序执行又执行了一遍打印,这个时候因为没有记录产生,变量中存放的就是上一条记录,所以重复打印第二条记录后,退出循环。
@@@@@@@@@@@@@@@@@@@@@@@@@
#######补充3:###########
不要管循环几次(我举例子是为了方便理解,既然理解不了就不要想了)。你想:程序是顺序执行的,第一种情况循环里面的fetch后直接跟的是循环停止条件,这样fetch到底后直接跳出循环。第二种情况fetch后跟的是打印,这样fetch到底后肯定会先打印再停止循环,而打印的结果就是上一次残留的记录,就是最后一条记录。
########################
--
以上,希望对你有所帮助。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
宾得有哪些系列 PENTAX宾得 K-3 APS-C画幅数码单反相机 宾得相机有哪些 宾得有哪些相机 开庭三次被告不出庭怎么处理 梦见修复棺材什么预兆 球球大作战 球球大作战名字空白怎么输入? 球球大作战 球球大作战怎么弄空白名字? 河北杏花什么时候开 河北杏花观赏地推荐 支付宝星期六转账到银行卡要多久? windows10系统自动关闭之后到输入密码的界面是什么鬼? ORACLE存储过程怎么实现跳出游标当前循环,继续获取下一行 t3出行平台抽多少佣金 梅艳芳是因为什么原因去世的? win10系统开机老是要输入密码 如何关闭密码开机设 oracle的loop怎么跳出循环 outlook使用后关掉再启动就会失败,只有注销或重启电脑才能使用,WHY? 武汉t3出行司机自营模式和租车模式对比 在oracle存储过程中怎样跳出本次循环 Win10电脑设置在哪里,怎么打开Win10电脑设置 t3车主app下载司机端带车加盟条件 oracle 跳出一个循环的问题 Win10如何绕过密码输入就直接进入桌面。 开启outlook2010后经常弹出提示框:说需要输入使用者名称和密码! 怎么装Win10系统步骤 密室逃脱过瘾版攻略第十关输入密码4612打不开 《未上锁的房间》第10关怎么过? 史上最坑爹的游戏7第10关怎么过 密室逃脱3第10关为什么烤箱没有数字 请问 密室逃脱5第十关 怎么过 &#139337;寮这两个字怎么读? t3出行快享和惠享区别 oracle 执行存储过程 无法中断 但是是循环执行 怎么办 t3出行租车需要多少钱一个月? 跳出oracle存储过程的方法 Oracle存储过程循环的问题 t3出行租车模式详情 oracle语句中&lt;&lt; &gt;&gt;是什么意思 T3快享和快惠哪个便宜 oracle10g嵌套循环的用法 for循环中怎样跳出本次循环进入下次循环 T3出行招聘司机要求有哪些,能申请吗? 关于oracle游标循环查询视图中数据再插入的问题 oracle 中level出现了死循环 oracle中能不能实现y和n 两个字母随机选择 Oracle数据库中插入和取数据,数据为空的问题。 oracle 逗号分隔查询 如何给自己设置头像 自定义头像怎么弄 如何设置自定义头像