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是整条记录 ...
随机推荐
- shell特殊符号用法大全
# 注释符号(Hashmark[Comments]) 1.在shell文件的行首,作为shebang标记,#!/bin/bash; 2. 其他地方作为注释使用,在一行中,#后面的内容并不会被执行, ...
- 转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类
在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个s ...
- LeetCode OJ-- First Missing Positive
https://oj.leetcode.com/problems/first-missing-positive/ 给一列数,找出缺失的第一个正数.要求时间复杂度 O(n) 第一步遍历一遍,找出最大的数 ...
- java获取整数的各位数值
第一种是取模运算 int qian =input/1000; //千位除以1000 int bai = input/100%10;//百位除以100%10 int shi = input%100/10 ...
- RabbitMq解决分布式事物
一.RabbitMQ解决分布式事务思路: 案例: 经典案例,以目前流行点外卖的案例,用户下单后,调用订单服务,让后订单服务调用派单系统通知送外卖人员送单,这时候订单系统与派单系统采用MQ异步通讯. 二 ...
- springBoot 整合 mybatis+Oracle
现在比较流行的操作数据库操作层框架Mybatis,下面我们就来看看Springboot如何整合mybatis, 之前一直在用xml形式写sql,这次依然用xml的方式感觉这种还是比较灵活方便. 添加m ...
- servlet源码查看
1,下载源码,点击此处可下载 2,创建web项目 我这里以jdbc这个web项目为例讲解 在javaee libraries中有个javaee.jar包,选中它-->右击-->Proper ...
- ORACLE SQL*PLUS环境变量设置及说明
1:查看当前用户的环境设置: SQL> define DEFINE _DATE " (CHAR) DEFINE _CONNECT_IDENTIFIER = "updb&quo ...
- How To Commit Just One Data Block Changes In Oracle Forms
You have an Oracle Form in which you have multiple data blocks and requirement is to commit just one ...
- recovery怎么刷机,recovery是什么意思
转自:http://www.3lian.com/edu/2012/04-11/25212.html Recovery是什么意思? recovery翻译过来就是“恢复”的意思,是开机后通过特殊按键组合( ...