17

ORA-00918 が発生することを期待する Oracle の奇妙な動作に遭遇しましたが、そうではありません。たとえば、このクエリを考えてみましょう。

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'

このクエリは、トリガーが無効になっているテーブルの詳細を概念的に探していますが、これは私が解決しようとしている問題ではないことに注意してください。この問題は、このクエリ、データ ディクショナリ、ビュー、またはテーブルに固有のものではありません。私が知る限り、テーブルまたはビューの任意のセットに適用されます (私が試した 2 つまたは 3 つから)。

とにかく、このクエリを実行しようとすると、ORA-00918 が返されます。これは、句を実行するためのクエリを取得するために、と の両方USER_TABLESにsoUSER_TRIGGERSという列があるため、に変更する必要があるためです。わかりました。代わりに、別のテーブルに参加してみてください。STATUSWHERETRG.STATUS

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'

このクエリは、どの STATUS 列を意味するかを修飾することなく、魔法のように機能します! セマンティクスやクエリが返すものは気にしないでください。エラーはありません。 USER_CONSTRAINTStooと呼ばれる列もありSTATUSますが、選択する列が 2 つある場合に何をすべきかわからないのはなぜですか。

ちなみに、これはすべて10.2.0.3.0であり、クエリに2つ以上のテーブルがある場合、本質的にORA-00918の発生が停止します。これが Oracle のバグである場合、それがいつ修正されたのか、データベースがアップグレードされた場合にカウボーイ クエリが失敗する可能性が高い Oracle のバージョンを知っている人はいますか?

アップデート

バグが 11.2.0.1.0 で修正されたことを実証してくれた BQ に感謝します。以前のバージョンで修正されたことを示すことができる人には報奨金があります!

4

5 に答える 5

13

Oracleサポートを検索すると、次のことがわかりました。

バグ 5368296 - ANSI 結合 SQL は、あいまいな列に対して ORA-918 を報告しない場合がある [ID 5368296.8]

影響を受けることが確認されているバージョン:

  • 10.2.0.3
  • 10.2.0.4

この問題は、

  • Windows プラットフォームでの 10.2.0.4 パッチ 2
  • 10.2.0.5 (サーバー パッチ セット)
  • 11.1.0.6 (基本リリース)

詳細を表示するにはOracleサポートアカウントが必要なので、それ以上は投稿しませんが、影響を受けるOracleバグ番号/バージョンを共有して、Oracleサポートで正しい方向性を示すことができると考えました.

于 2010-11-29T17:38:31.330 に答える
8

いつ修正されたかはわかりませんが、私の結果は次のとおりです。

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> SELECT *
  2  FROM USER_TABLES TAB
  3  JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
  4  WHERE STATUS = 'DISABLED';
WHERE STATUS = 'DISABLED'
      *
ERROR at line 4:
ORA-00918: column ambiguously defined

SQL> ed
Wrote file afiedt.buf

  1  SELECT *
  2  FROM USER_TABLES TAB
  3  JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
  4  JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
  5* WHERE STATUS = 'DISABLED'
SQL> /
WHERE STATUS = 'DISABLED'
      *
ERROR at line 5:
ORA-00918: column ambiguously defined
于 2010-11-24T16:53:03.747 に答える
2

ANSI SQL を使用しています。where句のSTATUSを駆動テーブルに関連付けていると思います。

「oracle」構文を使用すると、期待どおりの動作が見られます。

SELECT *
FROM USER_TABLES TAB, USER_TRIGGERS TRG, USER_CONSTRAINTS CON
WHERE TRG.TABLE_NAME = TAB.TABLE_NAME
AND CON.TABLE_NAME = TAB.TABLE_NAME
AND STATUS = 'DISABLED'
于 2010-11-24T16:52:21.327 に答える
1

これに関するより多くの確認済みのバグ: http://oracledoug.com/serendipity/index.php?/archives/1555-Bug-Hunting.html

最新の更新では、11.2.0.2 で修正されています。

于 2012-02-28T16:57:12.160 に答える