这两天啊有一个心的业务,是须要假设我批量改动数据的话,那么还有一张表的数据也须要改动。也是多条的改动,发现这个问题的时候。自然而然的想到了触发器,可是曾经都是简单的单条语句的跟新,没有过整个表的去做一个触发器。今天学习了一下数据库中的循环,这里写一下。
在写触发器的时候用到了一个循环和一个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的更多相关文章

  1. oracle学习--循环语句

    oracle学习--循环语句  loop循环: create or replace procedure pro_test_loop is i number; begin i:=0; loop i:=i ...

  2. oracle游标循环的嵌套

    完成批量修改user_tables中的所有表的栏位名(从MS SQL导入过来,发现大小写问题,造成很多麻烦) 存储过程见下: -- Created on 2012/3/14 by FREE decla ...

  3. Oracle 如何循环查询结果集,进行新增或修改

    Oracle的PL/SQL中怎样循环查询的结果集,然后根据查询结果进行判断,是新增或修改操作 loop循环例子 for item in (select a,b,c from table_a where ...

  4. 四、Oracle loop循环、while循环、for循环、if选择和case选择、更改读取数据、游标、触发器、存储过程

    数据库的设计(DataBase Design): 针对于用户特定的需求,然后我们创建出来一个最使用而且性能高的数据库! 数据库设计的步骤: 01.需求分析 02.概念结构设计 03.逻辑结构设计 04 ...

  5. oracle for循环查找结果

    -- Call the procedure begin ' ) loop dbms_output.put_line('v_rlt = '||v_rlt.ID||v_rlt.inspection_no) ...

  6. Oracle游标循环更新数据案例

    declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZ ...

  7. Oracle游标-循环查询表中数据(表名),并执行

    Oralce 表中存有一个字段,该字段存储表名,要把该表中的所有表名查询出来(即表名结果集),且执行结果集from 表名结果集: declare v_ccount ); --定义一个游标变量 curs ...

  8. Oracle loop循环无法插入数据

    以下的测试基于scott用户下的emp表 首先用while循环进行测试,向emp表插入999条数据 declare i emp.empno; begin loop insert into emp(em ...

  9. oracle中循环读出一个表的信息插入到另外一个表中

    declare cursor TAGENTMENUd is select * from TAGENTMENU where 1=1; -- 获取游标begin --遍历查询出的表 (注意 tn是整条记录 ...

随机推荐

  1. mysql error 1093 解决办法

    mysql> select * from t; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 ...

  2. Cryptography I 学习笔记 --- 密钥交换

    1. 使用可信第三方(Trusted third parties)进行密钥交换. a. Alice与TTP之间的密钥是K1,Bob与TTP之间的密钥是K2. b. Alice向TTP发起一个与Bob交 ...

  3. 服务器出现大量close_wait,我们来说说到底是怎么回事?(以tomcat为例)

    一.问题描述 最近一直忙得很,好久没写博客.前两天,微信收到个好友申请,说是想问问close_wait的事情. 找他问了些详细信息,大概了解到,他们后端服务是tomcat 7, jdk 7,cento ...

  4. 10.1综合强化刷题 Day3 afternoon

    竞赛时间:????年??月??日??:??-??:?? 题目名称 a b c 名称 a b c 输入 a.in b.in c.in 输出 a.out b.out c.out 每个测试点时限 1s 1s ...

  5. IntelliJ IDEA关闭代码自动补全

    关闭代码自动补全之后,可以使用[Ctrl]+[P]进行强制调出提示. [Editor]-[Code Completion]页里有个[Case sensitive completion],可以设置只第一 ...

  6. Java中基本的打包jar和war文件(包括eclipse打包操作)

    前言: 为什么要打jar包? 1.举个例子,当编写一个工具类库,里面有十几个类,每个类对应一个class文件时,为了方便别人调用,是不是要装在一个文件中,方便传递和引用. 2.打jar包还有一个好处, ...

  7. Android 蓝牙技术 实现终端间数据传输

    蓝牙技术在智能硬件方面有很多用武之地,今天我就为大家分享一下蓝牙技术在Android系统下的使用方法技巧.蓝牙是一种短距离的无线通信技术标准,蓝牙协议分为4层,即核心协议层.电缆替代协议层.电话控制协 ...

  8. 计算机网络自顶向下第三章传输层二TCP

    TCP 全双工 A-B,B-A 点对点 一对一的 TCP连接建立过程 客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来相应,最后,客户再用第三个特殊的报文段作为相应,前两个报文段 ...

  9. (转)python装饰器进阶一

    Python装饰器进阶之一 先看例子 网上有很多装饰器的文章,上来说半天也没让人看明白装饰器到底是个什么,究竟有什么用,我们直接来看几个例子. Python递归求斐波那契数列 def fibonacc ...

  10. MR之SequenceFile具体解释

    package com.leaf.hadoop.second; import java.util.Random; import org.apache.hadoop.conf.Configuration ...