Ho avuto un problema simile. Penso che sia un bug nel driver Oracle JDBC 7 (ojdbc7.jar). Il bug potrebbe essere nel metodo PreparedStatement.getParameterMetaData.
Questo metodo è utilizzato internamente da Apache DBUtils. Quindi non sarebbe un bug di DBUtils, ma un bug dal driver JDBC Oracle distribuito con Oracle 12c.
Same Query funzionerà correttamente se si utilizza il driver ojdbc6.jar Oracle 11g. Almeno ha funzionato per me.
Se si desidera vedere come la Query viene elaborata erroneamente dal driver Oracle ojdbc7.jar, è possibile utilizzare il metodo principale incluso nella classe oracle.jdbc.driver.OracleParameterMetaDataParser. Prova questo:
java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser "SQL QUI"
esempio
java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser "UPDATE persona ambientato LASTNAME = ?, FIRSTNAME =? WHERE PersonID =?"
L'uscita è la tua frase SQL analizzato e convertito in una query SQL che viene utilizzato internamente dal driver di identificare i tipi di dati dei parametri:
SQL: UPDATE persona ambientato LASTNAME = 1, Nome =: 2 DOVE personID =: 3 SqlKind: UPDATE, parametro Count = 3 SQL Parametro: SELECT COGNOME, F, personID da persona
Ma come si può vedere nel campione, il NOME è erroneamente analizzato solo come "F".
Utilizzando una delle query che hai inserito nella tua domanda, il risultato è che uno dei parametri scompare ... quindi il parser dice parametri "5" ma la query interna utilizzata per ottenere i tipi di dati ha effettivamente solo "4" "(HUMIDITY è passato da SELECT).
java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser "UPDATE WEATHER_2 SET TEMPO =, OBSTIME = TO_TIMESTAMP (, 'YYYY-MM-DD HH24: MI: ss.ff'?)?, HUMIDITY =?, TEMP =? WHERE ID =? "
uscita:
SQL: UPDATE WEATHER_2 SET TEMPO = 1, OBSTIME = TO_TIMESTAMP (: 2 , 'YYYY-MM-DD HH24: MI: ss.ff'), UMIDITA '= : 3, TEMP =: 4 WHERE ID =: 5
SqlKind: UPDATE, Count Parametro = 5
Parametro SQL: SELECT METEO, OBSTIME, TEMP, ID dA WEATHER_2
Come Fixit? Non ho idea, ma come ho detto sopra, usando il driver Oracle 11g ojdbc6.jar, funziona la stessa query (anche collegandomi con un database Oracle 12c ...).
Il comportamento è piuttosto casuale. Sembra che dipenda dalla prima lettera della colonna utilizzata in UPDATE. Se inizia con F e H fallisce sempre, ma non so se ci sono altre condizioni.
File un problema con My Oracle Support. –