这是一个可能的 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 错误还是我遗漏了啥?的主要内容,如果未能解决你的问题,请参考以下文章
AsyncTask 真的在概念上存在缺陷还是我只是遗漏了啥?