hibernatesqlクエリの実行中にエラーが表示されます。
java.sql.SQLException:ORA-00904:"table_name"。"column_name":無効な識別子
sqldeveloperでテーブルを開くと、列が表示されます。
エラーはPRODでのみ発生し、DEVでは発生しません。
何を確認すればよいですか?
ORA-00904-invalid identifier
エラーは、大文字と小文字の区別の問題が原因であることがよくあります。通常、Oracle のテーブルと列では大文字と小文字が区別されず、句読点やスペースを含めることはできません。ただし、二重引用符を使用して引用された識別子を作成する場合、その識別子は常に二重引用符と正しい大文字小文字で参照する必要があります。例えば:
create table bad_design("goodLuckSelectingThisColumn " number);
ORA-00904
実行中のユーザーがクエリに関係するオブジェクトに対する適切な権限を持っていない場合、Oracleはスローします。
「columnName」のようにダブルクォーテーションで囲んで列名を記述します。
エラー メッセージに、入力したものとは異なる大文字と小文字が示されている場合は、SQL クライアントが大文字と小文字の自動変換を実行した可能性が非常に高くなります。それを回避するには、二重引用符を使用します。(これは Squirrell Client 3.0 で動作します)。
Prod と Dev のテーブル定義を比較しましたか?
また、SQL Developerで実行している場合、本番環境(アプリケーションと同じデータベース)で同じユーザーを使用して問合せを実行していますか?
(alter コマンドを使用して) 追加する列がいくつかあり、これらの変更がまだ prod にプロモートされていない場合、この問題が発生する可能性があります。
テーブルの定義と実際のクエリを投稿できますか?
多くの場合、Oracle がこのエラーをスローしているようです。
私にとってはusing
、結合部分の句で使用された列を修飾しようとしたため、スローされました。次の 2 つのいずれも機能しません。
select table1.x -- doesn't work
from table1
join table2 using (x);
select t1.x -- doesn't work
from table1 t1
join table2 t2 using(x);
これはusing
、テーブル名もエイリアスも使用せずに列 from 句を修飾できるためです。正しい方法は次のとおりです。
select x
from table1
join table2 using (x);
select x
from table1 t1
join table2 t2 using(x);
私は Toad for Oracle を使用していますが、ログインしたユーザー名とは別のユーザー名がテーブルを所有していて、テーブルを読み取るアクセス権がある場合でも、元のテーブル所有者をテーブル名に追加する必要がある場合があります。
たとえば、テーブル所有者の名前が「OWNER1」で、「USER1」としてログインしているとします。このクエリにより、ORA-00904 エラーが発生する場合があります。
select * from table_name where x='test';
table_name の前にテーブルの所有者を付けると、エラーが解消され、結果が得られます。
select * from
Oracle のシノニム宣言を確認します。以下のように PL/SQL 関数を呼び出していたところ、java.sql.SQLSyntaxErrorException: ORA-00904: 無効な識別子が返されました。
select oracle_my_pkg.notify_list_function from dual
oracle_my_pkg のパブリック シノニムを宣言した後、エラー メッセージが表示されなくなりました
データベースへのログインに使用されるユーザー名資格証明を確認してください。(persistence.xml ??)。ほとんどの問題は、データベースへのログインに使用されるユーザー名\パスワードが、オブジェクト (この場合は table_name) を認識できないことです。(データソースで利用可能な同じユーザー名\パスワードを使用して、SQL 開発者にログインしてみてください)