当我尝试执行以下代码时,它会出现java.sql.SQLException: ORA-01861: literal does not match format string
错误。
我正在尝试将一些列值从customer1_details
表复制到customer2_details
表。我要移动的列数据类型为TIMESTAMP(6)
TIME_REGISTERED
,DATE_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 :(得分: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+"') ";