gpt4 book ai didi

java - getParameterMetaData() 抛出 java.sql.SQLSyntaxErrorException : ORA-00904: "F": invalid identifier

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:08 25 4
gpt4 key购买 nike

我用java编写了一个简单的程序,它创建与Oracle数据库的连接并执行更新查询。

查询成功执行,但如果更新查询包含以“F”开头的列,则 prepareStatement.getParameterMetaData() 抛出异常

"java.sql.SQLSyntaxErrorException: ORA-00904: "F": invalid identifier".

如果我删除以“F”开头的列,则 prepareStatement.getParameterMetaData() 会正确执行。

我的配置是,

Oracle:12.1.0.2

JDK:1.8

ojdbc 驱动程序:ojdbc7.jar(包含在 12.1.0.2 中)

我在 ojdbc6.jar 中也发现了同样的问题。

驱动程序有问题吗?

代码:

公共(public)类测试驱动程序{

public static void main(String args[]) {
String sql = "UPDATE test SET test1 = ?, Fun=? WHERE test2 = ?";
PreparedStatement ppt = null;
Connection connection = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
connection = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521/pdborcl2","oracleTrunk","oracleTrunk");
ppt = connection.prepareStatement(sql);

for(int i=0; i<1;i++) {
ppt.setString(1, null);
ppt.setString(2, null);
ppt.setString(3, "1");
ppt.executeUpdate();
System.out.println("MSG "+ppt.getParameterMetaData());
}
}catch(Exception e) {
System.out.println("e "+e);
} finally {
try {
ppt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

最佳答案

这对我来说确实听起来像是一个错误,因为 PreparedStatement 按预期工作。不过,我找到了一个解决方法:

如果您使用引号来定义列,则 ppt.getParameterMetaData() 不会再引发异常。

所以你需要写

String sql = "UPDATE test SET test1 = ?, \"FUN\"=? WHERE test2 = ?";

请记住,在 Oracle 中使用双引号定义名称时必须区分大小写。因此它是 \"FUN\" 而不是 \"Fun\" 因为所有名称在不带引号使用时都会转换为大写。

关于java - getParameterMetaData() 抛出 java.sql.SQLSyntaxErrorException : ORA-00904: "F": invalid identifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31588164/

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