Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用SpringJDBCAPI批量执行存储过程_Java_Oracle_Spring_Stored Procedures_Jdbc - Fatal编程技术网

Java 用SpringJDBCAPI批量执行存储过程

Java 用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=> ?

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