2013-05-04 87 views
4

當我嘗試執行下面的代碼時,它給我一個java.sql.SQLException: ORA-01861: literal does not match format string錯誤。「文字不匹配格式字符串」錯誤

我試圖從customer1_details表中複製一些列值到customer2_details表。列的數據類型而我試圖移動是TIMESTAMP(6)TIME_REGISTEREDDATE_DISCHARGED列和DATE_OF_BIRTH列的數據類型是DATE

try 
    { 
     Connection conn=Address.getOracleConnection(); 
     int id = 1;  
     Date dob = null; 
     Timestamp timereg = null,datedischarged = null; 

     Statement stmt=conn.createStatement(); 
     ResultSet res=stmt.executeQuery("SELECT TIME_REGISTERED,DATE_DISCHARGED,DATE_OF_BIRTH from customer1_details WHERE customer_id = '"+id+"' "); 
      if(res.next()) 
      {  
       timereg=res.getTimestamp("TIME_REGISTERED");   
       datedischarged=res.getTimestamp("DATE_DISCHARGED"); 
       dob=res.getDate("DATE_OF_BIRTH");  
      }    

      String sql1="INSERT INTO customer2_details(TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID) " 
    + "VALUES('"+timereg+"','"+datedischarged+"','"+dob+"','"+id+"') "; 

     PreparedStatement pst=conn.prepareStatement(sql1); 
     pst.executeUpdate(); 
     pst.close();  
     conn.close(); 
    } 
    catch(Exception e) 
    {   System.out.print(e);   } 

這將是更有幫助,如果有人提供了答案without using INSERT INTO ... SELECT ... statement

+0

爲什麼不把它當作一個語句:'INSERT INTO ... SELECT ...'? – Barmar 2013-05-04 19:30:16

+1

我認爲這個錯誤意味着Java連接字符串時使用的日期格式與Oracle在解析日期時所能理解的語法不匹配。如果您想這樣做,您需要按照Oracle瞭解的方式明確格式化日期。 – Barmar 2013-05-04 19:32:33

+0

我的實際查詢有點複雜,我正在收集多個表中的數據,然後將這些數據插入到customer2_details表中。除了我的問題中提供的以上三列以外的所有其他列不會發生任何錯誤 – Akki 2013-05-04 19:33:06

回答

2

你可以像查詢做在一個聲明:

"INSERT INTO customer2_details (TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID) 
SELECT TIME_REGISTERED,DATE_DISCHARGED,DATE_OF_BIRTH, customer_id 
from customer1_details WHERE customer_id = '"+id+"' " 
+0

我接受答案是正確的。但請閱讀我的編輯問題。是否可以不使用INSERT INTO ... SELECT ...語句 – Akki 2013-05-04 19:50:53

+0

可能。但是因爲我不瞭解Java,所以如果不進行更多的研究,我就無法撰寫它。如果您瞭解Java,那麼您應該能夠根據我以前的評論中的建議輕鬆搞定。 – Barmar 2013-05-04 19:55:33

+0

好的,非常感謝你幫助我...... @Barmar – Akki 2013-05-04 19:57:07

1

這是最有可能通過你的日期和時間戳變量字符串到insert語句引起的。

當您插入或更新日期或時間戳記值時,可以使用默認格式將這些值作爲字符串傳遞。你傳遞的是java如何將日期和時間戳轉換爲字符串的想法。這兩個似乎不匹配。

最好的辦法是使用綁定變量,然後框架應該照顧。

另一種方法是使用Oracle的to_date()函數,您可以在其中指定格式字符串。然後你會定義一個格式化字符串,它將java的表示日期的方式視爲字符串。但是,我不確定java表示是否取決於語言環境。如果是這樣,你將不得不寫你自己的date_to_string()方法,它總是以相同的格式返回日期,或者你的程序可能在一些計算機上工作,但不在其他地區的其他計算機上工作。

最後你可以做一個完全繞過java層的插入選擇。

1

使用getString()將字符串讀取爲字符串;

或者在您的java時間戳對象實例中調用toString()。

String sql1="INSERT INTO customer2_details(TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID) " 
    + "VALUES('"+timereg.toString()+"','"+datedischarged.toString()+"','"+dob.toString()+"','"+id+"') ";