使用Spring JDBC API批量执行存储过程

时间:2012-10-24 11:31:51

标签: java oracle spring stored-procedures jdbc

是否可以在批处理模式下使用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();
                    }} 
                );

由于

1 个答案:

答案 0 :(得分:0)

方法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参数。