当前位置:首页 > 开发 > 数据库 > 正文

ORA-00600错误的出现与避免

发表于: 2010-01-08   作者:dinguangx   来源:转载   浏览次数:
摘要: 在使用oracle的递归查询时,出现一个内部错误: ORA-00600: 内部错误代码, 参数: [qkacon:FJswrwo], [0], [], [], [], [], [], [] 出现这个错误的查询SQL语句为: //根据流程实例ID查询流程实例信息及其父流程信息 SELECT pi.id_, pi.start_, pi.end_,
在使用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_
测试通过,才算得是功德圆满

ORA-00600错误的出现与避免

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
今天给客户做数据恢复,发现必须使用隐藏参数_allow_resetlogs_corruption,结果一用报出了ORA-0060
在1961年, 工业工程领域世界著名的品质管理专家新江滋生(Shingeo Shingo)先生根据其长期从事现场质
今天运行程序的时候,我的本意是想把有些东西归档起来,但程序突然爆出了错误,错误如下: 解决的办
每到晚上,我和朋友们围坐在一起玩桌面游戏时,我们会先放点音乐,吃点东西,然后就开始游戏了。一
安装绿色免安装的mysql时本人遇到好多问题,把好多大神的回复结合起来才解决了问题 当安装好mysql时
新建Servlet时出现错误,解决办法:在当前项目上右键单击,选择Properties,在弹出的对话框中选择Ta
本文讨论一些常见的MySQLC API 程序设计错误,以及如何避免其发生(这些问题在MySQL邮件清单中会周
日期:2013-2-3 来源:GBin1.com 1.不要忘记引号! font family: "Times New Roman", "Times Roman"
优化网站设计(二十二):避免404错误 前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有
在1961年, 工业工程领域世界著名的品质管理专家新江滋生(Shingeo Shingo)先生根据其长期从事现场质
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号