Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;文字与格式字符串“不匹配”;错误_Java_Sql_Oracle_Ora 01861 - Fatal编程技术网

Java &引用;文字与格式字符串“不匹配”;错误

Java &引用;文字与格式字符串“不匹配”;错误,java,sql,oracle,ora-01861,Java,Sql,Oracle,Ora 01861,当我尝试执行下面的代码时,它会给我一个java.sql.SQLException:ORA-01861:literal与格式字符串不匹配的错误 我正在尝试将一些列值从customer1\u details表复制到customer2\u details表。我试图移动的列数据类型是TIMESTAMP(6)的TIME\u registed,DATE\u executed列,而DATE\u OF\u borning列的数据类型是DATE try { Connection c

当我尝试执行下面的代码时,它会给我一个
java.sql.SQLException:ORA-01861:literal与格式字符串不匹配的错误

我正在尝试将一些列值从
customer1\u details
表复制到
customer2\u details
表。我试图移动的列数据类型是
TIMESTAMP(6)
TIME\u registed
DATE\u executed
列,而
DATE\u OF\u borning
列的数据类型是
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);           }  

如果任何人不使用INSERT INTO提供答案
,这将更有帮助。。。选择。。。语句

您可以在一个语句中使用以下查询完成此操作:

"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+"' "

这很可能是由于将日期和时间戳变量作为字符串传递给insert语句造成的

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

您最好的选择可能是使用绑定变量,那么框架应该考虑到这一点

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


最后,您可以执行完全绕过java层的insert select操作。

使用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+"') ";

为什么不把它作为一个语句:
INSERT-INTO。。。选择…
?我认为该错误意味着Java连接到字符串时使用的日期格式与Oracle解析日期时理解的语法不匹配。如果你想这样做,您需要以Oracle理解的方式明确设置日期的格式。我的实际查询有点复杂。我正在从多个表中收集数据,然后将该数据插入customer2_details表中。除上述问题中提供的这三列之外,所有其他列都不会给出任何错误。您应该仍然能够在一个表中完成此操作语句,通过使用join.Ok我将尝试@barmarI接受答案是正确的。但请阅读我对问题的编辑。是否可以不使用插入到。。。选择。。。大概是吧。但是因为我不懂Java,我不能不做更多的研究就写它。如果您了解Java,您应该能够根据我前面评论中的建议轻松地理解它。