0

プレーン JDBC を介して Oracle 10g データベースにアクセスする SAP Netweaver にデプロイされた Java Web アプリケーションがあります。クエリが次のエラーを引き起こした数日前まで、アプリケーションは正常に動作していました。

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 ドライバーの問題でしょうか?

4

1 に答える 1

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_inspeccion元が であると仮定すると、dateを文字列に変換してから、日付に暗黙的に変換して固定値と比較しているようです。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')

...または元の日付列も取得し、それを使用して比較します。ただし、最も外側の他のすべての列をリストする必要があるかもしれませんselect。インデックスを使用している、または使用する予定がある場合は、fecha_inspeccionそれを文字列として扱うことによってパフォーマンスが低下する可能性もあります。

于 2012-05-03T16:51:37.550 に答える