Oracle的循环和Corsor
这两天啊有一个心的业务,是须要假设我批量改动数据的话,那么还有一张表的数据也须要改动。也是多条的改动,发现这个问题的时候。自然而然的想到了触发器,可是曾经都是简单的单条语句的跟新,没有过整个表的去做一个触发器。今天学习了一下数据库中的循环,这里写一下。
在写触发器的时候用到了一个循环和一个Cursor,触发器例如以下:
CREATE 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的更多相关文章
- oracle学习--循环语句
oracle学习--循环语句 loop循环: create or replace procedure pro_test_loop is i number; begin i:=0; loop i:=i ...
- oracle游标循环的嵌套
完成批量修改user_tables中的所有表的栏位名(从MS SQL导入过来,发现大小写问题,造成很多麻烦) 存储过程见下: -- Created on 2012/3/14 by FREE decla ...
- Oracle 如何循环查询结果集,进行新增或修改
Oracle的PL/SQL中怎样循环查询的结果集,然后根据查询结果进行判断,是新增或修改操作 loop循环例子 for item in (select a,b,c from table_a where ...
- 四、Oracle loop循环、while循环、for循环、if选择和case选择、更改读取数据、游标、触发器、存储过程
数据库的设计(DataBase Design): 针对于用户特定的需求,然后我们创建出来一个最使用而且性能高的数据库! 数据库设计的步骤: 01.需求分析 02.概念结构设计 03.逻辑结构设计 04 ...
- oracle for循环查找结果
-- Call the procedure begin ' ) loop dbms_output.put_line('v_rlt = '||v_rlt.ID||v_rlt.inspection_no) ...
- Oracle游标循环更新数据案例
declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZ ...
- Oracle游标-循环查询表中数据(表名),并执行
Oralce 表中存有一个字段,该字段存储表名,要把该表中的所有表名查询出来(即表名结果集),且执行结果集from 表名结果集: declare v_ccount ); --定义一个游标变量 curs ...
- Oracle loop循环无法插入数据
以下的测试基于scott用户下的emp表 首先用while循环进行测试,向emp表插入999条数据 declare i emp.empno; begin loop insert into emp(em ...
- oracle中循环读出一个表的信息插入到另外一个表中
declare cursor TAGENTMENUd is select * from TAGENTMENU where 1=1; -- 获取游标begin --遍历查询出的表 (注意 tn是整条记录 ...
随机推荐
- 教学生jni编程(一)
我的所有文件的目录在/home/michelle/WORKM/DAYCODE/day0426/,请根据个人情况适当调整 1)创建一个HelloWorld.Java文件,如下: public class ...
- C语言中的内存相关问题
内存是用来存储数据与程序的,对我们写程序来说非常重要.所以内存对程序来说几乎是本质需求.越简单的程序需要越少的内存,而越庞大越复杂的程序需要更多的内存. 注意:在嵌入式系统中有ROM和RAM两类内存, ...
- 【原创】SQL SERVER 查询Job作业基本信息及执行情况
查询作业基本信息和作业执行情况 SELECT [jop].[job_id] AS '作业唯一标识符' ,[jop].[ name ] AS '作业名称' ,[dp].[ name ] AS '作业创建 ...
- RecyclerView的Item和Item内的控件点击处理
需求场景:RecyclerView的Item需要点击,或者Item中的某个控件需要点击,或者两者同时需要点击处理. 一.adapter代码如下: package com.ldw.adapter; im ...
- luogu P1608 路径统计
题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为 ...
- popcount 算法分析
转载: http://blog.csdn.net/gaochao1900/article/details/5646211 http://www.cnblogs.com/Martinium/archiv ...
- Displaying Modal Window Messages in Oracle Forms Using Show_Alert
You can display modal windows in Oracle Forms to display normal messages, error message or asking fo ...
- recovery怎么刷机,recovery是什么意思
转自:http://www.3lian.com/edu/2012/04-11/25212.html Recovery是什么意思? recovery翻译过来就是“恢复”的意思,是开机后通过特殊按键组合( ...
- mac下virtualenv使用
1 sudo pip install virtualenv 安装 2 找一合适目录装虚拟环境 virtualenv virzhongguo 3 激活虚拟环境 source virzhongguo/ ...
- Redis 在 Java 中的使用
转:http://blog.csdn.net/jiangtao_st/article/details/8256610 一.下载jar包 https://github.com/xetorthio/jed ...