google半天,没找到有人写者方面的,我就开个头吧。有不对的地方还请大侠们拍砖。
要点其实很简单,就是把在declareParameter时要先声明返回结果集参数,再声明input参数。
先看看程序吧:
Sybase 存储过程
代码
- IF OBJECT_ID('dbo.sp_xx') IS NOT NULL
- BEGIN
- DROP PROCEDURE dbo.sp_xx
- IF OBJECT_ID('dbo.sp_xx') IS NOT NULL
- PRINT '<<< FAILED DROPPING PROCEDURE dbo.sp_xx >>>'
- ELSE
- PRINT '<<< DROPPED PROCEDURE dbo.sp_xx >>>'
- END
- go
- create proc sp_xx ( @userid int)
- as
- begin
- select personid, personname from person where personid = @userid
-
- select teamid, teamname from team
- end
-
- EXEC sp_procxmode 'dbo.sp_xx','unchained'
- go
<script>render_code();</script>
正确的java调用程序如下
代码
- private class ProcWithResultSet extends StoredProcedure
- {
- public ProcWithResultSet(DataSource dataSource)
- {
- setDataSource(dataSource);
- setSql("sp_xx");
-
-
-
- declareParameter(new SqlReturnResultSet("rsPerson", new PersonRowMapper()));
-
- declareParameter(new SqlReturnResultSet("rsTeam", new TeamRowMapper()));
-
- declareParameter(new SqlParameter("userid", java.sql.Types.INTEGER));
-
- compile();
- }
-
- public Map getRsFromSP(int userID)
- {
-
- Map map = new HashMap();
- map.put("userid", new Integer(userID));
- return execute(map);
- }
- }
-
- private class PersonRowMapper implements RowMapper
- {
- public Object mapRow(ResultSet rs, int rowNum) throws SQLException
- {
- UserInfo u = new UserInfo();
- u.setPersonID(rs.getInt(1));
- u.setUserName(rs.getString(2));
- return u;
- }
- }
- private class TeamRowMapper implements RowMapper
- {
- public Object mapRow(ResultSet rs, int rowNum) throws SQLException
- {
- return new PropertyValue(rs.getInt(1)+"", rs.getString(2));
- }
- }
<script>render_code();</script>
Spring中对于jdbc 调用带有返回结果集的存储过程是用的这个方法。
代码
-
-
-
-
-
-
- protected Map extractReturnedResultSets(CallableStatement cs, List parameters, int updateCount)
- throws SQLException {
-
- Map returnedResults = new HashMap();
- int rsIndex = 0;
- boolean moreResults;
- do {
- if (updateCount == -1) {
- Object param = null;
- if (parameters != null && parameters.size() > rsIndex) {
- param = parameters.get(rsIndex);
- }
- if (param instanceof SqlReturnResultSet) {
- SqlReturnResultSet rsParam = (SqlReturnResultSet) param;
- returnedResults.putAll(processResultSet(cs.getResultSet(), rsParam));
- }
- else {
- logger.warn("Results returned from stored procedure but a corresponding " +
- "SqlOutParameter/SqlReturnResultSet parameter was not declared");
- }
- rsIndex++;
- }
- moreResults = cs.getMoreResults();
- updateCount = cs.getUpdateCount();
- if (logger.isDebugEnabled()) {
- logger.debug("CallableStatement.getUpdateCount() returned " + updateCount);
- }
- }
- while (moreResults || updateCount != -1);
- return returnedResults;
- }
<script>render_code();</script>
原因分析:
1:Sybase不支持Out 参数返回结果集。只能再Sp当中最后select column from some table
2:Sybase的JDBC Driver对于jdbc的实现比较令人费解,如果一个Sp返回多个结果集,如果不调用第一个结果集即statement.getResultSet()
那么接下来statementcs.getMoreResults()会返回False,即使有有第二个返回结果集,它一样返回false,那么Spring就会把返回结果认为是一个update的
结果,就不会对其它结果集进行处理。
3:Spring中如果jdbc返回结果集,那么程序会执行到(3)处,这里rsIndex = 0,如果输入参数声明在先,那么这里得到的将会是输入参数,
(5)处的cs.getResultSet()将不会被执行,第一个ResultSet不会被处理,同时,因为(5)处没有被执行,那么(6)处会返回false,也就是解下来
的结果集不会被正确的认出来,Spring也不会去处理后续的结果集,这样就一个结果集也得不到了。
4:这里主要还是Sybase jdbcDriver在实现jdbc时有bug,但是我们只能顺着人家来,在用Spring Jdbctemplate调用时注意一下了。
|
相关推荐
使用spring jdbc template简化jdbc数据库操作实例代码,简化操作,包括详细测试例子。
开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6....
Spring JdbcTemplate调用Oracle存储过程输出游标结果集实现增删改查
赠送jar包:spring-jdbc-5.3.15.jar; 赠送原API文档:spring-jdbc-5.3.15-javadoc.jar; 赠送源代码:spring-jdbc-5.3.15-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.15.pom; 包含翻译后的API文档:...
Spring boot+Spring JDBC Template+mysql+ sharding-j-subdb
(1)使用Spring JDBC实现书店的购书过程,即有如下一个BookShopDao接口,编写BookShopDaoImp类实现该接口中的所有方法,并通过JUnit测试这些方法。 (2)(2) 在BookShopDao中添加一个purchase购书方法,其操作流程是...
使用 Spring JDBC Template 对数据库查询(登录)和删除(maven),图文教程地址:https://blog.csdn.net/qq_40147863/article/details/86015509
使用 Spring MVC + JDBC Template 实现筛选、检索功能(maven),图文教程地址:https://blog.csdn.net/qq_40147863/article/details/86187642
使用Spring的JdbcTemplate调用Oracle的存储过程
赠送jar包:spring-jdbc-5.3.7.jar; 赠送原API文档:spring-jdbc-5.3.7-javadoc.jar; 赠送源代码:spring-jdbc-5.3.7-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.7.pom; 包含翻译后的API文档:spring...
赠送jar包:spring-jdbc-5.3.10.jar; 赠送原API文档:spring-jdbc-5.3.10-javadoc.jar; 赠送源代码:spring-jdbc-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.10.pom; 包含翻译后的API文档:...
赠送jar包:spring-jdbc-5.0.8.RELEASE.jar; 赠送原API文档:spring-jdbc-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-jdbc-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.0.8.RELEASE....
赠送jar包:spring-jdbc-5.2.7.RELEASE.jar; 赠送原API文档:spring-jdbc-5.2.7.RELEASE-javadoc.jar; 赠送源代码:spring-jdbc-5.2.7.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.2.7.RELEASE....
JDBC规范 java.sql和javax.sql两个包中的类与接口(天龙八部): ... CallableStatement:调用存储过程 ResultSet:结果集,封装了多条记录 JDBC数据库连接池/Connection Pool DBCP:apache tomcat内置
使用J2EE+Spring+Ibatis+JDBC 调用存储过程,并返回结果集的配置详细。 供学习参考。
赠送jar包:spring-jdbc-5.2.0.RELEASE.jar; 赠送原API文档:spring-jdbc-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-jdbc-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.2.0.RELEASE....
赠送jar包:spring-jdbc-5.1.3.RELEASE.jar; 赠送原API文档:spring-jdbc-5.1.3.RELEASE-javadoc.jar; 赠送源代码:spring-jdbc-5.1.3.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.1.3.RELEASE....
赠送jar包:spring-jdbc-4.3.20.RELEASE.jar; 赠送原API文档:spring-jdbc-4.3.20.RELEASE-javadoc.jar; 赠送源代码:spring-jdbc-4.3.20.RELEASE-sources.jar; 包含翻译后的API文档:spring-jdbc-4.3.20....
spring-jdbc-5.1.3.RELEASE-javadoc.jar 2018-11-27 10:05 1461865 spring-jdbc-5.1.3.RELEASE-javadoc.jar.asc 2018-11-27 10:05 475 spring-jdbc-5.1.3.RELEASE-javadoc.jar.md5 2018-11-27 10:05 32 spring-...
赠送jar包:spring-jdbc-5.3.7.jar; 赠送原API文档:spring-jdbc-5.3.7-javadoc.jar; 赠送源代码:spring-jdbc-5.3.7-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.7.pom; 包含翻译后的API文档:spring...