mybatis-Mybatis调用存储过程返回多个结果集

问题描述

Mybatis调用存储过程返回多个结果集

存储过程返回两个结果集(游标)。

 CREATE?OR?REPLACE?FUNCTION?t_user_func(id?varchar(20))
??RETURNS?SETOF?refcursor?AS
$BODY$
Declare
code?refcursor;
result?refcursor;
BEGIN?????
??--返回错误码
??OPEN?code?FOR?select?1010?as?code;
??RETURN?NEXT?code;
??--返回查询结果集
??OPEN?result?FOR?EXECUTE?'select?*?from?t_user?where?user_id?='''?||id||''''?;
??RETURN?NEXT?result;
??RETURN;
End;
$BODY$
??LANGUAGE?plpgsql?VOLATILE;

Mybatis映射文件是这样写的:

<select id="getUserByID" parameterType="map" statementType="CALLABLE">
    {call t_user_func(
    #{id,jdbcType=INTEGER,mode=IN},
    #{refcursor, mode=OUT,
    jdbcType=OTHER, javaType=ResultSet, resultMap=userResultMap}
    )
    }
</select>

<resultMap id="userResultMap" type="com.cet.ngp.model.UserStruct">
    <collection property="codes" ofType="com.cet.ngp.model.ResultCode">
        <id column="code" property="code" jdbcType="INTEGER" />
    </collection>
    <collection property="users" ofType="com.cet.ngp.model.User">
        <id column="user_id" property="userId" jdbcType="VARCHAR" />
        <result column="user_name" property="userName" jdbcType="VARCHAR" />
        <result column="user_birthday" property="userBirthday"
            jdbcType="DATE" />
        <result column="user_salary" property="userSalary" jdbcType="INTEGER" />
    </collection>
</resultMap>

只能获取到,code结果集,无法获取user结果集。
要怎么改,才能获取到user结果集。

解决方案

实现代码是这样的:

 public?List<UserStruct>?getUserById(String?id)?{
????????ApplicationContext?ctx=?DBModule.getConfigContext();
????????UserMapper?userDao=(UserMapper)?ctx.getBean("userMapper");????????
?????????
????????Map<String,?Object>?map?=?new?HashMap<String,?Object>();
????????map.put("id",?id);???
????????userDao.getUserByID(map);
????????????????//此处获取结果集
????????List<UserStruct>?resultList?=?(ArrayList<UserStruct>)?map.get("refcursor");
?????????
????????return?resultList;
????}???
时间: 2024-08-17 18:22:52

mybatis-Mybatis调用存储过程返回多个结果集的相关文章

ADO 调用存储过程返回多个记录集的问题(关于存储过程内Set NoCount On的作用)

  最近在 CSDN 上回答了好几个网友大致相同的问题 http://community.csdn.net/Expert/TopicView.asp?id=4131244 http://community.csdn.net/Expert/TopicView.asp?id=4156955 大致都是问:为什么没有返回数据集或将记录集赋给表格控件出错 产生问题的原因大致有几个 1.不清楚 ADO.Connection.Execute 的返回机制,所有使用该方法返回的记录集都是只读,仅向前游标的 所以赋

mybatis-如何通过MyBatis获取mysql存储过程返回的不确定个数的多个结果集?

问题描述 如何通过MyBatis获取mysql存储过程返回的不确定个数的多个结果集? (网上搜到的案例,都是固定个数的多个结果集的场景,比如这种:http://www.iteye.com/problems/78259 .**请注意,我的问题与此不同**.) 我需要返回不确定个数个结果集.MySQL存储过程形如: while(i <= n + 1) do select * from t_tab t where t.a = i limit 020;end while 其中,**n是外部传入的.结果集

php调用存储过程返回结果集

php调用存储过程返回结果集,解决can't return a result set in the given context错误的方法需要php调用存储过程,返回一个结果集,发现很困难,找了半天,终于在老外的论坛上找到解决方案,这里本地化一下. 关键就是两点 1)define('CLIENT_MULTI_RESULTS', 131072); 2)$link = mysql_connect("127.0.0.1", "root", "",1,CL

EF调用存储过程返回的结果集和过程执行的结果集不一致

问题描述 EF调用存储过程返回的结果集和直接在数据库里执行存储过程的结果不一样希望大家帮忙看一下. 解决方案 解决方案二:看下sql是否一致,参数传递有没有问题,是否是同一个数据库解决方案三:引用1楼苏小喵的回复: 看下sql是否一致,参数传递有没有问题,是否是同一个数据库 这些都没问题的呐!解决方案四:是修改前和修改后两个数据不一致吗?解决方案五:引用3楼JustinLiu27的回复: 是修改前和修改后两个数据不一致吗? 不是的,是在调用这个过程,返回的结果集,和在直接执行的结果不一致解决方案

PHP调用存储过程返回值不一致问题的解决方法分析_php技巧

本文实例讲述了PHP调用存储过程返回值不一致问题的解决方法.分享给大家供大家参考,具体如下: 今天遇一个同学聊存储过程返回值经常得到意外的值为null, 因为白天有事,晚上给做一个实验放在这里供有相应问题的同学查看一下. 存储过程: delimiter// createprocedureusp_s2(outpar1int) begin selectinet_ntoa(ip),portfromproxy_listlimit5; selectcount(*)intopar1fromproxy_lis

sql生成(c#调用存储过程返回数据表)代码的存储过程

GO /****** 对象: StoredProcedure [dbo].[pro_GenerateServiceFunction] 脚本日期: 08/04/2012 11:26:43 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pro_GenerateServiceFunction]') AND type in (N'P', N'PC')) DROP PROCEDURE [d

Entity Framework 5.0 调用存储过程 返回值为什么是int类型

问题描述 用VS2012+EntityFramework5.0生成代码但是生成的存储过程返回值有问题为什么生成的存储过程返回值为int类型??存储过程中操作复杂最后返回几个字段值.publicvirtualintGetMenuByRID(Nullable<int>rID){varrIDParameter=rID.HasValue?newObjectParameter("RID",rID):newObjectParameter("RID",typeof(i

SQL存储过程中调用存储过程返回的表

      存储过程pro_A返回一个表集合TableA,在存储过程pro_B中以TableA为数据源再做一重过滤,想实现代码复用,因此原意是在存储过程pro_B中调用存储过程pro_A,但事实发现我们不能写成select * from (exec pro_A para1,para2) a ;虽然返回结果是表集合. 后来想执行存储过程返回一个output表变量,就像一般变量一样,但存储过程可不支持这种写法:想到最后只能将pro_A 的内容写在一个函数中fn_A,函数支持返回表,可以写成selec

整理sqlserver 级联更新和删除 c#调用存储过程返回值

整理一下级联更新和删除 c#调用返回值 use master go IF exists(select 1 from sysdatabases where name='temp') BEGIN DROP DATABASE temp END create database temp go use temp go --drop table ProductInfo create table ProductInfo ( ProductId int primary key , ProductName var