zoukankan      html  css  js  c++  java
  • Hierarchy Query (Connect by) and ORA600 ([kkqcbydrv:1])

    在尝试把一个树形查询的SQL中引用的一张表换成视图的时候,居然出现了Oracle internal error (ORA-00600)! 如下,

    原来的SQL...

    SELECT E.CODE AS CHILD_CODE,
    E.SHORT_NAME
    || ' (' || E.CODE || ')' AS CHILD_NAME,
    E.SHORT_NAME
    AS SHORT_NAME,
    EL.LINK_WEIGHT
    / 100 AS LINK_WEIGHT
    FROM XX_ENTITY E,
    (
    SELECT CHILD_CODE,
    LINK_WEIGHT
    FROM XX_ENTITY_LINKS
    START
    WITH MOTHER_CODE = 2
    CONNECT
    BY MOTHER_CODE = PRIOR CHILD_CODE
    ) el
    WHERE E.CODE = EL.CHILD_CODE

    这个SQL运行的很正常,现在打算将表XX_ENTITY换成视图V_XX_ENTITY_LINKS,如下...

    SELECT E.ENTITY_CODE AS CHILD_CODE,
    E.SHORT_NAME
    || ' (' || E.ENTITY_CODE || ')' AS CHILD_NAME,
    E.SHORT_NAME
    AS SHORT_NAME,
    EL.LINK_WEIGHT
    AS LINK_WEIGHT
    FROM XX_ENTITY E,
    (
    SELECT CHILD_CODE,
    LINK_WEIGHT
    FROM V_XX_ENTITY_LINKS
    START
    WITH MOTHER_CODE = '2'
    CONNECT
    BY MOTHER_CODE = PRIOR CHILD_CODE
    ) el
    WHERE E.ENTITY_CODE = EL.CHILD_CODE;

    居然碰到了如下错误信息...

    ORA-00600: internal error code, arguments: [kkqcbydrv:1], [], [], [], [], [], [], []
    00600. 00000 - "internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]"
    *Cause: This is the generic internal error number for Oracle program
    exceptions. This indicates that a process has encountered an
    exceptional condition.
    *Action: Report as a bug - the first argument is the internal error number

    视图V_XX_ENTITY_LINKS其实还蛮简单的,如下,

    CREATE OR REPLACE VIEW V_XX_ENTITY_LINKS
    AS
    select
    (
    select e.entity_code from xx_entity e where e.id = el.mother_code) as mother_code,
    (
    select e.entity_code from xx_entity e where e.id = el.child_code) as child_code,
    el.type,
    el.LINK_WEIGHT
    /100 as LINK_WEIGHT
    FROM
    XX_ENTITY_LINKS el;

    网上看到有人提到通过可以设置隐含参数_optimizer_connect_by_cost_based来避免这个问题(需要用引号将隐含参数包含起来),如下所示...

    SQL> alter session set _optimizer_connect_by_cost_based = false;
    alter session set _optimizer_connect_by_cost_based = false
    *
    ERROR at line
    1:
    ORA
    -00911: invalid character


    SQL
    > alter session set "_optimizer_connect_by_cost_based" = false;

    Session altered.

    不过既然是隐含参数,自然是不推荐来更改的。最好还是老老实实改SQL语句来的放心。

    在"Breaking Oracle"中看到这个问题是Oracle的一个bug, bug number 是 6073325。 不过这个bug好像在Oracle 11.1.0.7 patch set 里面给修正了,参见这里


    看下在11.1.0.6.0版本的数据库中的行为,

    frank@ORCL> select * from v$version;

    BANNER
    --------------------------------------------------------------------------------
    Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
    PL
    /SQL Release 11.1.0.6.0 - Production
    CORE
    11.1.0.6.0 Production
    TNS
    for 32-bit Windows: Version 11.1.0.6.0 - Production
    NLSRTL Version
    11.1.0.6.0 - Production

    frank
    @ORCL> select 1 from sys.table_privileges tp, user_objects uo
    2 where tp.grantee in
    3 (select 1 from sys.dba_role_privs
    4 connect by prior granted_role = grantee
    5 start with grantee = 'scott');
    select 1 from sys.table_privileges tp, user_objects uo
    *
    ERROR at line
    1:
    ORA
    -00600: internal error code, arguments: [kkqcbydrv:1], [], [], [], [], [], [], []

    可以看到这个问题还是存在的。但是将数据库升级到11.2.0.1.0就发现这个问题不存在了,如下所示...

    frank@ORCL> select * from v$version;

    BANNER
    --------------------------------------------------------------------------------
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    PL
    /SQL Release 11.2.0.1.0 - Production
    CORE
    11.2.0.1.0 Production
    TNS
    for 32-bit Windows: Version 11.2.0.1.0 - Production
    NLSRTL Version
    11.2.0.1.0 - Production

    frank
    @ORCL> select 1 from sys.table_privileges tp, user_objects uo
    2 where tp.grantee in
    3 (select '1' from sys.dba_role_privs
    4 connect by prior granted_role = grantee
    5 start with grantee = 'scott');

    no rows selected






    --------------------------------------
    Regards,
    FangwenYu
  • 相关阅读:
    Linux中touch和mkdir、vi的区别
    宿主机和虚拟机的IP地址和端口号的区别
    测试环境
    Fiddler
    Linux 常用指令
    测试环境的网址与账号密码
    书签
    快速寻找满足条件的两个数
    android 资讯阅读器(二)
    android 资讯阅读器
  • 原文地址:https://www.cnblogs.com/fangwenyu/p/1898841.html
Copyright © 2011-2022 走看看