用oracle预处理语句执行批处理

时间:2013-07-12 09:02:28

标签: java jdbc oracle11g

我尝试使用以下代码添加批量预处理语句:

Connection c = ...
PreparedStatement ps = c.prepareStatement(query1);
ps.setObject(....)
...
ps.addBatch(query2); // SqlException : Unsupported feature

oracle jdbc驱动程序是否支持批处理,或者我做错了什么?

我正在使用oracle瘦驱动程序。来自MANIFEST.MF的版本Implementation-Version: 11.2.0.1.0

java.sql.SQLException: Unsupported feature
        at oracle.jdbc.driver.OraclePreparedStatement.addBatch(OraclePreparedStatement.java:9803)
        at oracle.jdbc.driver.OracleStatementWrapper.addBatch(OracleStatementWrapper.java:285)
        at org.jboss.resource.adapter.jdbc.WrappedStatement.addBatch(WrappedStatement.java:731)
        at <application classes>

2 个答案:

答案 0 :(得分:6)

您正在使用PreparedStatement创建query1并将query2添加到已准备好的不属于您的状态。

如果您使用的是PreparedStatement,我建议您使用PreparedStatement.addBatch()方法。

PreparedStatement ps = c.prepareStatement(query1);
ps.setObject(....);
ps.addBatch(); //Voila

答案 1 :(得分:3)

如果您调用PreparedStatementCallableStatement,{{{{}}中的任何一个,则JDBC规范明确要求SQLException(和execute)实现抛出executeUpdate接受查询字符串的1}}或executeQuery方法。

例如,参见Statement.addBatch(String sql)上的Javadoc:

  

<强>抛出:
  addBatch - 如果发生数据库访问错误,则在关闭的SQLException上调用此方法,驱动程序不支持批量更新,Statement上调用该方法或{ {1}}

(强调我的)

使用PreparedStatement,您只能使用CallableStatement方法,然后使用addBatch()为准备好的查询批量设置参数值(并为不同的参数值重复该参数值) 。您无法使用普通PreparedStatement批量处理不同的查询。

使用setXXX批处理的方式大致如下:

Statement