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