Spring批处理StoredProcedureItemReader

时间:2015-01-22 20:28:56

标签: spring-batch

使用Spring Batch运行存储过程时出现以下错误:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: L'index 0 du paramètre de sortie n'est pas valide.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
    at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.getterGetParam(SQLServerCallableStatement.java:354)
    at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.getObject(SQLServerCallableStatement.java:659)
    at org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:214)
    ... 18 more

存储过程包含一个负责错误的create table命令。

存储过程:

ALTER PROCEDURE [dbo].[TEST]
    @orgKeyParam bigint
AS
BEGIN

CREATE TABLE #tmpPatients (
    programID bigint NOT NULL)

drop table #tmpPatients;

SELECT last_name from patient;
END

StoredProcedureItemReader配置:

<bean id="DBReader"
        class="org.springframework.batch.item.database.StoredProcedureItemReader">
        <property name="dataSource" ref="dataSource2" />
        <property name="procedureName" value="[${sql.RPMDBName}].dbo.Test" />
        <property name="fetchSize" value="50" />
                <property name="parameters">
            <list>
                <bean class="org.springframework.jdbc.core.SqlParameter">
                    <constructor-arg index="0" value="orgKeyParam" />
                    <constructor-arg index="1">
                        <util:constant static-field="java.sql.Types.INTEGER" />
                    </constructor-arg>
                </bean>
            </list>
        </property>
        <property name="rowMapper" ref="dataRowMapper" />
        <property name="preparedStatementSetter" ref="preparedStatementSetter" />
    </bean>

    <bean id="preparedStatementSetter"
        class="org.springframework.batch.core.resource.ListPreparedStatementSetter" scope="step">
        <property name="parameters">
            <list>
                <value>1</value>
            </list>
        </property>
    </bean>

2 个答案:

答案 0 :(得分:0)

如果没有看到您的存储过程或您已配置StoredProcedureItemReader的方式,我无法为您提供准确的解决方法。但是,错误是索引0处的参数无效。默认情况下,StoredProcedureItemReader查找返回的第一个out参数。我假设您已经将您的阅读器配置为寻找其他地方,或者您的存储过程没有为它的首先输出参数返回光标。

答案 1 :(得分:0)

在sql server存储过程中使用nocount on。 在开始陈述之前使用的shoul b