2 ych516 ych516 于 2016.03.02 18:35 提问

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

(网上搜到的案例,都是固定个数的多个结果集的场景,比如这种:http://www.iteye.com/problems/78259 。**请注意,我的问题与此不同**。)

我需要返回不确定个数个结果集。MySQL存储过程形如:

while(i <= n + 1) do
    select * from t_tab t where t.a = i limit 0,20;
end while

其中,**n是外部传入的。结果集的个数为n个,每个结果集最多20条记录**。

我要如何才能通过myBatis框架获取完整结果集。
期望返回的数据结构:

     List<List<Tab>> queryTop20(@Param("n") Integer n);

通过如下的配置不能如愿:

    <select id="queryTop20" statementType="CALLABLE"
        resultType="Tab">
        <![CDATA[  
            {call queryTop20(#{n, mode=IN, jdbcType=INTEGER}
            )}  
        ]]>
    </select>

如下配置虽然能得到想要的结果,但是这也太烂了,而且会限定n的上限:

     <select id="queryTop20" statementType="CALLABLE"
        resultMap="Tab,Tab,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ,Tab ">
        <![CDATA[  
            {call queryTop20(#{n, mode=IN, jdbcType=INTEGER}
            )}  
        ]]>
    </select>

请问,怎样才是通过MyBatis获取MySQL存储过程的不确定个数个结果集的正确方式?

5个回答

wuke_wubuke
wuke_wubuke   2016.03.03 09:25
已采纳

如果对结果集的格式没有强制要求的话,如果可以接受合并为一个结果集返回的话:

 List<Tab> queryTop20(@Param("n") Integer n);

那么,可以将多个结果集放入临时表,然后将结果一并返回:

    CREATE TEMPORARY TABLE IF NOT EXISTS temp_tab
    (
    ...
    );
    TRUNCATE TABLE temp_tab;

    while(i <= n + 1) do
        INSERT INTO temp_tab select * from t_tab t where t.a = i limit 0,20;
    end while

    SELECT * FROM temp_tab;
ych516
ych516 这倒是个解决方法,感谢!
接近 2 年之前 回复
qq_34147905
qq_34147905   2016.03.02 20:32

mysql存储过程是这样的
create procedure sp_get_user_count
(
out v_count int
)
begin
select count(1) into v_count from t_user;
select * from t_dept;
select * from t_class;
end;
由于mysql不能返回游标,那么使用mybatis框架在取的时候应该怎么取呢?怎样确定取出来的是t_dept的还是t_class?


call sp_get_user_count()

ych516
ych516 大神,能不能先看下问题描述,我是真的很急,没有意义的东西就不要拷贝粘贴了
接近 2 年之前 回复
qq_34147905
qq_34147905   2016.03.02 20:32

mysql存储过程是这样的
create procedure sp_get_user_count
(
out v_count int
)
begin
select count(1) into v_count from t_user;
select * from t_dept;
select * from t_class;
end;
由于mysql不能返回游标,那么使用mybatis框架在取的时候应该怎么取呢?怎样确定取出来的是t_dept的还是t_class?


call sp_get_user_count()

devmiao
devmiao   Ds   Rxr 2016.03.02 18:59
ych516
ych516 你找的这个案例也是固定个数的结果集哈
接近 2 年之前 回复
fei12990
fei12990   2016.07.13 19:27

楼主你解决这个问题了吗,除了合并到临时表的方案

ych516
ych516 最后采用的存储过程+临时表的方案,可以解决问题,没有找到其他方案。。。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!