Java 错误:ORA-01858:在需要数字的位置找到非数字字符

Java 错误:ORA-01858:在需要数字的位置找到非数字字符,java,oracle10g,sqlexception,Java,Oracle10g,Sqlexception,当我执行我准备好的语句时,我得到了ORA-01858:在预期的数字位置发现了一个非数字字符。当我搜索一些论坛时,他们说这是因为日期数据类型。我准备的声明是 insert into OPRS_ZONES( ZONE_ID, ZONE_CODE, ZONE_NAME, PLACE_ID, CORP_ID, CREATED_BY, CREATED_DATE, MODIFIED_BY, MODIFIED_DATE) values(?,?,?,?,?,?,?,?,?

当我执行我准备好的语句时,我得到了
ORA-01858:在预期的数字位置发现了一个非数字字符
。当我搜索一些论坛时,他们说这是因为日期数据类型。我准备的声明是

insert  into OPRS_ZONES(
  ZONE_ID,
  ZONE_CODE,
  ZONE_NAME,
  PLACE_ID,
  CORP_ID,
  CREATED_BY,
  CREATED_DATE,
  MODIFIED_BY,
  MODIFIED_DATE) 
values(?,?,?,?,?,?,?,?,?)
我尝试插入的值是

03.0, 
'FLORIDA', 
'FLORIDA', 
05231.0, 
01.0, 
01.0, 
TO_DATE('19102012130639','DDMMYYYYHH24MISS'), 
NULL, 
NULL
表定义

CREATE TABLE OPRS_ZONES ( 
  ZONE_ID NUMERIC(20,0) , 
  ZONE_CODE VARCHAR2(16) , 
  ZONE_NAME VARCHAR2(255) , 
  PLACE_ID NUMERIC(20,0) , 
  CORP_ID NUMERIC(20,0) , 
  CREATED_BY NUMERIC(20,0) , 
  CREATED_DATE DATE , 
  MODIFIED_BY NUMERIC(20,0) , 
  MODIFIED_DATE DATE );
我为准备好的语句填充值的代码

public int executePreparedStatement(String query, List myCollection, int colLength, String tableName) throws DBException,SQLException {

        int rowsAffected    = 0; 
        int [] noOfRowsExecuted = null;
        try{
            conn.setAutoCommit(false);
            if(query != null){  
                ps = conn.prepareStatement(query);
                for (int i = 0; i < myCollection.size(); i++) {
                    logger.info("@@mycollcetion -- "+myCollection.get(i));
                    List list = (List) myCollection.get(i);
                    int count = 1;
                    for (int j = 0; j < list.size(); j++) {
                        ps.setObject(count, list.get(j));
                        count++;
                    }
                    ps.execute();
                    logger.info("@@ noOfRowsExecuted == "+noOfRowsExecuted);
                }
            }
        }catch(Exception e){
            logger.error("Error in the execution of Prepared Statement: \n" + query + "\nData : " + listData, e);
            rowsAffected    = Utility.getErrorCode(e);
            throw new DBException(e);
        }finally{ 
            try {
                if (ps != null) {
                    ps.close();
                    ps = null;
                }
            } catch (Exception e) {
            }
            rowsAffected    = 0; 
            noOfRowsExecuted = null;
        }
        return rowsAffected;        
    }
public int executePreparedStatement(字符串查询、列表myCollection、int colLength、字符串tableName)抛出DBException、SQLException{
int rowsAffected=0;
int[]noOfRowsExecuted=null;
试一试{
连接设置自动提交(错误);
如果(查询!=null){
ps=conn.prepareStatement(查询);
对于(int i=0;i
列表myCollection
包含
值。variabele
查询
准备好的语句
在SQLDEVELOPER中,当替换为值时,这个准备好的语句可以正常工作,但当我运行java程序时,会出现错误。日期格式真的有问题吗?如果是这样,为什么它在SQLDEVELOPER中工作良好

请帮忙


谢谢

在以下位置更改您准备的声明:

insert  into OPRS_ZONES(
  ZONE_ID,
  ZONE_CODE,
  ZONE_NAME,
  PLACE_ID,
  CORP_ID,
  CREATED_BY,
  CREATED_DATE,
  MODIFIED_BY,
  MODIFIED_DATE) 
values(?,?,?,?,?,?,
       TO_DATE(?,'DDMMYYYYHH24MISS'),
       ?,?)
并且只将实际创建的日期设置为字符串,也就是说,使集合对象中的getter返回“19102012130639”,而不是整个to_-DATE语法

编辑:假设您有一个包含所有值的字符串数组,并且您使用的是我编辑的语句版本,这应该可以工作

   String[] values = { "03.0", "FLORIDA", "FLORIDA", "05231.0", "01.0", "01.0",   "19102012130639", null, null };
   ps = conn.prepareStatement(query);
   int i = 1;
   foreach(String par : values) {
      ps.setObject(i, par);
      i++;
   }
   ps.execute();

但是,我遇到了同样的问题,在我的例子中,我提供了
sysdate
作为目标表的
DATE
字段的参数


解决方案是将值更改为
java.sql.Timestamp

OPRS\u区域发布
CREATE TABLE
语句
我尝试将日期转换为时间戳,也尝试了“CAST”,但仍然出现相同的错误:(为什么所有数字的前导零都是零?还有,为什么应该是整数的后缀是
.0
呢?这就是问题所在,Java不知道什么是最新的,它需要的是数值。但是,BigMake已经回答了,所以我不会重复post。试着编写一个简单的测试单元,用准备好的语句和.setObject()包含值,或者至少在准备好的语句中添加您设置的实际值的跟踪。请使用准备好的语句重新混合,您不需要使用“”转义字符串,也不需要使用to_DATE()在值中,但仅在语句中。因此,更改集合以仅包含日期字符串。是否需要将其转换为字符串?根据您的建议,更改后的值如下[03.0',FLORIDA',FLORIDA',05231.0,01.0,01.0,19102012130639,00.0,NULL]…你想让我用引号括起日期值吗?应该是java类型,只要它们是字符串或java基元对象,你就应该是对的。你如何建立你的集合?记住“转义是由JDBC驱动程序使用准备好的语句完成的,所以你不需要它。我正在用sql数据库中的值生成一个文本文件。”ase用于特定表。我使用此文本文件读取值并将其分配给集合。我还检查数据类型。生成文本文件时注意填充。