gpt4 book ai didi

sql - Apache Dbutils 在更新 Sql 中更改列名

转载 作者:行者123 更新时间:2023-12-04 18:05:09 25 4
gpt4 key购买 nike

我在 Dbutils 遇到了一个奇怪的问题,我正在尝试运行参数化更新 sql,我提供了正确数量的参数,但是 dbutils 正在通过更改修改名称来修改时间戳列名称

当时间戳列名是一个字母时

java.sql.SQLException: Wrong number of parameters: expected 4, was given 5 Query: UPDATE WEATHER_2 SET WEATHER=? , O=TO_TIMESTAMP(?,'YYYY-MM-DD HH24:MI:SS.FF') , HUMIDITY=? , TEMP=? WHERE ID=? Parameters: [804, 2015-06-05 17:21:05.809, 16.0, 25.15, 1347927]



当时间戳列名正常时..它会省略第二个字母

java.sql.SQLException: ORA-00904: "OSTIME": invalid identifier Query: UPDATE WEATHER_2 SET WEATHER=? , OBSTIME=TO_TIMESTAMP(?,'YYYY-MM-DD HH24:MI:SS.FF') , HUMIDITY=? , TEMP=? WHERE ID=? Parameters: [804, 2015-06-05 17:27:46.139, 16.0, 25.15, 1347927]



这可能是数据库的事情吗?此外,这只发生在类型为日期或时间戳的列中。

最佳答案

我有一个类似的问题。我认为这是 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 "YOUR SQL HERE"



例如

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 Parameter 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, Parameter Count=5
Parameter SQL: SELECT WEATHER, OBSTIME, TEMP, ID FROM WEATHER_2



怎么修?不知道,但正如我上面所说,使用 Oracle 11g ojdbc6.jar 驱动程序,相同的查询工作(甚至与 Oracle 12c 数据库连接......)。

行为非常随意。看起来它取决于 UPDATE 中使用的列的第一个字母。如果以F开头,H总是失败,但不知道有没有其他条件。

关于sql - Apache Dbutils 在更新 Sql 中更改列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30666622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com