我需要在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并因此失败?
对于存储过程,需要使用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中运行调用: