【问题标题】:error : ORA-01858: a non-numeric character was found where a numeric was expected错误:ORA-01858:在需要数字的地方发现了一个非数字字符
【发布时间】:2012-10-22 05:21:34
【问题描述】:

当我执行我准备好的语句时,我得到了ORA-01858: a non-numeric character was found where a numeric was expected。当我搜索一些论坛时,他们说这是因为日期数据类型。我准备好的陈述是

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;        
    }

list myCollection 包含values。变量queryprepared statement 当用值替换这个准备好的语句在 SQLDEVELOPER 中工作正常,但是当我运行我的 java 程序时,我得到了错误。日期格式真的有问题吗?如果是这样,为什么它在 SQLDEVELOPER 中运行良好?

请帮忙,

谢谢

【问题讨论】:

  • OPRS_ZONES发布CREATE TABLE声明
  • 我尝试将日期转换为 TIMESTAMP 并尝试“CAST”但仍然是同样的错误:(
  • 为什么所有数字前面都有零?
  • 另外,为什么.0 后缀应该是整数?
  • 这就是问题所在,Java 不知道 TO_DATE 是什么,而是需要数值。但是,BigMake 已经回答了,所以我不会重复发帖。

标签: java oracle10g sqlexception


【解决方案1】:

将你准备好的语句更改为:

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'),
       ?,?)

并且只将实际的 CREATED_DATE 设置为字符串,也就是说让集合对象中的 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();

【讨论】:

  • 尝试编写一个简单的测试单元,使用准备好的语句和带有值的 .setObject(),或者至少在准备好的语句中添加你设置的实际值的跟踪。请记住,使用准备好的语句,您不需要用 ' 转义字符串,也不需要 TO_DATE () 在值中,而只是在语句中。因此,请更改集合以仅包含日期字符串。
  • 我需要将其转换为字符串吗?根据您的建议更改后的值如下 [03.0, 'FLORIDA', 'FLORIDA', 05231.0, 01.0, 01.0, 19102012130639, 00.0, NULL].. 你想让我用引号括住日期值吗?
  • 应该是java类型,只要它们是字符串或java原始对象,你应该是对的。你如何建立你的收藏?请记住 ' 转义是由 JDBC 驱动程序使用准备好的语句完成的,因此您不需要它。
  • 我正在生成一个文本文件,其中包含特定表的 sql 数据库中的值。我正在使用这个文本文件来读取值并将它们分配给集合。我也在检查数据类型。生成文本文件时会注意填充。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多