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
当我 运行 使用 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