这是一个可能的 Oracle 错误还是我遗漏了啥?

Posted

技术标签:

【中文标题】这是一个可能的 Oracle 错误还是我遗漏了啥?【英文标题】:Is this a possible Oracle bug or am I missing something?这是一个可能的 Oracle 错误还是我遗漏了什么? 【发布时间】:2012-06-22 16:21:36 【问题描述】:

数据库是 Oracle 10.2.0.1.0 - 在 Red Hat Enterprise Linux ES 第 4 版(Nahant Update 8)上运行的 64 位

在 SQL*Plus 中,以下代码完美运行:

var comment_id number
exec :comment_id := 3052753
select e.label as doc_name,
           e.url,
           i.item_id,
           'multi' as form_type
    from cr_items i, cr_extlinks e
    where i.parent_id = :comment_id
    and e.extlink_id = i.item_id
   UNION
    select null as doc_name,
           utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(r.content, 2000, 1))  as url,
           r.item_id,
           'single' as form_type
    from cr_revisions r
    where r.revision_id = content_item.get_latest_revision(:comment_id);
/

在这种情况下,它返回 2 行,从 UNION 的每个部分返回 1。 如果我如下更改对 content_item.get_latest_revision 的调用,它会中断如下:

var comment_id number
exec :comment_id := 3052753
select e.label as doc_name,
          e.url,
           i.item_id,
           'multi' as form_type
    from cr_items i, cr_extlinks e
    where i.parent_id = :comment_id
    and e.extlink_id = i.item_id
   UNION
    select null as doc_name,
           utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(r.content, 2000, 1))  as url,
           r.item_id,
           'single' as form_type
    from cr_revisions r
    where r.revision_id = ( select content_item.get_latest_revision(:comment_id) 
                          from dual);

/

错误:

SQL> where r.revision_id = ( select content_item.get_latest_revision(:comment_id) from dual)
                                               *
ERROR at line 14:
ORA-00904: : invalid identifier

现在,这段 SQL 真正令人疯狂的是,上面的第二个示例是 only 中断的情况。例如,如果我采用上面示例 2 中的查询并从联合的两侧删除 doc_name 字段,那么一切都会突然恢复正常。或者,如果我删除 utl_raw.cast_to_varchar2 位或联合本身(并分别运行每个部分)。正是 UNION、AND 子句和函数调用的精确组合会中断。

有人建议它可能是错误 6038461,“使用 UNION 和快速 DUAL 子查询的 SQL 结果错误”,但我认为这不太合适。

有人知道第二个查询是怎么回事吗?

PS 我应该补充一点,在 TOAD 中没有错误 - 查询运行良好...

【问题讨论】:

同意 6038461 现在看起来不太合适;在previous question 中,不清楚是错误还是给出了错误的结果。我很确定这是 a 错误,但看不到完全匹配。您可能需要向 Oracle 提出服务请求。 完全摸不着头脑,鉴于查询在 TOAD 中运行良好,您使用的是什么版本的 SQL Plus? 您运行的是未打补丁的 10gR2 版本。这是为什么呢? @IanCarpenter 感谢 cmets。 SQL*Plus 版本:发布 10.2.0.1.0 这是一个令人困惑的问题,因为查询从 TOAD 运行良好,这表明数据库优化器可以很好地处理该语句。会话与 SQLPlus 有何不同。我会运行 10046 和 10053 事件跟踪,并打开来自 Oracle 的服务请求,尽管他们会建议至少修补到 10.2.0.4。 【参考方案1】:

不是AND/WHERE column = (SELECT column....) 的忠实粉丝,整体上写AND/WHERE column IN (SELECT column...) 更好。但在您的情况下,子查询中似乎不可能有多行或多列。怎么样-

var comment_id number
exec :comment_id := 3052753
select e.label as doc_name,
          e.url,
           i.item_id,
           'multi' as form_type
    from cr_items i, cr_extlinks e
    where i.parent_id = :comment_id
    and e.extlink_id = i.item_id
   UNION
    select null as doc_name,
           utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(r.content, 2000, 1))  as url,
           r.item_id,
           'single' as form_type
    from cr_revisions r
    where r.revision_id IN ( select content_item.get_latest_revision(:comment_id) 
                          from dual);

/

var comment_id number
exec :comment_id := 3052753
select e.label as doc_name,
          e.url,
           i.item_id,
           'multi' as form_type
    from cr_items i, cr_extlinks e
    where i.parent_id = :comment_id
    and e.extlink_id = i.item_id
   UNION
    select null as doc_name,
           utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(r.content, 2000, 1))  as url,
           r.item_id,
           'single' as form_type
    from cr_revisions r
    where EXISTS (select 'x'
                   from dual
                    where content_item.get_latest_revision(:comment_id) =r.revision_id);


/

【讨论】:

【参考方案2】:

我认为它不起作用,因为你有一个空行; SQLPlus 讨厌他们。

【讨论】:

以上是关于这是一个可能的 Oracle 错误还是我遗漏了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 新手,不确定我是不是“遗漏”了啥

AsyncTask 真的在概念上存在缺陷还是我只是遗漏了啥?

我在我的功能中遗漏了啥吗?

我是不是遗漏了啥或者这是创建自定义控件/组件的方式

我在编写代码以检索 IOS 资产库时遗漏了一个步骤,但我遗漏了啥?

淘汰赛验证异步验证器:这是一个错误还是我做错了啥?