繁体   English   中英

Exec 存储过程不适用于 JdbcCursorItemReader

[英]Exec stored procedure not working with JdbcCursorItemReader

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

引起:org.springframework.jdbc.UncategorizedSQLException: Executing query; SQL [exec proc_1] 的未分类 SQLException; SQL 状态 [ZZZZZ]; 错误代码 [7773]; 在包含非 SELECT 或带有 COMPUTE 子句的 SELECT 的过程上声明了执行游标“jconnect_implicit_1”。 为了使这个游标的声明合法,它应该有一个没有 COMPUTE 子句的 SELECT 语句。

; 嵌套异常是 com.sybase.jdbc4.jdbc.SybSQLException:在包含非 SELECT 或带有 COMPUTE 子句的 SELECT 的过程上声明了执行游标“jconnect_implicit_1”。 为了使这个游标的声明合法,它应该有一个没有 COMPUTE 子句的 SELECT 语句。 ...省略了43个常用帧

引起:com.sybase.jdbc4.jdbc.SybSQLException:在包含非 SELECT 或带有 COMPUTE 子句的 SELECT 的过程上声明了执行游标“jconnect_implicit_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

即使按照建议使用 StoredProcedureItemReader 后,也会出现以下错误:

引起:org.springframework.jdbc.UncategorizedSQLException:正在执行存储过程; SQL [{call ftsps_report(?, ?)}] 的未分类 SQLException; SQL 状态 [ZZZZZ]; 错误代码 [7773]; 在包含非 SELECT 或带有 COMPUTE 子句的 SELECT 的过程上声明了执行游标“jconnect_implicit_1”。 为了使这个游标的声明合法,它应该有一个没有 COMPUTE 子句的 SELECT 语句。

; 嵌套异常是 com.sybase.jdbc4.jdbc.SybSQLException:在包含非 SELECT 或带有 COMPUTE 子句的 SELECT 的过程上声明了执行游标“jconnect_implicit_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:在包含非 SELECT 或带有 COMPUTE 子句的 SELECT 的过程上声明了执行游标“jconnect_implicit_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));

我也尝试了其他一些存储过程并遇到了类似的问题。 是不是定义错误。 我只想最好按索引定义参数。 有什么直接的方法吗? 是否期望存储过程中的参数专门命名为 date1/date2 并因此而失败?

对于存储过程,您需要使用StoredProcedureItemReader而不是JdbcCursorItemReader ,例如:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM