【发布时间】:2012-05-17 12:53:30
【问题描述】:
我有一个随机生成的问题(在千分之一的调用之间出现一次)。 错误 ORA-01722: invalid number 是在准备好的语句 Oracle 数据库中执行 sql update 时随机生成的。案例详情如下:
try {
connection = getConnection();
statement = connection.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
if (params[i] instanceof Date) {
statement.setTimestamp(i + 1, new Timestamp(((Date) params[i]).getTime()));
} else if (params[i] instanceof java.util.Date) {
statement.setTimestamp(i + 1, new Timestamp(((java.util.Date) params[i]).getTime()));
} else {
statement.setObject(i + 1, params[i]);
}
paramsBuilder.append(": " + params[i]);
}
if (logger.isInfoEnabled()) {
logger.info("Query String [" + sql + "] [" + paramsBuilder + "]");
logger.info("Query Parameters [" + paramsBuilder + "]");
}
result = statement.executeUpdate();
if (logger.isInfoEnabled()) {
logger.info(result + " rows affected");
}
} catch (SQLException e) {
if (logger.isInfoEnabled()) {
String message = "Failed to execute SQL statment [" + sql + "] with parameters [" + paramsBuilder + "]";
logger.error(message, e);
}
throw new DAOException(e);
}
日志中的值是这样的:
Failed to execute SQL statment [update CUSTOMER_CASE set no_of_ptp=?, no_of_unreached=?,collector_name=? , last_case_status_history_id=?, current_handler=?, handling_start_time=?,due_total_open_amount=?, payment_due_invoice_id =? where id=?] with parameters [: 0: 0: auto: 5470508: null: null: 0.0: 23410984: 2476739] java.sql.SQLException: ORA-01722: invalid number
通过在 DB 中跟踪查询参数,所有参数都通过 JDBC 驱动程序正确传输,但参数 23410984 被替换为值 "<C4>^X*
U"(注意此值在 char 'u 之前包含回车' !)。不知道为什么
【问题讨论】:
-
您要插入的对象的类型是什么? toString() 返回 23410984,但它是 Integer、Long 还是 BigDecimal?
-
statement和result的范围是什么? -
对象类型为long,数据库列为number
-
我在使用 IN() 子句删除时遇到了同样的问题。执行子查询并避免将字符串值放入查询中可以避免此问题
-
当我们使用 IN 子句并将值作为 IN ('1, 2, 3, 4, ...') 传递时,通常会发生这种情况,值应按以下方式传递 IN ('1 ','2','3','4',...)
标签: java oracle jdbc prepared-statement ora-01722