use*_*963 5 sql apache oracle apache-commons-dbutils
我有一个Dbutils的奇怪问题,我正在尝试运行参数化更新sql,我提供正确数量的参数,但dbutils通过更改修改它的名称修改时间戳列名称
当timestamp columnname是一个字母表时
java.sql.SQLException:错误的参数数量:预期4,给出了5个查询:UPDATE WEATHER_2 SET WEATHER =?,O = TO_TIMESTAMP(?,'YYYY-MM-DD HH24:MI:SS.FF'),湿度=?,TEMP =?在哪里ID =?参数:[804,2015-06-05 17:21:05.809,16.0,25.15,1347927]
当timestamp columnname为normal时,将省略第二个字母
java.sql.SQLException:ORA-00904:"OSTIME":无效的标识符查询:UPDATE WEATHER_2 SET WEATHER =?,OBSTIME = TO_TIMESTAMP(?,'YYYY-MM-DD HH24:MI:SS.FF'),HUMIDITY =?,TEMP =?在哪里ID =?参数:[804,2015-06-05 17:27:46.139,16.0,25.15,1347927]
这可能是数据库的事吗?此外,只有类型为Date或Timestamp的列才会发生这种情况.
我有类似的问题.我认为这是Oracle JDBC 7驱动程序(ojdbc7.jar)中的一个错误.该错误可能在PreparedStatement.getParameterMetaData方法中.
此方法由Apache DBUtils在内部使用.所以它不会是DBUtils的错误,而是来自Oracle 12c分发的Oracle JDBC驱动程序的错误.
如果您使用Oracle 11g ojdbc6.jar驱动程序,相同的查询可能会正常工作.它至少对我有用.
如果要查看Oracle ojdbc7.jar驱动程序如何在内部错误地处理Query,可以使用oracle.jdbc.driver.OracleParameterMetaDataParser类中包含的main方法.试试这个:
java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser"你的SQL在这里"
例如
java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser"UPDATE PERSON SET LASTNAME =?,FIRSTNAME =?WHERE PERSONID =?"
输出是您的SQL Sentence解析并转换为SQL查询,驱动程序在内部使用它来标识参数数据类型:
SQL:UPDATE PERSON SET LASTNAME =:1,FIRSTNAME =:2 WHERE PERSONID =:3 SqlKind:UPDATE,Parameter Count = 3参数SQL:SELECT LASTNAME,F,PERSONID FROM PERSON
但正如您在示例中看到的那样,FIRSTNAME被错误地解析为"F".
使用你在问题中提出的一个查询,结果是其中一个参数消失了...所以解析器说"5"参数但用于获取数据类型的内部查询确实只有"4"(HUMIDITY有离开了SELECT).
java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser"UPDATE WEATHER_2 SET WEATHER = ?, OBSTIME = TO_TIMESTAMP(?,'YYYY-MM-DD HH24:MI:SS.FF'),HUMIDITY =?,TEMP =? WHERE ID =?"
输出:
SQL:UPDATE WEATHER_2 SET WEATHER =:1,OBSTIME = TO_TIMESTAMP(:2,'YYYY-MM-DD HH24:MI:SS.FF'),HUMIDITY =:3,TEMP =:4 WHERE ID =:5
SqlKind:UPDATE ,参数计数= 5
参数SQL:SELECT WEATHER,OBSTIME,TEMP,ID FROM WEATHER_2
如何修复?不知道,但正如我上面所说,使用Oracle 11g ojdbc6.jar驱动程序,同样的查询工作(甚至与Oracle 12c数据库连接......).
这种行为非常随机.看起来它取决于UPDATE中使用的列的第一个字母.如果它以F开头且H总是失败,但我不知道是否还有其他条件.