“Literal与格式字符串不匹配”错误

时间:2013-05-04 19:26:08

标签: java sql oracle ora-01861

当我尝试执行以下代码时,它会出现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,那将会更有帮助。

3 个答案:

答案 0 :(得分: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+"' "

答案 1 :(得分:1)

这很可能是由于将Date和Timestamp变量作为字符串传递给insert语句引起的。

插入或更新Date或Timestamp值时,有一种默认格式,您可以将这些值作为字符串传递。你传递的是java关于如何将日期和时间戳转换为字符串的想法。这两个似乎不匹配。

你最好的选择可能是使用绑定变量,然后框架应该照顾它。

替代方案是使用Oracle的to_date()函数,您可以在其中指定格式字符串。然后,您将定义一个格式字符串,该字符串考虑了java将日期表示为字符串的方式。但是,我不确定java表示是否依赖于语言环境。如果是这样,您必须编写自己的date_to_string()方法,该方法始终以相同的格式返回日期,或者您的程序可能在某些计算机上运行,​​但在具有不同语言环境的其他计算机上不运行。

最后你可以做一个完全绕过java层的insert-select。

答案 2 :(得分:1)

使用getString();

将时间戳读取为字符串

或者在java Timestamp对象实例中调用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+"') ";