Jeg havde et lignende problem. Jeg tror, det er en fejl i Oracle JDBC 7-driveren (ojdbc7.jar). Fejlen kan være i metoden PreparedStatement.getParameterMetaData.
Denne metode bruges internt af Apache DBUtils. Så det ville ikke være en fejl i DBUtils, men en fejl fra Oracle JDBC-driver distribueret med Oracle 12c.
Samme forespørgsel vil sandsynligvis fungere fint, hvis du bruger Oracle 11g ojdbc6.jar-driveren. Det virkede i hvert fald for mig.
Hvis du vil se, hvordan forespørgslen behandles forkert internt af Oracle ojdbc7.jar-driveren, kan du bruge hovedmetoden inkluderet i oracle.jdbc.driver.OracleParameterMetaDataParser-klassen. Prøv dette:
f.eks.
Outputtet er din SQL-sætning parset og konverteret til en SQL-forespørgsel, der bruges internt af driveren til at identificere parameterdatatyperne:
Men som du kan se i eksemplet, er FIRSTNAME fejlagtigt parset som "F".
Ved at bruge en af de forespørgsler, du sætter i dit spørgsmål, er resultatet, at en af parametrene bare forsvinder... så parseren siger "5" parametre, men den interne forespørgsel, der bruges til at hente datatyperne, har faktisk kun "4" (HUMIDITY har gået fra SELECT).
output:
Hvordan fikser man det? Ingen idé, men som jeg sagde ovenfor, ved at bruge Oracle 11g ojdbc6.jar-driveren, virker den samme forespørgsel (selv at forbinde med en Oracle 12c-database...).
Opførselen er ret tilfældig. Det ser ud til, at det afhænger af det første bogstav i kolonnen, der bruges i OPDATERING. Hvis det begynder med F og H fejler det altid, men jeg ved ikke, om der er nogen anden betingelse.