Apache Dbutils changer le nom de la colonne dans update Sql

J’ai un problème étrange avec Dbutils, j’essaie d’exécuter une mise à jour paramétrée SQL, je fournis le nombre correct d’arguments, mais dbutils modifie le nom de la colonne d’horodatage en changeant le nom de la modification

quand timestamp nom_colonne est un alphabet

java.sql.SQLException: Nombre de parameters incorrect: attendu 4, a reçu 5 Requête: UPDATE WEATHER_2 SET WEATHER =? , O = TO_TIMESTAMP (?, ‘AAAA-MM-JJ HH24: MI: SS.FF’), HUMIDITE =? , TEMP =? WHERE ID =? Paramètres: [804, 2015-06-05 17: 21: 05.809, 16.0, 25.15, 1347927]

quand timestamp columnname est normal .. il affichera le deuxième alphabet

java.sql.SQLException: ORA-00904: “OSTIME”: identificateur non valide Requête: UPDATE WEATHER_2 SET WEATHER =? , OBSTIME = TO_TIMESTAMP (?, ‘AAAA-MM-JJ HH24: MI: SS.FF’), HUMIDITE =? , TEMP =? WHERE ID =? Paramètres: [804, 2015-06-05 17: 27: 46.139, 16.0, 25.15, 1347927]

cela pourrait-il être une chose de firebase database? En outre, cela se produit uniquement avec la colonne dont le type est Date ou Horodatage.

J’ai eu un problème similaire. Je pense que c’est un bogue dans le pilote Oracle JDBC 7 (ojdbc7.jar). Le bogue pourrait être dans la méthode PreparedStatement.getParameterMetaData.

Cette méthode est utilisée en interne par Apache DBUtils. Ce ne serait donc pas un bogue de DBUtils, mais un bogue du pilote Oracle JDBC dissortingbué avec Oracle 12c.

Same Query fonctionnera probablement correctement si vous utilisez le pilote Oracle 11g ojdbc6.jar. Cela a au moins fonctionné pour moi.

Si vous voulez voir comment la requête est mal traitée en interne par le pilote Oracle ojdbc7.jar, vous pouvez utiliser la méthode principale incluse dans la classe oracle.jdbc.driver.OracleParameterMetaDataParser. Essaye ça:

java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser “VOTRE SQL ICI”

par exemple

java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser “UPDATE PERSON SET LASTNAME = ?, FIRSTNAME =? WHERE PERSONID =?”

La sortie est votre phrase SQL analysée et convertie en une requête SQL utilisée en interne par le pilote pour identifier les types de données de paramètre:

SQL: UPDATE PERSON SET LASTNAME =: 1, FIRSTNAME =: 2 WHERE PERSONID =: 3 SqlKind: UPDATE, nombre de parameters = 3 Paramètre SQL: SELECT LASTNAME, F, PERSONID FROM PERSONID

Mais comme vous pouvez le voir dans l’exemple, le FIRSTNAME est analysé à tort comme “F”.

En utilisant l’une des requêtes que vous avez posées dans votre question, le résultat est que l’un des parameters disparaît simplement … donc l’parsingur dit “5” params mais la requête interne utilisée pour obtenir les types de données n’a en effet que “4” parti du SELECT).

java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser “MISE À JOUR WEATHER_2 SET WEATHER =?, OBSTIME = TO_TIMESTAMP (?, ‘AAAA-MM-JJ HH24: MI: SS.FF’), HUMIDITÉ =?, TEMP =? WHERE ID =? ”

sortie:

SQL: UPDATE WEATHER_2 SET WEATHER =: 1, OBSTIME = TO_TIMESTAMP (: 2, ‘AAAA-MM-JJ HH24: MI: SS.FF’), HUMIDITE =: 3, TEMP =: 4 WHERE ID =: 5
SqlKind: UPDATE, nombre de parameters = 5
Paramètre SQL: SELECT WEATHER, OBSTIME, TEMP, ID FROM WEATHER_2

Comment le réparer? Aucune idée, mais comme je l’ai dit plus haut, en utilisant le pilote Oracle 11g ojdbc6.jar, la même requête fonctionne (même en se connectant à une firebase database Oracle 12c …).

Le comportement est assez aléatoire. Il semble que cela dépend de la première lettre de la colonne utilisée dans la mise à jour. Si cela commence par F et H toujours échoue, mais je ne sais pas s’il y a une autre condition.

oracle 12.1.0.1.0 jdbc oracle.jdbc.driver.OracleParameterMetaDataParser suce!

sur mon test:

oracle.jdbc.driver.OracleParameterMetaDataParser.main (new Ssortingng [] {“mise à jour du jeu de tests ORDX =?, A123 = ?, FABCDEFG =? où A2C =?”}

==>

SQL: mise à jour du jeu de tests ORDX =: 1, A123 =: 2, FABCDEFG =: 3 où A2C =: 4 SqlKind: UPDATE, nombre de parameters = 4 Paramètre SQL: SELECT OX, A23, F, AC FROM test

le début du champ avec “O” réduira de 1 à 2 caractères

le début du champ avec “F” va couper tout

début du champ avec “A” coupera 1 caractère

sur oralce 12.1.0.2.0 ont encore sur la question: le début de champ avec “F” va couper tout

http://www.oracle.com/technetwork/database/features/jdbc/default-2280470.html

Je rencontre le même problème, en utilisant DBUtils et de la mise à niveau ojdbc6 vers ojdbc7. Ensuite, je suis conscient que c’est un bogue sur le paramètre, donc je le remplis moi-même. Comme ceci:

mettre à jour():

Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql.toUpperCase()); this.fillStatement(ps, param); int rs = ps.executeUpdate(); ps.close(); conn.close(); 

fillStatement ():

 private void fillStatement(PreparedStatement stmt, Object... params) throws SQLException { int i = 1; for (Object o: params){ fill(stmt, i, o); i ++; } } private void fill(PreparedStatement stmt, int index, Object param) throws SQLException { if (param == null) { stmt.setObject(index, null); } else if (param instanceof Ssortingng) { stmt.setSsortingng(index, (Ssortingng) param); } else if (param instanceof Boolean) { stmt.setBoolean(index, (Boolean) param); } else if (param instanceof Integer) { stmt.setInt(index, (Integer) param); } else if (param instanceof Long) { stmt.setLong(index, (Long) param); } else if (param instanceof Double) { stmt.setDouble(index, (Double) param); } else if (param instanceof Float) { stmt.setFloat(index, (Float) param); } else if (param instanceof Short) { stmt.setShort(index, (Short) param); } else if (param instanceof Clob) { stmt.setClob(index, (Clob) param); } else if (param instanceof Blob) { stmt.setBlob(index, (Blob) param); } else if (param instanceof java.sql.Timestamp) { stmt.setTimestamp(index, (java.sql.Timestamp) param); } else if (param instanceof BigDecimal) { stmt.setBigDecimal(index, (BigDecimal) param); }else if (param instanceof java.sql.Time) { stmt.setTime(index, (java.sql.Time) param); } else if (param instanceof java.sql.Date) { stmt.setDate(index, (java.sql.Date) param); } else if (param instanceof Date) { stmt.setDate(index, new java.sql.Date(((Date) param).getTime())); } else { stmt.setObject(index, param); } }