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*
(notez que cette valeur contient un retour chariot avant de char 'u' !). Je ne sais pas pourquoi
U"
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
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
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
Vous devez vous connecter pour publier un commentaire.
La principale raison est que sur
java.sql.SQLException: ORA-01722: invalid number
.Peut-être le domaine
last_case_status_history_id
est de type nombre, mais votre paramètre est nullOriginalL'auteur Mark Yao
Nous avons eu un problème similaire. Notre hibernate java code publié une déclaration préparée à remplir les infos de l'utilisateur et une raison pour le changement " pour toutes les opérations de sauvegarde en utilisant aspectJ.
Dans 3 environnements de base de données (Oracle 10G) cela a fonctionné sans aucun problème, mais sur la base de données de production parfois, cela a échoué avec l'erreur ORA-01722 erreur. Cela se produit uniquement lorsque la charge du processeur sur le serveur de base de données est proche de 100%.
Sur un autre forum, j'ai trouvé une suggestion au sujet de ne pas passer le Long de Long d'objets, mais de faire l'unboxing explicitement à une longue primitive. Il semble que le pilote jdbc ou de la base de données elle-même a des problèmes quand on fait ce unboxing sur charge (même si cela semble assez fou). Divers pilotes jdbc ont été testés, tels que les 1.4 et 1.6 versions.
Le code que parfois échoué était:
Maintenant, nous avons modifié le code afin de le rendre explicite preparedStatement comme ceci:
Cette question n'est pas arrivé depuis, même si l'environnement est resté le même avec le même logiciel et charge élevée sur la base de données.
J'ai entendu parler d'un collègue que l'un des administrateurs de base de données pourrait voir dans l'enregistrement de la déclaration a été acceptée par la base de données, mais absence d'uc a été assignée. (Logique, puisque tous les cpu serait occupé sur une charge élevée.) C'est peut être que tout simplement la mauvaise erreur est levée, une base de données de surcharge' erreur de quelques sortes doivent être jetés ou quelque chose. Mieux encore est de ne jamais faire une telle erreur de toute façon.
Je suppose que c'est principalement la charge de base de données, mais cependant, il n'est pas intelligent du tout de laisser à la charge de l'uc à 100% tout le temps.
OriginalL'auteur Pieter VN
J'ai essayé ceci:
et obtenu ceci:
qui est pratiquement le même que ce que vous avez obtenu. De Type 2 est
NUMBER
type de données.Documentation Oracle dit pour le deuxième paramètre de la
DUMP()
fonction:17 retours chaque octet imprimé comme un personnage si et seulement si il peut être interprété comme un caractère imprimable dans le jeu de caractères du compilateur—généralement ASCII ou EBCDIC. Certains caractères de contrôle ASCII peuvent être imprimés dans la forme ^X ainsi. Sinon, le personnage est imprimé en notation hexadécimale. Tous les NLS paramètres sont ignorés.
Donc, il semble que, parfois, la valeur est transférée pas que l'intérieur de l'octet de format de NOMBRE, mais comme une chaîne de caractères.
setLong()
.OriginalL'auteur Szilard Barany
java.sql.SQLException: ORA-01722: invalid number
.J'étais en utilisant l'un de l'UDF, en haut de la colonne où un numéro est prévu et j'ai été prendre une valeur différente qui n'est pas un nombre. Si l'opération échoue jetant un nombre non valide exception.
OriginalL'auteur maxmithun