3

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

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

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

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

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

4

2 回答 2

0

不是一个大粉丝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);


/
于 2012-07-18T04:01:54.533 回答
0

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

于 2013-10-16T02:40:23.457 回答