我在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();
}
}
}
答案 0 :(得分:0)
这听起来像是一个错误,因为PreparedStatement
按预期工作。但是,我找到了解决方法:
如果您使用引号来定义列,则ppt.getParameterMetaData()
不会再引发异常。
所以你需要写
String sql = "UPDATE test SET test1 = ?, \"FUN\"=? WHERE test2 = ?";
请记住,在Oracle中使用双引号定义名称时,您必须区分大小写。因此它是\"FUN\"
而不是\"Fun\"
,因为在没有引号的情况下使用所有名称都会转换为大写。