[erlang-questions] Iterating (Page scrolling) over Mnesia database

David King dking@REDACTED
Fri Sep 21 19:10:35 CEST 2007

> I am looking for a way to iterate over the results in the Mnesia  
> that are ordered by some element, in other words equivalent of
> SELECT * FROM TABLE ORDER BY MYFIELD -- that can return results in  
> cursor like fashion

The idea is to combine query handles, like this:

mnesia:transaction(fun() ->
   % give me all of the authors from the author table with an ID over 10
   Q1=qlc:q([ X || X <- mnesia:table(author), X#author.id > 10 ]),

   % sort them by name
               {order, % I'm using the OrderFun form here. See  
                fun(Author1,Author2) ->
                  Author1#author.name < Author2#author.name

   % and run the query

Note that these query handles aren't evaluated until you ask them to  
be (with fold, cursor, eval, etc), so it's not as inefficient as  
sorting them all in memory if, for instance, indexes are available..  
To iterate over them, use qlc:fold or qlc:cursor instead of qlc:eval:

qlc:fold(fun(Author,AccIn) ->
          end, 0, Q2).

That would give me the sum of all of the IDs in the results (which is  
a bit contrived, but you get the idea)

More information at http://www.erlang.org/doc/man/qlc.html

> Or page scrolling like
> SELECT * FROM TABLE ORDER BY MYFIELD where rownum > 100 and rownum  
> < 200;
> I see foldl and foldr methods can iterate, and qlc can query, but  
> can someone point me how to implement Cursor or page scrolling  
> behavior.
> Thanks in advance.
> -Shahzad Bhatti
> Moody friends. Drama queens. Your life? Nope! - their life, your  
> story.
> Play Sims Stories at Yahoo! Games.
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions

More information about the erlang-questions mailing list