首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用mnesia:select/4和mnesia:select/1进行分页查询

如何使用mnesia:select/4和mnesia:select/1进行分页查询
EN

Stack Overflow用户
提问于 2013-08-13 09:42:37
回答 1查看 1.1K关注 0票数 0

一个名为" md“的表具有结构{id,name},我希望从md读取记录使用分页查询,我尝试了mnesia:select/4和mnesia:select/1,如下所示:

代码语言:javascript
运行
复制
%% first use select/2: "ID < 10",returned [1,2,4,3,8,5,9,7,6]
(ejabberd@localhost)5> mnesia:activity(transaction,fun mnesia:select/2,md,                 [{{md,'$1','_'},[{'<','$1',10}],['$1']}]).
{atomic,[1,2,4,3,8,5,9,7,6]}

%%but when query with select/4,returned [6], why?
(ejabberd@localhost)7> {atomic,{R1,C1}}=mnesia:activity(transaction,fun mnesia:select/4,md,[{{md,'$1','_'},[{'<','$1',10}],['$1']}],5,read).
{atomic,{[6],
     {mnesia_select,md,
                    {tid,10535470,<0.460.0>},
                    ejabberd@localhost,disc_only_copies,
                    {dets_cont,select,5,
                               <<0,0,0,29,18,52,86,120,0,0,0,21,131,104,3,...>>,
                               {141720,148792,<<>>},
                               md,<0.130.0>,<<>>},
                    [],undefined,undefined,
                    [{{md,'$1','_'},[{'<','$1',10}],['$1']}]}}}
%% and then use mnesia:select/1 with continuation "C1",got wrong_transaction
(ejabberd@localhost)8> mnesia:activity(transaction,fun mnesia:select/1,C1).
{aborted,wrong_transaction}

如何使用mnesia:select/4和mnesia:select/1进行分页查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-17 13:06:16

以下是我的解决方案:使用async_dirty而不是transaction

代码语言:javascript
运行
复制
{Record,Cont}=mnesia:activity(async_dirty, fun mnesia:select/4,[md,[{Match_head,[Guard],[Result]}],Limit,read])

然后阅读下一个限制记录数:

代码语言:javascript
运行
复制
mnesia:activity(async_dirty, fun mnesia:select/1,[Cont])

完整代码:

代码语言:javascript
运行
复制
-record(md,{id,name}).
batch_delete(Id,Limit) ->
    Match_head = #md{id='$1',name='$2'},
    Guard = {'<','$1',Id},
    Result = '$_',
    {Record,Cont} = mnesia:activity(async_dirty, fun mnesia:select/4,[md,[{Match_head,[Guard],[Result]}],Limit,read]),
    delete_next({Record,Cont}).

delete_next('$end_of_table') ->
    over;
delete_next({Record,Cont}) ->
    delete(Record),
    delete_next(mnesia:activity(async_dirty, fun mnesia:select/1,[Cont])).

delete(Records) ->
    io:format("delete(~p)~n",[Records]),
    F = fun() ->
        [ mnesia:delete_object(O) || O <- Records]
    end,
    mnesia:transaction(F).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18205689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档