【问题标题】:Batch executing of stored procedure with Spring JDBC API使用 Spring JDBC API 批量执行存储过程
【发布时间】: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


【解决方案1】:

方法setValues的实现有错误。您创建了OracleCallableStatement 的实例,但您必须在PreparedStatement 中注册参数,这些参数在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 参数。

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 1970-01-01
    • 2015-12-25
    • 2011-12-14
    • 2023-04-01
    • 2012-09-05
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多