2012-05-03 47 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運行查詢時,我們完全沒有問題。

我有點迷失在這裏。也許有一個數據庫設置與查詢或一些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') 

...或拉原來的日期欄,以及和使用比較;儘管這可能需要您列出最外面的所有其他列select。如果您正在或期望使用fecha_inspeccion上的索引,那麼您可能會通過將其視爲字符串來降低性能。

+0

+1,很好。 –

+0

我會嘗試修復,我很確定它會工作。謝謝! –

+0

儘管我明確地修改了NLS_DATE_FORMAT,但是我的oracle函數返回了這個錯誤。最後,我將一些oracle註冊表從一臺正在運行的機器複製到那臺機器上。似乎工作到現在。希望不要再遇到。 –

相關問題