gpt4 book ai didi

java - Spring Batch StoredProcedureItemReader 仅使用输出参数读取 StoredProc(无输入参数)

转载 作者:行者123 更新时间:2023-12-02 03:37:23 26 4
gpt4 key购买 nike

我的 SP 只有 4 个输出参数,没有输入参数,我的 StoredProcedureItemReader conf 看起来像这样

<bean id="spItemReader">
class="org.springframework.batch.item.database.StoredProcedureItemReader" >
<property name="dataSource" ref="dataSource"/>
<property name="procedureName" value="mynamespace.spname"/>
<property name="refCursorPosition" value="1"></property>
<property name="rowMapper">
<bean class="MyRowMapper"/>
</property>
<property name="parameters">
<list>
<bean class="org.springframework.jdbc.core.SqlParameter">
<constructor-arg index="0" value="column1"/>
<constructor-arg index="1">
<util:constant static-field="java.sql.Types.SMALLINT"/>
</constructor-arg>
</bean>
<bean class="org.springframework.jdbc.core.SqlParameter">
<constructor-arg index="0" value="P_column2"/>
<constructor-arg index="1">
<util:constant static-field="java.sql.Types.VARCHAR"/>
</constructor-arg>
</bean>
<bean class="org.springframework.jdbc.core.SqlParameter">
<constructor-arg index="0" value="P_column3"/>
<constructor-arg index="1">
<util:constant static-field="java.sql.Types.INTEGER"/>
</constructor-arg>
</bean>
<bean class="org.springframework.jdbc.core.SqlParameter">
<constructor-arg index="0" value="P_column4"/>
<constructor-arg index="1">
<util:constant static-field="java.sql.Types.CHAR"/>
</constructor-arg>
</bean>
</list>
</property>
</bean>

我将 dataSource 作为 org.springframework.jdbc.datasource.DriverManagerDataSource 的实例,并使用 com.ibm.db2.jcc.DB2Driver 连接到 DB2 作为驱动程序类。

我的作业配置如下:

<job id="testJob" xmlns="http://www.springframework.org/schema/batch">
<step id="step1">
<tasklet>
<chunk reader="spItemReader" writer="eventItemWriter"
commit-interval="1" />
</tasklet>
</step>
</job>

<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="transactionManager" />
</bean>

<bean id="transactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>

我有 writer 作为 StaxEventItemWriter 和正确的 unmarshaller 配置。

问题是当我运行批处理时,我不断收到:

Caused by: org.springframework.jdbc.BadSqlGrammarException: Executing stored procedure; bad SQL grammar [{call mynamespace.spname(?, ?, ?, ?)}]; nested exception is com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=PROCEDURE;BSCPROC.PKA109, DRIVER=4.19.26

我不确定我错过了什么,请建议我应该如何解决这个问题。如果需要更多信息,请告诉我。

最佳答案

我自己终于找到了解决办法。 Spring Batch API 提供的StoredProcedureItemReader 提供PreparedStatementSetter,它必须类型转换为CallableStatement。因为 StoredProcedures 不能与PreparedStatements 一起使用。我们必须通过为PreparedStatementSetter 提供自定义实现来重写setValues 方法。配置应该是这样的。

注意:属性名称=“preparedStatementSetter”ref=“paramSet”

代码:

<bean id="spItemReader"
class="org.springframework.batch.item.database.StoredProcedureItemReader" >
<property name="dataSource" ref="dataSource"/>
<property name="procedureName" value="mynamespace.spname"/>
<property name="refCursorPosition" value="1"></property>
<property name="preparedStatementSetter" ref="paramSet" ></property>
<property name="rowMapper">
<bean class="MyRowMapper"/>
</property>
<property name="parameters">
<list>
<bean class="org.springframework.jdbc.core.SqlParameter">
<constructor-arg index="0" value="column1"/>
<constructor-arg index="1">
<util:constant static-field="java.sql.Types.SMALLINT"/>
</constructor-arg>
</bean>
<bean class="org.springframework.jdbc.core.SqlParameter">
<constructor-arg index="0" value="P_column2"/>
<constructor-arg index="1">
<util:constant static-field="java.sql.Types.VARCHAR"/>
</constructor-arg>
</bean>
<bean class="org.springframework.jdbc.core.SqlParameter">
<constructor-arg index="0" value="P_column3"/>
<constructor-arg index="1">
<util:constant static-field="java.sql.Types.INTEGER"/>
</constructor-arg>
</bean>
<bean class="org.springframework.jdbc.core.SqlParameter">
<constructor-arg index="0" value="P_column4"/>
<constructor-arg index="1">
<util:constant static-field="java.sql.Types.CHAR"/>
</constructor-arg>
</bean>
</list>
</property>
</bean>

<bean id="paramSet" class="com.jpmc.ib.asup.batch.CustomSPParamSetter" ></bean>

PreparedStatementSetter 实现:

代码:

public class CustomSPParamSetter implements PreparedStatementSetter{

@Override
public void setValues(PreparedStatement ps) throws SQLException {

CallableStatement eventCallableSt=(CallableStatement)ps;
eventCallableSt.registerOutParameter(1, java.sql.Types.SMALLINT);
eventCallableSt.registerOutParameter(2, java.sql.Types.VARCHAR);
eventCallableSt.registerOutParameter(3, java.sql.Types.INTEGER);
eventCallableSt.registerOutParameter(4, java.sql.Types.CHAR);
}
}

在Spring配置文件和PreparedStatementSetter中声明SP参数是不合逻辑的。但这对我来说是正确的工作解决方案。

关于java - Spring Batch StoredProcedureItemReader 仅使用输出参数读取 StoredProc(无输入参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com