2

全て、

Oracle 11i データベースの SELECT クエリを作成する場合、Oracle の一部のテーブルでは、選択されているフィールドに引用符の適用が強制され、他のテーブルでは強制されないのはなぜですか。

私が最近遭遇した例:

Query Analyzer ウィンドウの Aqua Data Studio で、2 つの異なるテーブルから同じフィールドを選択しようとしました。

    select _id from table1
    select _id from table2

table1 と table2 は大きく異なりますが、table1 のみがこの select ステートメントをエラーなしで実行します。table2 に対してこのステートメントを実行しようとすると、次のようになります。

ORA-00904: "_ID": invalid identifier
Script line 1, statement line 1, column 7 

ただし、次のように 2 番目のステートメントを実行すると、完全に機能します。

    select "_id" from table2

ここで何が起こっているのか、なぜそうなのか、テーブル間の主な違いは何ですか?

ありがとう

4

2 に答える 2

4

大文字と小文字に関する回答とリンクは正しいですが、列名がアンダースコアで始まっていることと、クライアントが通常あなたからの引用を明らかに隠しているため、状況は単純なケースの問題を少し超えています。

という列を持つテーブルを_id引用符で囲まずに作成しようとすると、「ORA-00911: 無効な文字」エラーが発生し、その原因テキストには「識別子は文字以外の ASCII 文字で開始できない可能性があります」と表示されます。と数字'; 数字で始めることもできないため、これも実際には間違っています (たとえば、0_id「ORA-00904: : 無効な識別子」が返されます)。これは、データベース オブジェクトの命名規則によって裏付けられています。

引用符で囲まれていない識別子は、データベース文字セットのアルファベット文字で始まる必要があります。引用符で囲まれた識別子は、任意の文字で始めることができます。

したがって、Aqua Data Studio は、指定したオブジェクト名の大文字バージョンを二重引用符で囲むという規則に従っているようです。これは、リンクされた投稿の 1 つで言及されている方法です。

あなたが示したことからselect _id from ...select "_ID" from ...列名がとして作成された場合は問題ありません"_ID"。のケースのようですがtable1、 -table2として作成された"_id"ため、大文字と小文字の不一致により、表示されている正当な ORA-00904 が生成されます。

クライアントは、すでに二重引用符で囲まれている列名を変更していないため、select "_id" from ...そのまま Oracle に渡され、正常に動作しますtable2(ただし、逆に、 では失敗しtable1ます)。

Oracle では、名前が引用符なしの識別子の規則に従っていない場合、および引用符付きで作成された場合は、名前を二重引用符で囲む必要があります。列名がアンダースコアで始まるため、Oracle に関する限り、大文字と小文字を問わず、列へのすべての参照を二重引用符で囲む必要があります。自分で引用していない場合、クライアントはバックグラウンドでそれを行っているだけです。

引用符で囲まれた識別子を避け、引用符なしで有効な名前を常に使用するように他の人が与えたアドバイスに従って、このような問題を回避します。

于 2013-07-04T15:16:47.060 に答える