【发布时间】:2012-10-14 10:37:49
【问题描述】:
是否可以在批处理模式下使用 Spring JDBC API 执行存储过程?
我尝试使用 Spring JdbcTemplate 的方法 batchUpdate,但它不起作用。 我使用 Spring 3.0 和 Oracle JDBC 驱动程序版本 11.2.0.3
JdbcTemplate template = new JdbcTemplate(dataSource);
template.batchUpdate("BEGIN SCHEMA.PERSON_UPDATE(I_N_PERSON_ID=> ? ,I_S_NAME=> ? ,J_N_TID=> ?);END;",
new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
OracleCallableStatement cs = (OracleCallableStatement) ps;
cs.setString(1, persons.get(i).getName());
cs.setLong(2, persons.get(i).getPersonId());
cs.registerOutParameter(3, OracleTypes.NUMBER);
}
public int getBatchSize() {
return persons.size();
}}
);
谢谢
【问题讨论】:
-
它到底是怎么不起作用的?
-
我无法注册过程的 OUT 参数,因为 Exception : PreparedStatement cannot be cast to oracle.jdbc.internal.OracleCallableStatement 有没有办法注册 OUT 参数?
-
为什么在这里需要 OUT 参数 - 我在您的代码中看不到任何结果处理。因为您在这里只能使用准备好的语句而不是可调用的语句 - 您可以从过程中删除 OUT 参数或编写包装函数并从对偶中选择它。然后你可以用 PreparedStatement 替换 OracleCallableStatement 就没有问题了
-
OUT 参数需要从过程中检索,因为后者在代码中使用。包装函数是什么意思?
-
@vlcik 我的意思是一个 PL/SQL 函数,它将执行您的过程并返回 OUT 参数值作为函数结果。然后你可以执行一个准备好的语句,如
select func_person_update(?,?) from dual
标签: java oracle spring stored-procedures jdbc