论坛首页 综合技术论坛

ORA-00600错误的出现与避免

浏览 2575 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-08   最后修改:2010-01-08
在使用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_
测试通过,才算得是功德圆满
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics