2011-02-03 9 views
1

誰もが次のエラーを投げる断続的に続いほとんどの時間を動作するように固定されたクエリ(静的な最終文字列)を引き起こすことができるか知っているん:断続的ORA-00904:無効な識別子

Inner cause: java.sql.SQLException: ORA-00904: : invalid identifier

クエリがありますJDBC接続を介して実行されます。

ここで不思議なことは、識別子が空であり、クエリが断続的に機能することです。ログアウトされたSQLをplsqlデベロッパーで実行すると、すべて正常に動作します。

アイデア?

ここにクエリがあります。セキュリティ上の理由から難読化されています。

SELECT b.field1, 
     b.field2, 
     b.field3, 
     my_func(b.field4, ?, nvl2(b.field5, 1, 0)) cardnumber, 
     b.field6, 
     b.field7, 
     b.field8, 
     b.field9, 
     b.field10, 
     b.field11, 
     b.field12, 
     b.field13, 
     b.field14, 
     b.field15, 
     b.field16, 
     b.field17, 
     b.field18, 
     b.field19, 
     b.field20, 
     b.field21, 
     b.field22, 
     b.field23, 
     b.field24, 
     b.field25, 
     b.field26, 
     my_func(b.field27, ?, nvl2(b.field28, 1, 0)) account_number, 
     b.field29, 
     s.field30 source_name, 
     b.field31 
    from table1 b 
    left join table2 s 
    on b.source_id = s.source_id 
where b.fieldx in 
     (select fieldx from tablex where fieldy = ?) 
    and customer_id = ? 
    and state not in (7, 12, 1, 3, 13) 
UNION 
SELECT b.field1, 
     b.field2, 
     b.field3, 
     my_func(b.field4, ?, nvl2(b.field5, 1, 0)) cardnumber, 
     b.field6, 
     b.field7, 
     b.field8, 
     b.field9, 
     b.field10, 
     b.field11, 
     b.field12, 
     b.field13, 
     b.field14, 
     b.field15, 
     b.field16, 
     b.field17, 
     b.field18, 
     b.field19, 
     b.field20, 
     b.field21, 
     b.field22, 
     b.field23, 
     b.field24, 
     b.field25, 
     b.field26, 
     my_func(b.field27, ?, nvl2(b.field28, 1, 0)) account_number, 
     b.field29, 
     s.field30 source_name, 
     b.field31 
    from table1 b 
    left join table2 s 
    on b.source_id = s.source_id 
    where b.field3 in 
     (select fieldx from table7 where fieldy = ?) 
    and customer_id = ? 
    and state in (1, 3) 
    AND (b.field1 not in 
     (select b.fieldx 
      from table1 b, 
       table3 sb, 
       table4 sba 
      where b.source_id = sb.source_id 
      and sb.attribute_id = sba.attribute_id 
      and sba.name = 'HIDE_IN_MENU' 
      and b.customer_id = ?)) 
+0

あなたはSQLを投稿できますか? – gnuchu

+0

あなたの識別子を特定させてもらえますか – V4Vendetta

+0

難読化されたバージョンのSQLを追加しました – Ellis

答えて

0

これは、ほとんどの場合に役立ちます、共有プールをフラッシュするようにしてください などのバグ5355253の種類、5458021、5717746のように見えます。そうでなければ、DBMSのバージョンやプラットフォームのような追加情報を提供することができます。

+0

これらのバグの詳細はどこから知ることができますか? – Ellis

+0

oracleサポートポータルに関する詳細はこちら –

+0

私をポータルにログインさせる人を見つけ出すために管理されています...特に、観察された動作が断続的であることを考えると、欠陥の説明は正しく表示されます。原因が絞り込まれ、結果が更新されたときに、共有プールをフラッシュする推奨されるアプローチの1つを試みます。これまでの指摘に感謝します。 – Ellis

1

ステートメントはどのように実行されますか? 問題を引き起こす可能性のある変数のバインディングではなく、連結の形式がある場合。おそらく、バインド値が定義されていないか、そこにいくつかのジャンク値があります。

呼び出し元の文ではなく、MY_FUNCの実行中にエラーが発生している可能性があります。

+0

連結がありますが、フィールドと本体だけがあります。それ以外の場合は、変数バインディングが使用されます。 – Ellis

0

Oracle 10gとjavaを使用して同様の問題が発生しましたが、次の行にPesonIDを使用するとエラーが発生していました。

String sql= "SELECT * FROM Person where PersonID=?"   

しかし、次のように使用したときはうまくいきました。

String sql = "SELECT * FROM Person where \"PersonID\"=?" 

したがって、キーはそれらの余分な引用符です。

関連する問題