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

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


  “ java.sql.SQLSyntaxErrorException:ORA-00904:“ F”:无效的标识符”。


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

我的配置是

Oracle: 12.1.0.2

JDK: 1.8

ojdbc driver: ojdbc7.jar (included in 12.1.0.2)

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

驱动程序有问题吗?

码:

公共类TestDriver {

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\",因为在不带引号的情况下,所有名称都将转换为大写。

10-03 00:27