Je ne comprends pas la raison derrière ORA-01722: nombre non valable

J'ai un problème qui est généré de façon aléatoire (une seule fois entre millième d'appels).
L'erreur ORA-01722: nombre non valable est généré de façon aléatoire lors de l'exécution de sql de mise à jour dans une déclaration préparée de base de données Oracle. Les cas les détails sont comme ci-dessous:

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

et la valeur dans le journal est comme ça :

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

en traçant les paramètres de la requête à la DB, tous les paramètres sont transférés correctement par le biais de pilote JDBC, sauf pour le paramètre 23410984 il a été remplacé par la valeur "<C4>^X*
U"
(notez que cette valeur contient un retour chariot avant de char 'u' !). Je ne sais pas pourquoi

Quel est le type de l'objet que vous essayez de l'insérer? Le toString() renvoie 23410984, mais c'est un Integer, Long ou BigDecimal?
Quelle est la portée de statement et result?
Le type d'objet est longue et la base de données de la colonne est le nombre
J'ai connu le même problème avec un delete() de la clause. Faire une sous-requête et d'éviter de mettre de la chaîne de valeurs dans la requête d'éviter ce problème

OriginalL'auteur user1017344 | 2012-05-17