getParameterMetaData()抛出java.sql.SQLSyntaxErrorException:ORA-00904:“F”:无效的标识符

时间:2015-07-23 13:02:42

标签: java oracle12c ojdbc ora-00904

我在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();
        }
    }

}

1 个答案:

答案 0 :(得分:0)

这听起来像是一个错误,因为PreparedStatement按预期工作。但是,我找到了解决方法

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

所以你需要写

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

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