注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一线天色 天宇星辰

天下武功,唯快不破

 
 
 

日志

 
 

Output parameters have not yet been processed. Call getMoreResults()解决方案  

2012-05-05 22:16:40|  分类: 软件开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    近日,由于某个业务需要跨类型的数据库,程序通过多个数据源来查询无法实现联合查询,因此采用存储过程实现的方式,但是调用存储过程的时候总是出现如标题的错误(Output parameters have not yet been processed. Call getMoreResults()),仔细排查mybatis的配置,发现调用方式也是正常的,如下所示:

<resultMap type="java.util.HashMap" id="PersonalGetGiftConditionResultMap">

       <result column="member_name" jdbcType="VARCHAR" property="memberName" javaType="java.lang.String"/>

       <result column="vip_level" jdbcType="VARCHAR" property="vipLevelCur" javaType="java.lang.String"/>

       <result column="gift_name" jdbcType="VARCHAR" property="giftName" javaType="java.lang.String"/>

       <result column="time_get" jdbcType="TIMESTAMP" property="timeGet" javaType="java.util.Date"/>

       <result column="get_state" jdbcType="VARCHAR" property="getState" javaType="java.lang.String"/>

       <result column="pre_vip_level" jdbcType="VARCHAR" property="vipLevel" javaType="java.lang.String"/>

       <result column="gift_content" jdbcType="VARCHAR" property="giftContent" javaType="java.lang.String"/>

    </resultMap>

   

    <select id="findByProc" statementType="CALLABLE" parameterType="java.util.HashMap" resultMap="PersonalGetGiftConditionResultMap">

       <![CDATA[

           {call dbo.p_rpt_personal_get_gift(

              #{vipLevelStr,mode=IN,jdbcType=VARCHAR},

              #{memberName,mode=IN,jdbcType=VARCHAR},

              #{getState,mode=IN,jdbcType=VARCHAR},

              #{beginTime,mode=IN,jdbcType=TIMESTAMP},

              #{endTime,mode=IN,jdbcType=TIMESTAMP},

              #{pageNum,mode=IN,jdbcType=INTEGER},

              #{pageSize,mode=IN,jdbcType=INTEGER},

              #{totalCounts,mode=OUT,jdbcType=INTEGER}

           )}    

       ]]>

    </select>

仔细检查,是在没有发现什么错误,具体的错误信息如下:

Output parameters have not yet been processed. Call getMoreResults()解决方案 - 一线天色 天宇星辰 - 一线天色 天宇星辰

 查询资料,在网上找到了

mybatisbug清单,说mybatis自身有一个bug(地址:https://issues.apache.org/jira/browse/IBATIS-769),如下图所示:

Output parameters have not yet been processed. Call getMoreResults()解决方案 - 一线天色 天宇星辰 - 一线天色 天宇星辰

 并且给出了解决方案:

Output parameters have not yet been processed. Call getMoreResults()解决方案 - 一线天色 天宇星辰 - 一线天色 天宇星辰

 我查询我的版本,发现我的版本是

3.0.4按照官方的说法,已经修复了这个bug的,那为啥还报这个错误的呢?

我把对应的存储过程改掉,返回一张表的数据和对应的output参数,结果正常执行了,也就是说不是我Java代码写的有问题,而是这个存储过程哪里有问题,导致了返回的不正确。再次查看对应的错误信息,发现错误信息的意思是,我们需要在output参数执行之前,需要先处理结果集的数据,MSSQL不支持在结果集被处理之前处理output的参数。但是我明明已经处理了结果集了,为什么还出现呢?再次查看存储过程,终于发现了其中的猫腻。原来为了实现两个数据库的关联,存储过程是吧其中mysql数据库的数据先通过连接服务器查询(select into)到对应的一个临时表,然后通过临时表和sqlserver中的表进行关联查询获取,而select into是没有结果集返回的,但是却带来一个问题就是,他返回了影响的结果集的行数,mybatis也把这个当作是一个返回的结果集,因此就有2个不同的结果集,mybatis认为还有一个结果集没有处理(因为一旦直接处理返回的参数,这个返回的结果集就丢失了),因此提示用户调用call getMoreResults先处理结果集。

问题找到了,解决来就好办多了,直接让DB不返回对应的影响行数就好了,果断加上set nocount on然后在执行结束的地方加上set nocount off再次执行,运行正常,问题修复!

不过调用存储过程还是需要注意一些问题的。

1、  对于结果集,返回的mapjdbctype需要设置为OTHER

2、  statementType要为CALLABLE类型

3、  不能返回多个结果集,如果有多个结果集的需求,通过return参数或者output参数输出

4、  <select>中要写上resultMap,这个map可以指定对应的对象类型,但是不会将这个map转换为对应你需要的对象类型。

  评论这张
 
阅读(2859)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017