浏览 2575 次
锁定老帖子 主题:ORA-00600错误的出现与避免
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-08
最后修改:2010-01-08
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
被加粗标注出来的正是解决问题的办法,即修改系统参数中_optimizer_connect_by_cost_based的值为false,如下:
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 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_测试通过,才算得是功德圆满 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |