Java 用SpringJDBCAPI批量执行存储过程
是否可以在批处理模式下使用SpringJDBCAPI执行存储过程 我尝试使用SpringJDBCTemplate的方法batchUpdate,但它不起作用。 我使用Spring3.0和OracleJDBC驱动程序版本11.2.0.3Java 用SpringJDBCAPI批量执行存储过程,java,oracle,spring,stored-procedures,jdbc,Java,Oracle,Spring,Stored Procedures,Jdbc,是否可以在批处理模式下使用SpringJDBCAPI执行存储过程 我尝试使用SpringJDBCTemplate的方法batchUpdate,但它不起作用。 我使用Spring3.0和OracleJDBC驱动程序版本11.2.0.3 JdbcTemplate template = new JdbcTemplate(dataSource); template.batchUpdate("BEGIN SCHEMA.PERSON_UPDATE(I_N_PERSON_ID=> ?
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();
}}
);
谢谢方法
setValues
的实现有错误。您创建了OracleCallableStatement
的实例,但必须在PreparedStatement
中注册参数,这些参数在方法argement中给出,如ps
JdbcTemplate template = new JdbcTemplate(dataSource);
template.batchUpdate("{call SCHEMA.PERSON_UPDATE(?, ?)}",
new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, persons.get(i).getName());
ps.setLong(2, persons.get(i).getPersonId());
}
public int getBatchSize() {
return persons.size();
}
}
);
但有一个问题
PreparedStatement
不使用out参数。它到底是如何工作的?我无法注册出过程的参数,因为出现异常:PreparedStatement无法强制转换到oracle.jdbc.internal.OracleCallableStatement是否有方法注册出参数?为什么在这里需要out参数?我看不到任何代码中的结果处理。由于您在这里只能使用准备好的语句,而不能使用可调用的语句,所以您可以从过程中删除OUT参数,也可以编写包装函数并从dual中选择它。然后,您可以用PreparedStatement替换OracleCallableStatement,并且不存在任何问题。由于在代码中使用了PreparedStatement,所以需要从过程中检索参数。包装函数是什么意思?@vlcik我指的是一个PL/SQL函数,它将执行您的过程并将参数值作为函数结果返回。然后,您可以从dual执行一条准备好的语句,如select func\u person\u update(?,)