- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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/
我们正在设计企业应用程序,我们的技术架构师建议“让代码中没有 sql 查询。即使它是对数据库的简单选择调用,也应该在数据库中为其编写存储过程”代码应该调用它。” 我的问题是,在整个代码中只有存储过程而
第一次尝试通过 cfscript 使用存储过程时,我不知道如何获得结果。对于常规查询,我会执行类似这样的操作来获取我的结果集: queryResult = queryResult.execute().
我们正在尝试在 Java 中执行存储过程,如下所示, CREATE PROCEDURE [dbo].[MyProc] ( @input1 varchar(20), @input2 va
这个问题在这里已经有了答案: 关闭9年前。 Possible Duplicate: EF4 - The selected stored procedure returns no columns 我有一
我的 SP 只有 4 个输出参数,没有输入参数,我的 StoredProcedureItemReader conf 看起来像这样 class="org.springframework.bat
我在 Entity Framework 4 上跪了下来,但遇到了一个小问题。 我有一些存储过程可以放入我的 EDMX。当我从这些 procs 创建复杂类型时,EF 获取列信息没有问题。除了一处。困惑了
我已经和这个问题斗争了一段时间了。我有一个存储过程,它接受 3 个用于过滤的参数。如果传入特定值,我想对其进行过滤。如果传入-1,则全部给我。 我尝试了以下两种方法: 第一种方式: SELECT fi
我想获得我可以从 SP 获得的结果集和列的列表。我已经能够获取参数、脚本...但我不知道从哪里获取结果集和列名。 using Microsoft.SqlServer.Management.Smo; u
我们在 SQL Server 2012 中的一个数据库(数据库 A)即将停用。我正在分析数据库 B 中使用数据库 A 作为数据源的所有 View 和 StoredProcs。如何编写查询来检索此信息。
我在创建表适配器时使用存储过程。这是我的语法: DELIMITER $$ DROP PROCEDURE IF EXISTS `lcs_rdb`.`sp_EmployeeListReport`$$ CR
我已经使用 SS2.1 有一段时间了,并且非常喜欢它。然而,我注意到 2.2 已经发布了,所以我认为最好升级。将 2.2 放入我的 bin 文件夹后,它不再从 MySQL 构建与 v2.1 完美配合的
我是一名优秀的程序员,十分优秀!