当前位置: 首页 > 知识库问答 >
问题:

Exec存储过程不使用JdbcCursorItemReader

裴宜春
2023-03-14

我需要在Spring批处理中使用JdbcCursorItemReader从select和exec Sybase查询中读取数据。虽然SELECT查询运行正常,但Exec查询遇到以下错误:

原因:组织。springframework。jdbc。UncategorizedSQLException:执行查询;SQL的未分类SQLException[执行过程1];SQL状态[ZZZZZ];错误代码【7773】;在包含non SELECT或SELECT with COMPUTE子句的过程上声明执行游标“jconnect\u implicit\u 1”。为了使这个游标的声明合法,它应该有一个没有COMPUTE子句的SELECT语句。

; 嵌套异常为com。sybase。jdbc4。jdbc。SybSQLException:在包含non SELECT或SELECT with COMPUTE子句的过程上声明执行游标“jconnect\u implicit\u 1”。为了使该游标的声明合法,它应该有一个没有COMPUTE子句的SELECT语句。。。省略43个公共框架

原因:com。sybase。jdbc4。jdbc。SybSQLException:在包含non SELECT或SELECT with COMPUTE子句的过程上声明执行游标“jconnect\u implicit\u 1”。为了使这个游标的声明合法,它应该有一个没有COMPUTE子句的SELECT语句。

...省略了45个常见帧

JdbcCursorItemReader的代码如下:

JdbcCursorItemReader itemReader = new JdbcCursorItemReader();
ColumnMapRowMapper rowMapper = new ColumnMapRowMapper();
itemReader.setDataSource(getDataSource());
itemReader.setRowMapper(rowMapper);
itemReader.setFetchSize(batchSize);
itemReader.setSql(dataSql); //datasql is passed Sybase query

即使在按照建议使用StoredProcess dureItemReader之后,也会出现以下错误:

由以下原因引起:org.springframework.jdbc.未分类SQLException:执行存储过程;SQL[{callftsps_report(?, ?)}]; SQL状态[ZZZZZ]的未分类SQLException;错误代码[7773];执行游标'jconnect_implicit_1'在包含非SELECT或带有COMPUTE子句的SELECT的过程上声明。为了使此游标的声明合法,它应该有一个不带COMPUTE子句的SELECT语句。

; 嵌套异常为com。sybase。jdbc4。jdbc。SybSQLException:在包含non SELECT或SELECT with COMPUTE子句的过程上声明执行游标“jconnect\u implicit\u 1”。为了使这个游标的声明合法,它应该有一个没有COMPUTE子句的SELECT语句。

           at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:90)

           at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)

           at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)

           at org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:226)

           at org.springframework.batch.item.database.AbstractCursorItemReader.doOpen(AbstractCursorItemReader.java:406)

           at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:144)

           ... 43 common frames omitted

原因:com。sybase。jdbc4。jdbc。SybSQLException:在包含non SELECT或SELECT with COMPUTE子句的过程上声明执行游标“jconnect\u implicit\u 1”。为了使这个游标的声明合法,它应该有一个没有COMPUTE子句的SELECT语句。

           at com.sybase.jdbc4.tds.Tds.processEed(Tds.java:4112)

           at com.sybase.jdbc4.tds.Tds.nextResult(Tds.java:3229)

           at com.sybase.jdbc4.tds.Tds.getResultSetResult(Tds.java:3974)

           at com.sybase.jdbc4.tds.TdsCursor.open(TdsCursor.java:333)

           at com.sybase.jdbc4.jdbc.SybCallableStatement.sendRpc(SybCallableStatement.java:2032)

           at com.sybase.jdbc4.jdbc.SybCallableStatement.execute(SybCallableStatement.java:241)

           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

           at java.lang.reflect.Method.invoke(Method.java:498)

           at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)

           at com.sun.proxy.$Proxy83.execute(Unknown Source)

           at org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:210)

已将StoredProcedureItemReader定义如下:

StoredProcedureItemReader itemReader = new StoredProcedureItemReader();
ColumnMapRowMapper rowMapper = new ColumnMapRowMapper();
itemReader.setDataSource(getDataSource());
itemReader.setRowMapper(rowMapper);
itemReader.setFetchSize(batchSize);
itemReader.setProcedureName(dataSql);
SqlParameter[] parameter = {new SqlParameter("date1", Types.DATE),new SqlParameter("date2", Types.DATE)};
itemReader.setParameters(parameter);
itemReader.setPreparedStatementSetter(psSetter);

其中,psSetter setValues的定义如下:

ps.setDate(1, Date.ValueOf(paramList.get(0));
ps.setDate(2, Date.ValueOf(paramList.get(1));

我也尝试了几个其他存储过程,但也遇到了类似的问题。是定义错误吗?我只想最好通过索引定义参数。有没有什么简单的方法可以做到这一点?是否期望store dproc中的参数专门命名为date1/date2并因此失败?

共有1个答案

华心思
2023-03-14

对于存储过程,需要使用StoredProcedureItemReader,而不是JdbcCursorItemReader,类似于:

@Bean
public StoredProcedureItemReader storedProcedureItemReader() {
    StoredProcedureItemReader reader = new StoredProcedureItemReader();
    reader.setProcedureName("yourProcedureName");
    // set other properties
    return reader;
}

有关更多详细信息,请参阅参考文档。

 类似资料:
  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 我有一个在包中定义的存储过程。该过程接受两个参数,一个是游标: 我是这样调用这个过程的: 它将返回以下错误: 你好,阿尼尔班。

  • 问题内容: 我们正处于一个新项目的开始,我们真的想知道是否应该在MySQL中使用存储过程。 我们将仅使用存储过程来插入和更新业务模型实体。有几个表代表一个模型实体,我们将在那些存储过程的插入/更新中对其进行抽象。 另一方面,我们可以从Model层调用插入和更新,但是不能在MySQL中,而是在PHP中。 根据您的经验, 哪个是最佳选择? 两种方法的优点和缺点。就高性能而言,哪个是最快的? PS:这是

  • 问题内容: 是否可以在另一个存储过程中使用一个存储过程的结果? IE 我尝试使用,但无法在嵌套语句中调用。 有什么办法可以做到这一点?环境是SQL Server 2008。 问题答案: 您最多可以嵌套32个级别的存储过程。 我建议阅读这篇有关INSERT- EXEC的文章。这是一个摘录: 如果some_sp尝试使用INSERT-EXEC调用some_other_sp,您将收到一条错误消息。因此,一

  • 目前,我正在作业步骤中使用JdbcCursorItemReader和FlatFileItemWriter。 由于性能问题,我们不得不使用存储过程。 在Spring Batch 2.0中有没有一种方法可以调用存储过程。释放? ...其他配置 如何使用可调用语句编写自定义数据库读取器...感谢示例代码..谢谢,。

  • 我使用JDBC这样调用这个过程: 它向我抛出一个错误,通知调用格式错误。 但是如果我像这样直接在IDE中运行调用: