Spring 批处理 StoredProcedureItemReader

Spring batch StoredProcedureItemReader

当我 运行 使用 Spring 批处理的存储过程时出现以下错误:

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

存储过程包含一个创建 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>

没有看到您的存储过程或您配置 StoredProcedureItemReader 的方式,我无法为您提供确切的解决方案。但是,错误是索引 0 处的参数无效。默认情况下,StoredProcedureItemReader 查找返回的游标作为第一个输出参数。我将假设您已经将 reader 配置为在别处查找,或者您的存储过程没有为它的第一个输出参数返回游标。

在 sql 服务器存储过程中使用 nocount。 应该在 begin 语句之前使用 b