`
dinguangx
  • 浏览: 240709 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ORA-00600错误的出现与避免

阅读更多
在使用oracle的递归查询时,出现一个内部错误:

ORA-00600: 内部错误代码, 参数: [qkacon:FJswrwo], [0], [], [], [], [], [], []

出现这个错误的查询SQL语句为:
//根据流程实例ID查询流程实例信息及其父流程信息
SELECT pi.id_,
       pi.start_,
       pi.end_,
       pi.roottoken_,
       pi.superprocesstoken_
FROM jbpm_processinstance pi
WHERE pi.issuspended_ = 0
START WITH pi.id_ = 7211
CONNECT BY prior (SELECT t.processinstance_
              FROM jbpm_token t
             WHERE t.id_ = pi.superprocesstoken_) = pi.id
_
这段代码的作用就是想从JBPM流程中查找出业务的审批历史信息,由于子流程的存在,所以还要兼顾上级流程的信息。
仔细推敲此查询语句,并没有发现问题的所在,按常理推断,是不应该被SQL解释器拒之门外的,但是这个错误又是怎么出现的呢,继续推断,基本可以肯定的是:connect by不支持从多个表中取出来的记录,所以单张表的递归是没有问题的。另外,查找相关的资料后,发现这是ORACLE connect by 查询的一个BUG,请看下面这段说明:
引用
bug 6729992 - OERI [qkacon:fjswpri] during CONNECT BY query

Range of versions believed to be affected: Versions < 11.2
Versions confirmed as being affected: 10.2.0.3 & 10.2.0.4
Platforms affected: Generic (all / most platforms affected)
This issue is fixed in: 11.2 (Future Release) & 10.2.0.5 (Server Patch Set) & 11.1.0.7 (Server Patch Set)
Description:
Some CONNECT BY queries with "searched case" expressions
can fail with ORA-600 [qkacon:FJswpri].
Workaround:
Set "_optimizer_connect_by_cost_based" = false
被加粗标注出来的正是解决问题的办法,即修改系统参数中_optimizer_connect_by_cost_based的值为false,如下:
ALTER SESSION SET "_optimizer_connect_by_cost_based" = false;
再次运行上面的SQL语句,正常处理并得到正常的结果,问题得到解决。

但是,如果作为开发来说,不可能把这样的问题遗留到程序中去,这样的最终结果极有可能导致项目不能正常上线,因为开发环境和运行环境通常不是位于同一台机器上,为了让程序正常运行下去,你不得不记得修改运行环境的参数配置,这倒不是问题的根结,真正的问题在于如果参数被修改,造成的系统运行中不可预知的错误。
根据上面的那段英文描述,oracle应该会在11.2的版本中修改此BUG,但是现在在没有这个版本的前提下,只能另找他途,充分发挥大家的聪明才智之后,最后找到一个圆满解决此问题的办法,那就是修改SQL语句:
SELECT pi.id_,
       pi.start_,
       pi.end_,
       pi.roottoken_,
       pi.superprocesstoken_
FROM jbpm_processinstance pi
WHERE pi.issuspended_ = 0
START WITH pi.id_ = 7211
CONNECT BY prior pi.superprocesstoken_ = pi.roottoken_
测试通过,才算得是功德圆满
分享到:
评论

相关推荐

    Oracle-03113错误详细分析与解决办法

    每一个DBA在进行数据库管理的过程中不可避免的要遇到形形色色的错误(ORA- 1547 ,ORA-904,ORA-1578 ......)。有些错误由于频繁出现、原因复杂而被 Oracle DBA 们戏称之为\\\\\\\"经典的错误\\\\\\\"。其中ORA-3113 \\...

    [Oracle] 浅析令人抓狂的ORA-01555问题

    因此,在数据库的日常维护工作中,如果只是一次两次碰到ORA-01555错误,一般都先忽略,但是如果经常碰到该错误,则要进行一些调整以避免该错误的再次发生。 1. 为什么会产生ORA-01555错误?这个错误是由数据库的读...

    一种PL/SQL程序包失效的解决方案

    针对pl/sql 程序包在运行中有时会出现"程序包失效"的异常情况,通过深入分析该错误与对象依赖机制、自动重编机制和程序包运行机制的关系,结合3个不同的实验,证实了该错误与程序包中全局变量/常量的独有特性有关,...

    Oracle9i的init.ora参数中文说明

    说明: (如果值为 TRUE) 当在隐式转换中丢失数据时返回错误的参数。 值范围: FALSE | TRUE 默认值: TRUE nls_numeric_characters: 说明: 指定将用作组分隔符和小数位的字符。组分隔符就是用来分隔整数位组 (如千, ...

    oracle详解

    对于越来越大的数据库,特别是TB级数据库和越来越多数据仓库的出现,EXP/IMP越来越力不从心了,这个时候,数据库的备份都转向了RMAN和第三方工具。下面说明一下EXP/IMP的使用。  如何使exp的帮助以不同的字符集显示...

    Oracle 10g 学习笔记

    │ 手工配置listener.ora【避免出现ORA-12514错误】.txt │ 贴子树状态存储结构.jpg │ 贴子树状态存储结构.sql │ ├─01 Oracle入门 │ 01 Oracle 简介.txt │ 02 Oracle安装.txt │ 03 sqlplusw的使用.txt │ ...

    java源码嵌套for循环-cobol-sharp:Cobol代码重新可视化

    循环的java源码压缩科博夏普 这是一种从根据 80 年代中期最佳实践编写的 ...中,最好将if块限制为几个简单的语句,避免任何嵌套的if因为这可能最终会将else块与错误的if相关联。 除了重复执行另一个

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    13.1.4 DML错误日志 364 13.2 UPDATE 371 13.3 DELETE 376 13.4 MERGE 380 13.4.1 语法和用法 380 13.4.2 性能比较 383 13.5 小结 385 第14章 事务处理 386 14.1 什么是事务 386 14.2 事务的ACID属性 387 ...

    ORACLE9i_优化设计与系统调整

    §6.3.5 避免常见错误 90 第二部分 ORACLE应用系统设计优化 91 第8章ORACLE数据库系统优化安装 91 §7.1 应用系统环境规划和Oracle系统安装考虑 91 §7.1.1 操作系统安装考虑 91 §7.1.2 Oracle系统安装考虑 92 §...

    Toad 使用快速入门

    在运行出现错误时,存储过程停止到有问题的语句。用户可以使用快捷方式或模板来快速编写PL/SQL,也可以根据需要生成自己的模板。使用Toad可以非常方便地进行编辑工作,可如设置书签、取消注释、格式化SQL语句等等。 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     删除HKEY_CLASSES_ROOT目录下所有以Ora、Oracle、Orcl或EnumOra为前缀的键。  删除HKEY_CURRENT_USER/SOFTWARE/Microsoft/windows/CurrentVersion/Explorer/MenuOrder/Start Menu/Programs中所有以oracle 开头...

    数据库系统安全策略.doc

    系统管理员在给操作系统做维护的时候,需要与数据库管理员合作,避免。 第二,数据安全策略。 数据安全策略决定了可以访问特定数据的用户组,以及这些用户的操作权限。 数据的安全性取决数据的敏感程度,如果数据...

Global site tag (gtag.js) - Google Analytics