web-dev-qa-db-ja.com

列が存在する場合でもORA-00904があるのはなぜですか?

Hibernate sqlクエリの実行中にエラーが表示されます。

Java.sql.SQLException:ORA-00904: "table_name"。 "column_name":無効な識別子

Sqldeveloperでテーブルを開くと、列が存在します。

エラーはPRODでのみ発生し、DEVでは発生しません。

何を確認する必要がありますか?

27
Victor

大文字と小文字の区別の問題である可能性があります。通常、テーブルと列は大文字と小文字を区別しませんが、引用符を使用すると区別されます。例えば:

create table bad_design("goodLuckSelectingThisColumn" number);
26
Jon Heller

実行ユーザーがクエリに関係するオブジェクトに対する適切な権限を持っていない場合、OracleはORA-00904をスローします。

7
vls

これは、同じ永続データベーステーブルで2つのエンティティを誤って定義したときに起こりました。一方のテーブルには問題の列が存在し、もう一方には存在しませんでした。 (基礎となる誤ったデータベーステーブルを参照するタイプの)オブジェクトを永続化しようとしたときに、このエラーが発生しました。

6
johanwannheden

「columnName」のように、二重引用符の間に列名を記述します。

エラーメッセージに、記述した文字とは異なる大文字と小文字が表示されている場合、SQLクライアントが自動的に大文字と小文字を変換している可能性が非常に高くなります。それを回避するには二重引用符を使用します。 (これはSquirrell Client 3.0で機能します)。

4
Arc

これは、列が作成されたDBの1つで、名前が大文字と小文字を区別するためです。

Oracleテーブルの列名:GoodRec Hiveは大文字と小文字を区別できません:エラーがスローされました-原因:Java.sql.SQLSyntaxErrorException:ORA-00904: "GOODREC":無効な識別子

解決策:Oracle列名をすべて大文字に変更します。

3
Piyush Ugale

Javaフィールドのクラスの列注釈の列注釈の位置を確認します。たとえば、3列(Name、Roll_No、Marks)の名前がSTUDENTである1つのテーブルを検討してください。

次に、Setterメソッドの代わりに、列Getterメソッドの前の注釈を追加したことを確認します。それはウルの問題を解決します@ Column(name = "Name"、length = 100)

**@Column(name = "NAME", length = 100)
public String getName() {**
    return name;
}

    public void setName(String name) {
    this.name= name;
}
2
yogi

ProdとDevのテーブル定義を比較しましたか?

また、SQL Developerで実行している場合、同じユーザーでProd(アプリケーションと同じデータベース)でクエリを実行していますか?

(alterコマンドを使用して)追加する追加の列がいくつかあり、これらの変更がまだprodに昇格されていない場合、この問題が発生する可能性があります。

テーブルの定義と実際のクエリを投稿できますか?

1

Toad for Oracleを使用します。テーブルの所有者がログインしているユーザーとは別のユーザー名であり、そのテーブルを読み取るためのアクセス権がある場合、元のテーブル所有者をテーブル名に追加する必要があります。

たとえば、テーブル所有者の名前が「OWNER1」であり、「USER1」としてログインしているとします。このクエリでは、ORA-00904エラーが発生する場合があります。

select * from table_name where x='test';

Table_nameの前にテーブル所有者を追加すると、エラーがなくなり、結果が得られます。

select * from 
0
Robert Wiley II