`
字母哥
  • 浏览: 70154 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于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,这种问题我们应该注意到
0
0
分享到:
评论
3 楼 donglinjiang 2014-06-25  
有啥问题?
2 楼 字母哥 2014-06-24  
donglinjiang 写道
update temp1 set val=decode((select count(*) from temp2 where temp1.id1=temp2.id2 ),0,0,1)
这样行吗?
好像有问题吧
1 楼 donglinjiang 2014-06-24  
update temp1 set val=decode((select count(*) from temp2 where temp1.id1=temp2.id2 ),0,0,1)
这样行吗?

相关推荐

    Oracle游标使用大全

    ### Oracle游标使用详解 #### 一、Oracle游标简介 在Oracle数据库中,游标是一种重要的机制,用于处理查询结果集。它允许用户通过PL/SQL编程语言逐行访问和处理查询返回的数据记录。游标可以是显式定义的(即在...

    Oracle游标使用方法及语法大全

    总的来说,Oracle游标是PL/SQL编程中的重要组成部分,它们使开发人员能够更精确地控制数据处理流程,特别是在需要迭代查询结果并进行操作的情况下。无论是显式还是隐式,游标都是数据库应用中提高效率和准确性的关键...

    ORACLE游标与异常处理

    在Oracle数据库中,游标(Cursor)和异常处理(Exception Handling)是PL/SQL编程的重要组成部分,它们在处理复杂逻辑和确保数据完整性方面起到关键作用。以下是对这两个主题的详细阐述。 首先,让我们来理解Oracle...

    oracle游标的使用

    在Oracle数据库中,游标(Cursor)是一种强大的机制,用于处理查询结果集中的数据行。游标允许我们逐行检索和处理数据,这对于需要对每一行执行特定操作或逻辑的情况非常有用。根据提供的文件信息,我们可以深入探讨...

    第十四课Oracle游标和异常处理.pptx

    Oracle数据库系统中,游标和异常处理是两个关键概念,特别是在复杂的数据库操作和程序设计中。游标允许我们逐行处理查询结果,而异常处理则提供了错误管理的机制,确保程序在遇到错误时能优雅地恢复或终止。 首先,...

    Latch Free、Library cache伪游标(pseudo cursor)之间的那些事

    在数据库运维和性能调优领域,处理LatchFree问题和Library cache争用是经常会遇到的难题。LatchFree指的是Oracle数据库在获取 latch时出现的争用问题, latch是数据库内存结构中的一种轻量级的串行化控制机制,用于...

    Oracle函数返回游标的方法及应用.pdf

    在油田信息系统建设的背景下,遇到的问题是如何从DHC05表中按单位名称和日期查询运行泵的数据,并以特定格式输出报表。原始数据表的结构并不适合直接生成所需报表,因为每个泵的数据分布在不同的列中,且不同单位的...

    oracle分页

    在分页场景中,游标可能不是必需的,但在处理复杂逻辑或更新数据时非常有用。例如,可以使用游标在循环中逐行处理每一页的数据,进行进一步的分析或修改。以下是一个简单的游标示例: ```sql DECLARE cursor_name...

    oracle异常和游标管理.pptx

    Oracle数据库中的异常管理和游标管理是PL/SQL编程的重要组成部分,它们对于编写健壮、可靠的数据库应用程序至关重要。异常处理允许程序优雅地捕获并处理运行时错误,而游标则为处理单行或多行结果集提供了机制。 1....

    plsql基础(游标)

    在处理游标的过程中,可能会遇到各种异常情况,例如没有找到符合条件的记录。为了更好地管理这些异常,可以在PL/SQL块中加入`EXCEPTION`部分: ```plsql BEGIN -- 游标操作 EXCEPTION WHEN NO_DATA_FOUND THEN ...

    ORACLE练习题ORACLE练习题

    Oracle是世界上最流行的数据库管理系统之一,尤其在企业级应用中占据着重要的地位。Oracle数据库系统以其高效、稳定和功能强大而闻名。本练习题集旨在帮助用户深入理解和掌握Oracle数据库的相关知识,包括SQL语言、...

    Oracle课程设计 Oracle项目实例 Oracle编程

    这些文档可以帮助你在遇到困难时找到解决办法,同时也能帮助你理解Oracle的高级特性,如分区、物化视图、游标、异常处理以及数据库链接等。 在Oracle编程方面,你可能会学习到如何使用JDBC(Java Database ...

    游标的使用和存储过程的建立

    游标和存储过程是Oracle数据库管理系统中非常重要的概念,它们在数据处理和程序设计中扮演着关键角色。在这个实验中,我们主要学习了如何利用游标查询数据以及如何创建存储过程和程序包。 首先,游标是处理单条记录...

    关于Oracle数据库的一些基础知识

    学习Oracle数据库时,经常会遇到各种问题,"Oracle数据库傻瓜一千问"可能涵盖了这些常见问题,包括但不限于: 1. 如何安装和配置Oracle数据库? 2. 如何创建和管理表空间? 3. 怎样编写SQL语句进行数据查询、插入、...

    关于在ORACLE下开发JAVA的几个问题.rar_oracle

    以下是一些核心的知识点,详细说明了在Oracle下进行Java开发时可能遇到的问题及其解决方案: 1. **Oracle JDBC驱动**:Oracle提供多种JDBC驱动,如 Thin、OCI(Oracle Call Interface)和JDBC-ODBC桥。 Thin驱动是...

    oracle练习题关于触发器的作业

    在"oracle练习题关于触发器的作业"中,你可能需要设计和实现各种类型的触发器来解决实际问题。例如,你可能需要创建一个触发器来确保表中的某个字段始终具有唯一的值,或者在更新记录时自动更新另一相关表的数据。 ...

    Oracle数据库试题100题(附答案)

    Oracle数据库的逻辑结构包括表空间、段、区和数据块,其中表空间是数据库中的一个逻辑存储单元,段是表空间中分配的逻辑存储区域,区是段中分配的一系列连续的数据块,数据块是Oracle数据库中最小的存储单位。...

Global site tag (gtag.js) - Google Analytics