2017-08-11 98 views
2

我有这样的代码不支持的功能异常fetchDmlReturnParams

String sql = "insert into colortable (string, color, cid) values (?,?,?)"; 
PreparedStatement ps = conn.prepareStatement(sql,keyProperties.toArray(new String[0])); 
ps.executeBatch(); 
final ResultSet rst = ps.getGeneratedKeys(); 
while (rst.next()) { 
    final BigDecimal bigDecimal = rst.getBigDecimal(1); 
    if (bigDecimal != null) { 
     ids.add(bigDecimal.intValueExact()); 
    } 
    } 

当代码到达rst.next我得到以下异常。

Caused by: java.sql.SQLException: Unsupported feature 
at oracle.jdbc.driver.OracleStatement.fetchDmlReturnParams(OracleStatement.java:4959) ~[ojdbc6.jar:11.2.0.4.0] 
at oracle.jdbc.driver.OracleReturnResultSet.next(OracleReturnResultSet.java:63) ~[ojdbc6.jar:11.2.0.4.0] 

我发现问题出在这部分的ojdbc驱动程序中。

if (!this.statement.returnParamsFetched) { 
     this.statement.fetchDmlReturnParams(); 
     this.statement.setupReturnParamAccessors(); 
} 

在具体的功能this.statement.fetchDmlReturnParams();未实施。

现在我的问题是ho要避免调用这个函数,特别是returnParamFetched可以设置为true吗?

回答

1

我的应用程序真正执行的代码是

try { 
    final String sql = "insert into colortable (string, color, cid) values (?,?,?)"; 
    final PreparedStatement ps = conn.prepareStatement(sql, new String[] {"ID"}); 
    ps.setString(1, "TEST1"); 
    ps.setString(2, "FFFFFF"); 
    ps.setInt(3, 1); 
    ps.addBatch(); 
    ps.setString(1, "TEST2"); 
    ps.setString(2, "AAAAAA"); 
    ps.setInt(3, 1); 
    ps.addBatch(); 
    ps.executeBatch(); 
    final ResultSet rst = ps.getGeneratedKeys(); 
    rst.getMetaData(); 
    if (rst != null){ 
    while (rst.next()) { 
     final BigDecimal bigDecimal = rst.getBigDecimal(1); 
     System.out.println(bigDecimal); 
     Assert.notNull(bigDecimal); 
    } 
    } 
    ps.close(); 
}catch (final SQLException e){ 
    System.out.println(e); 
}finally { 
} 

我创建测试用例来测试这个代码PICE,我尝试用不同的ojdbc,我发现最新ojdb8解决问题。