Měl jsem podobný problém. Myslím, že je to chyba v ovladači Oracle JDBC 7 (ojdbc7.jar). Chyba může být v metodě PreparedStatement.getParameterMetaData.
Tuto metodu interně používají Apache DBUtils. Nešlo by tedy o chybu DBUtils, ale o chybu z ovladače Oracle JDBC distribuovaného s Oracle 12c.
Stejný dotaz bude pravděpodobně fungovat dobře, pokud použijete ovladač Oracle 11g ojdbc6.jar. Alespoň u mě to fungovalo.
Pokud chcete vidět, jak je dotaz interně nesprávně zpracován ovladačem Oracle ojdbc7.jar, můžete použít hlavní metodu obsaženou ve třídě oracle.jdbc.driver.OracleParameterMetaDataParser. Zkuste toto:
např.
Výstupem je vaše SQL Sentence analyzovaná a převedená na SQL Query, který interně používá ovladač k identifikaci datových typů parametrů:
Ale jak můžete vidět na ukázce, FIRSTNAME je špatně analyzováno právě jako "F".
Pomocí jednoho z dotazů, které jste zadali ve své otázce, výsledkem je, že jeden z parametrů prostě zmizí... takže analyzátor říká „5“ parametrů, ale interní dotaz použitý k získání datových typů má ve skutečnosti pouze „4“ (HUMIDITY má pryč z SELECT).
výstup:
Jak to opravit? Nemám ponětí, ale jak jsem řekl výše, pomocí ovladače Oracle 11g ojdbc6.jar funguje stejný dotaz (dokonce i připojení k databázi Oracle 12c...).
Chování je docela náhodné. Vypadá to, že to závisí na prvním písmenu sloupce použitého v UPDATE. Pokud to začíná na F a H, vždy selže, ale nevím, zda existuje nějaká jiná podmínka.