今天遇到了一个之前从未在意过的问题引发的错误,赶紧记录一下。

两个过程,此处命名为proc1,proc2,用于更新相关表中的记录。

proc1对表记录做初始化,proc2按照业务逻辑修改表中的字段值,过程中均没有显式提交。

两个过程单独执行均不会报错,但同时执行就会出错。错误号:ORA-01002: fetch out of sequence

首先查看官方文档对ORA-01002错误号的解释:

Cause: This error means that a fetch has been attempted from a cursor which is no longer valid. Note that a PL/SQL cursor loop implicitly does fetches, and thus may also cause this error. There are a number of possible causes for this error, including: 1) Fetching from a cursor after the last row has been retrieved and the ORA-1403 error returned. 2) If the cursor has been opened with the FOR UPDATE clause, fetching after a COMMIT has been issued will return the error. 3) Rebinding any placeholders in thestatement, then issuing a fetch before reexecuting the statement.

Action: 1) Do not issue a fetch statement after the last row has been retrieved - there are no more rows to fetch. 2) Do not issue a COMMIT inside a fetch loop for a cursor that has been opened FOR UPDATE. 3) Reexecute the statement after rebinding, then attempt to fetch again.

由于proc1非常简单,就是几个update语句,proc2隐式声明了cursor循环更新,逻辑比较复杂,因此初步分析问题极可能是出在proc2的逻辑处理上,重点关注proc2。

由于pl/sql并没有提供单步调试的功能,为了清晰每步执行的状况,在相关重要位置通过dbms_output打印更新行ID等,并在适当位置加上exception捕获可能的错误。

重新单独执行proc2确实捕获到了几个错误,都是:ORA-01401: inserted value too large for column

根据打印输出的行号到原始表中查询了一下,确实是字段超长,重新看了看proc2的执行逻辑,由于其中对于更新操作有exception做处理,如果更新出错会继续跳到下一条,所以此处即使出错应该没关系,过程仍然会继续向下执行,这个错误应该不是造成ora-01002的主要原因。

手动rollback,然后重新同时执行proc1,proc2,这次出错,但这次只报了一次ORA-01401,接着就是ORA-01002,看起来仿佛又跟ora-01401有关系了,重点看看出错地方的代码,发现exception之后,执行了一个rollback,这个,不管是从业务逻辑,还是从程序逻辑上显然都是不合理的,去掉它之后再执行,成功!

再回过头来看一看,虽然proc2中ora-1401并非造成ora-01002的主因,但如果proc2执行过程中不报错,那么自然也不会执行rollback,造成事务回滚,从而触发ora-1002错误,这也解释了为什么之前都执行的好好的,没有做任何改动的情况下忽然出现了错误。如果proc2一直正确执行的话,这个错误肯定就不会暴露出来。问题的主要原因还是因为在proc2执行出错时,执行了rollback,因此将rollback注释掉,重新编译proc2,再次执行,一切正常,问题解决!

java ora 01002_遇到了ora-01002,fetch out of sequence相关推荐

  1. java程序造成ora-7445_Problem Key 'ORA 7445 [pevm_icd_call_common]'

    新装一套19c rac,使用了10月份补丁.其中一个节点的告警日志一直报以下错,cdump把oracle_home目录快撑满了. DDE: Problem Key 'ORA 7445 [pevm_ic ...

  2. java中正则表达式,编译报错:Invalid escape sequence (valid ones are \b \t \n \f \r \ \' \\ )...

    转自:https://www.cnblogs.com/EasonJim/p/6561666.html 若出现:Invalid escape sequence (valid ones are  \b   ...

  3. java id生成器 分布式_分布式高效唯一ID生成器(sequence)

    分布式高效唯一ID生成器(sequence) 简介 高效GUID产生算法(sequence),基于Snowflake实现64位自增ID算法. Twitter-Snowflake算法产生的背景相当简单, ...

  4. java ora 01002,ORA-01002 提取违反顺序

    ORA-01002 提取违反顺序 ORA-01002 ORA-01002: fetch out of sequence Cause: This error means that a fetch has ...

  5. oracle crf路径,说说 ora.crf 那些事

    Oracle数据库环境尤其是RAC环境对下层的基础环境要求非常严格,常常会因为CPU不足,内存不足.网络,IO等原因导致数据库hang或脑裂驱逐, 这里如果没有系统信息数据的支撑, 可能会陷入SA和D ...

  6. Oracle的tnsnames.ora配置(PLSQL Developer)

    首先打开tnsnames.ora的存放目录,一般为D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安装具体位置了. 步骤阅读 ...

  7. oracle未获得监听器,无监听文件listener.ora的动态监听小例试验

    在数据库服务器上,监听文件的位置是:$ORACLE_HOME/network/admin/listener.ora 试验如下: 移动db服务器上的监听文件,如下命令: [oracle@ENMOEDU ...

  8. oracle sqlnet配置,sqlnet.ora文件配置详解

    一.于sqlnet.ora的说明: *****************************************************FROM ORACLE11G DOCS********** ...

  9. oracle12c ora 12560,oracle11g报ora-12560:tns连接异常的解决方法

    1. 找到listener.ora监听文件,具体位置:D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora 2 ...

最新文章

  1. 使用docker toolbox 在windows上搭建统一环境
  2. linux tunnel 与cisco 三层交换机的tunnel互联
  3. AbilitySlice之间的回传值
  4. SAP CRM WebClient UI和Hybris Commerce里的跨组件跳转
  5. OpenShift 4 - Knative教程 (7) Eventing之Broker和Trigger
  6. postgresql 连接超时_关于超时:如何自动关闭PostgreSQL中的空闲连接?
  7. 《Java 7程序设计入门经典》一1.10 另一种数据类型
  8. java的IO操作之--RandomAccessFile
  9. Python3 面向对象之:多继承
  10. 考研辅导c语言程序设计真题,全国名校C语言程序设计考研真题汇编
  11. Systemview5安装的问题:the license for this version of systemview has expired......
  12. python之词频统计
  13. 洛谷 P4093 [HEOI2016/TJOI2016]序列 k-d tree
  14. bzoj3654 图样图森破
  15. 知识经济杂志知识经济杂志社知识经济编辑部2022年第33期目录
  16. /etc/issue和/etc/motd
  17. Apache apollo 配置说明及用户名和密码管理
  18. 身份管理的15个安全开发实践
  19. NOIP 为什么要学 数学
  20. PSPICE理想恒功率负载(CPL)建立方法

热门文章

  1. mysql filck_顺序全局id生成方案-flickr(转载)
  2. feign直接走熔断_SpringCloud微服务(03):Hystrix组件,实现服务熔断
  3. linux安装了xml怎么编译,linux下libxml库的安装及编译
  4. python列表赋值 连续整数_Python_03_字符串_数据类型_for循环_列表操作
  5. python定义变量名的时候、需要注意问题_第39p,Python模块的名称空间问题,应该讲完了吧...
  6. 400集python入门到精通_2020年最强Python学习路线+教程,400集带你从入门到精通
  7. 电子商务数据挖掘python案例_精心整理!9个 Python 实用案例分享!
  8. 《天天数学》连载32:二月一日
  9. Spring Boot基础学习笔记14:实现文件上传功能
  10. Spring框架学习笔记03:初探Spring——利用注解配置类取代Spring配置文件