2012-05-03 10 views
0

SAP NetweaverにデプロイされたJava Webアプリケーションで、プレーンJDBCを介してOracle 10gデータベースにアクセスしています。アプリケーションは、クエリが次のエラーの原因となった時に、数日前までは正常に動作したORA-01843:Javaアプリケーションで有効な月がありません

ORA-01843: not a valid month 

私たちに迷惑を与えているクエリはこれです:

SELECT * 
FROM (SELECT * 
     FROM (SELECT inspeccion.sociedad_id, 
         inspeccion_id, 
         estado_id, 
         (SELECT des_estado 
         FROM estado 
         WHERE estado.estado_id = inspeccion.estado_id) 
         des_estado, 
         (SELECT numero_secuencia 
         FROM estado 
         WHERE estado.estado_id = inspeccion.estado_id) 
         numero_secuencia, 
         planta_id, 
         (SELECT des_planta 
         FROM planta 
         WHERE planta.planta_id = inspeccion.planta_id) 
         des_planta, 
         area_id, 
         (SELECT des_area 
         FROM area 
         WHERE area.area_id = inspeccion.area_id)  des_area 
         , 
         igp_id, 
         '-' 
         nom_lider, 
         nom_inspector, 
         nom_responsable, 
         To_char(fecha_inspeccion, 'DD/MM/YYYY') 
         fecha_inspeccion, 
         observacion, 
         recomendacion 
       FROM inspeccion) inspeccion) t_inspeccion 
WHERE estado_id NOT IN (10) 
     AND t_inspeccion.estado_id IN (11, 12) 
     AND t_inspeccion.planta_id = 42 
     AND t_inspeccion.fecha_inspeccion >= To_date('01/11/2010', 'dd/mm/yyyy') 
     AND t_inspeccion.sociedad_id = '0101' 
ORDER BY t_inspeccion.numero_secuencia, 
      t_inspeccion.fecha_inspeccion 

我々はTo_date('01/11/2010', 'dd/mm/yyyy')声明を疑いました。 DBVisualizerを使用して問合せを実行すると、全く問題はありません。

私はここで迷っています。たぶん、DB設定がクエリや、いくつかのSAP Netweaverの設定を乱しているのでしょうか?または、おそらくいくつかのOracleドライバの問題?ネストされたで

+0

どのデータ型が 'fecha_inspeccion'ですか? 'inspeccion'はテーブルかビューですか? –

+0

Inspeccionはテーブルであり、fecha_inspeccionにはDATEデータ型があります。 –

答えて

5

それはあなたが持っているt_inspeccionなり選択:

To_char(fecha_inspeccion, 'DD/MM/YYYY') fecha_inspeccion, 

を...そしてあなたが持っている外where句で:

AND t_inspeccion.fecha_inspeccion >= To_date('01/11/2010', 'dd/mm/yyyy') 

inspection.fecha_inspecciondateであると仮定すると、あなたは、文字列に変換されているように見えてから、暗黙的に日付に戻って固定値と比較します。私は、t_inspeccion.fecha_inspeccionの暗黙の変換が予期せぬNLS_DATE_FORMAT設定からエラーを投げていると思われます。これは通常Javaであなたのロケールから取得されます。私はMM/DD/YYYYを暗黙的に使用していますが、他の何かになる可能性があると思います。

結果にテキスト形式が特に必要な場合を除き、私はto_char()を持っていた理由は全く分かりません。その場合、あなたは明示的where節に戻って日付を変換する必要があります。

AND To_date(t_inspeccion.fecha_inspeccion, 'dd/mm/yyyy') 
    >= To_date('01/11/2010', 'dd/mm/yyyy') 
...かは、同様に、元の日付列を引っ張って、それを使用して比較します。それはおそらく、最も外側のすべての列をリストする必要があります selectfecha_inspeccionのインデックスを使用している、または予想される場合は、文字列として扱うことでパフォーマンスが低下する可能性があります。

+0

+1、良いキャッチ。 –

+0

私は修正を試みます、そして、私はそれがうまくいくと確信しています。ありがとう! –

+0

私はNLS_DATE_FORMATを明示的に変更しても、私のOracle関数はこのエラーを返します。ついに、私は実行中のマシンからいくつかのoracleレジストリをコピーしました。今まで働いていたようだ。もう一度遭遇しないことを願っています。 –

関連する問題