3

データベースは 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);
/

この場合、UNION の各部分から 1 行ずつ、合計 2 行を返します。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 番目の例だけが壊れているということです。たとえば、上記の例 2 のクエリを使用して、共用体の両側から doc_name フィールドを削除すると、すべてが突然再び機能します。または、utl_raw.cast_to_varchar2 ビットまたはユニオン自体を削除した場合 (および各部分を個別に実行した場合)。UNION、AND 句、および関数呼び出しの正確な組み合わせが壊れているだけです。

バグ 6038461、「UNION と高速な DUAL サブクエリを使用した SQL の結果が正しくない」ではないかと誰かが示唆していましたが、それは適切ではないと思います。

2番目のクエリで何が起こっているのか、誰にも手がかりがありますか?

PS TOADにはエラーがないことを追加する必要があります-クエリは正常に実行されます...

4

2 に答える 2

0

空行があるため、機能しないと思います。SQLPlus はそれらを嫌います。

于 2013-10-16T02:40:23.457 に答える
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 に答える