2013-05-04 93 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+"') ";