关于Oracle游标的一些项目中遇到的逻辑问题

今天 在项目中看一个存储过程的时候,发现同事写的之前的有些逻辑错误,可能这个错误比较典型吧 拿出来分享一下,不使用公司的数据库,所以在自己的机子上模拟了一下这个场景。OK

  首先,就是2个表,

  表temp1,包括id1,val1,2个字段,

  表temp2,包括id2,val2 2个字段。

  首先,情景大致是这样的,2个表的ID是有关联的,就是把temp2中包含的temp1的id的数据,在temp1中把val1都设置为1,不包含的设置为0.

  首先,发一下之前错误的存储过程。


create or replace procedure mysdtest

as

cursor te_v1 is

select id1,val1 from Temp1;

cursor te_v2 is

select id2,val2 from Temp2;

v1_t te_v1%rowtype;

v2_t te_v2%rowtype;

begin

open te_v1;

loop

fetch te_v1 into v1_t;

exit when te_v1%notfound;

open te_v2;

loop

fetch te_v2 into v2_t;

exit when te_v2%notfound;

if v1_t.id1=v2_t.id2

then update temp1 set val1='1' where id1=v1_t.id1;

else

update temp1 set val1='0' where id1=v1_t.id1;

end if;

end loop;

close te_v2;

end loop;

close te_v1;

end;

  这样写逻辑是存在问题的,2层循环,结果就会发现都是0,仔细读一下程序就会发现问题

  比如说有一个值 t1 在表temp1中有值,应该更新val1为1,但是遍历到下一个t2时,此时t1不符合,然后就执行else 那么t1的val1就又变回了0,所以,程序执行完,都执行了else里面的,当然就错了。

正确的写法很多种,这里我就以设置带参数的游标为例,将2个游标建立关系,再进行遍历就不会出现问题。

  如下:


create or replace procedure myt

as

cursor te_v1 is

select id1,val1 from Temp1;

cursor te_v2(idv2 varchar2) is

select count(*) from temp2 where id2=idv2;

v1_t te_v1%rowtype;

numv varchar2(2);

begin

open te_v1;

loop

fetch te_v1 into v1_t;

exit when te_v1%notfound;

open te_v2(v1_t.id1);

fetch te_v2 into numv;

if numv=0

then

update TEMP1 set val1='0' where id1=v1_t.id1;

else

update TEMP1 set val1='1' where id1=v1_t.id1;

end if;

close te_v2;

end loop;

close te_v1;

end;

  ok,这种问题我们应该注意到

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-18 03:41:50

关于Oracle游标的一些项目中遇到的逻辑问题的相关文章

列举一下项目中使用的产品和技术

浏览器兼容水平: IE7-10, Firefox和Chrome最新版 开发环境: Windows7+Visual Studio 2010+Oracle TortoiseSVN+Subversion 项目和Bug管理系统 禅道.--一款国内开发的项目管理和bug管理系统. http://www.zentao.net/ 生成环境: Windows Server 2008+IIS7.5+Oracle+.NET(MVC3.0) 需求分析 Enterprise Architect 90天试用版.在学校做课

项目中使用了ibatis、hibernate时,怎么来控制事务

问题描述 现在的项目中使用了ibatis.hibernate然后在spring的配置文件里面配置<beanid="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><be

项目管理手记:DRP项目中软件系统架构的比较

软件系统架构,这是一个非常技术性的词.一般来说,服装企业的业务部门是不太理会这个东西的,毕竟他们关注的是业务实现.操作方便性等.就算是一些企业的IT技术人员,对于软件系统架构到底能够在IT项目中起到什么样的作用,可能也不太清楚.我还记得有一位企业的IT主管说过:"软件系统架构是个什么样的东西,对于我们公司来说,软件好用即可,我管它是用VB写的,还是用10层架构码出来的." 这位IT主管的话对吗?可能从企业的角度来说,信息系统的管用就行,其它的因素可能不用担心太多,至于软件系统架构,这是

Oracle 游标使用总结_oracle

Oracle游标分为显示游标和隐式游标. 显示游标(Explicit Cursor):在PL/SQL程序中定义的.用于查询的游标称作显示游标. 隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的.而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标. 一.显示游标 1.使用步骤 (1)定义 (2)打开 (3)使用 (4)关闭 2.使用演示 首先创建测试用表STUDENT,脚本如下: 复制代码 代码如下: CREATE TABLE "S

oracle游标使用方法详解

1,什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制.      ②关系数据库中的操作是在完整的行集合上执行的.   由 SELECT 语句返回的行集合包括满足该语句的 WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些应用程序需要一种机制来一次处理一行或连续的几行.而游标是对提供这一机制的结果集的扩展.      游标是通过游标库来实现的.游

ODS项目中的数据集成

问题描述 ODS是什么,数据仓库大师BillInmon对ODS的定义是"一个面向主题的.集成的.可变的.当前的细节数据集合,用于支持企业对于即时性的.操作性的.集成的全体信息的需求".看起来很晕,其实很好理解.以电信系统为例,电信系统一般情况按照业务划分成三大系统:业务.运维和管理.其中每一个系统都划分为各式各样的小型系统.比如:CRM,计费系统,结算系统,网络管理系统,资源管理系统等.分散在各处的数据,标准和一致性都无法保证,对于整个运营是很不利的.这就需要通过ODS来形成企业统一视

Oracle游标共享(Cursor Sharing)--常规游标共享和自适应游标共享(ACS)

Oracle游标共享(Cursor Sharing)--常规游标共享和自适应游标共享(ACS) 游标共享(Cursor Sharing)是指Shared Cursor间的共享,其实就是重用存储在Child Cursor中的解析树和执行计划而不用从头开始做硬解析的动作.特别对于除SQL文本中对应的输入值不同外,其它部分都一模一样的目标SQL更应该实现游标共享,而使用绑定变量就可以实现游标共享. 很多OLTP类型的应用系统的开发人员在开发阶段并未意识到硬解析的危害,所以也没有使用绑定变量,等到系统上

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端

在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreSQL.IBM DB2.或者国产达梦数据库等等,这些数据库的共同特点是关系型数据库,基本上开发的模型都差不多,不过如果我们基于ADO.NET的基础上进行开发的话,那么各种数据库都有自己不同的数据库操作对象,微软企业库Enterprise Library是基于这些不同数据库的操作做的抽象模型,适合多数据