求助 数据表格分页

loveajin 2010-11-26 10:43:17
在网上找到了很多sql语句分页的方法,思考了很久现在有如下疑问,请大家帮忙分析一下,谢谢

1.用sql语句分页需要多次查询,最少都是两次。不过直接就只返回自己想要的数据段。
2.如果要查询的表或存储过程没有主键,需要用到临时表。
3.采用结果集游标来操作,即只查询一次,然后处理,但是每次查询都要返回所有数据。
4.这个工程很多都是存储过程,几乎每个查询中都没有主键。数据量非常庞大。

综上几点,实在想不出好的处理方式,请有经验的高手帮帮忙,给点好的建议。谢谢啦。

另外有个同事说别用游标操作,容易产生死锁,我对数据库没做过深入了解,请大家帮忙解释一下,是不是真如此?还有个问题是我处理查询后返回的结果集,在处理的时候跟数据库还有没有关系,还是本身就是在对数据库操作了?
...全文
102 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
likeajin 2010-11-27
  • 打赏
  • 举报
回复
我来学习地
zhangliang_88 2010-11-26
  • 打赏
  • 举报
回复
就是sql语句 查的时候按需要查
loveajin 2010-11-26
  • 打赏
  • 举报
回复
谢谢大家,简单的说就是我想实现一个功能,通过一条sql语句读取任何一个表、一个存储过程、一个视图的一个数据段,比如读取从第m条开始,长度为n的一块数据,需要考虑到效率,资源等因素,比如读出的数据不要太多,查询的次数不要太多。
目前我们过程使用的数据库是开源的firebird,我已经解决了,大家可以继续发表,比如sql server的该如何处理,mysql的、oracle的、db2等等,集思广益,争取为每种数据库都找一个合适的方法,以便大家学习。
下面就分享一下fb的读取方式。这个方式是吃饭前找到的,没想到那么简单……
select first n skip m * from table where ……
这个语句是读取从第n-1条开始,长度为m条的一个数据块,还有其他方法,比如
select * from table rows n to m (2.0以上支持)
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 loveajin 的回复:]

引用 5 楼 dr_lou 的回复:
可以内存分页的。
例如:你有1000条记录,每页显示10条。你可以一次性读入10*5(页)条,然后用户翻前5页都不用访问db了。

抱歉,刚才没理解透,我这个帖问的就是如何实现你说的一次读入10*5条记录,用哪种方式好?
[/Quote]
你用的是什么数据库呢,如果是oracle就用rowid,如果是mysql就用limit
  • 打赏
  • 举报
回复
可以写一个Pager类,专门做分页的,对外提供一个方法,方法参数就是一个集合,返回值也是一个集合,这样只查询一次,把整个集合传到这个方法里,返回的就是分好页的集合了!
printf_2012 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 nfxpoi 的回复:]
不知道你用的什么数据库,这是oracle的分页

//合成分页sql
String _sql=
"select * from ( select row_.*, rownum rownum_ from ("+
sql+//你的sql语句,可以在这里写入你的SQL
") row_ where rownum <= "+pageIndex*pageSize+") where rownum_ >……
[/Quote]
。。。
dr_lou 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 loveajin 的回复:]
引用 5 楼 dr_lou 的回复:
可以内存分页的。
例如:你有1000条记录,每页显示10条。你可以一次性读入10*5(页)条,然后用户翻前5页都不用访问db了。

抱歉,刚才没理解透,我这个帖问的就是如何实现你说的一次读入10*5条记录,用哪种方式好?
[/Quote]

读入是问题么? 还是说读哪些? 另:没有主键的表不是好的设计吧。起码加一个sequence
fsdfdsffffff 2010-11-26
  • 打赏
  • 举报
回复
1.用sql语句分页需要多次查询,最少都是两次。不过直接就只返回自己想要的数据段。
2.如果要查询的表或存储过程没有主键,需要用到临时表。
3.采用结果集游标来操作,即只查询一次,然后处理,但是每次查询都要返回所有数据。
4.这个工程很多都是存储过程,几乎每个查询中都没有主键。数据量非常庞大。

1、我一直用的是上面说的分页语句类,没感觉到SQL语句分页要查询多少次
2、没有主键是有点麻烦,能对数据库进行优化吗?可以使用视图吗?
3、使用结果集?使用我给的SQL,返回的只是当前分页的数据,数据量不大,你可以自己写个虚拟表保存,达到系统即读即关的效果,避免人为意外未关闭数据库连接等对象,当然这个虚拟表要具备结果集的大部分操作功能
4、同2

fsdfdsffffff 2010-11-26
  • 打赏
  • 举报
回复
上面的mysql说错了,应该是:
String _sql="select * from ("+sql+") t10002 limit "+(pageIndex-1)*pageSize+","+pageSize;

String sql 是你的sql语句
t10002 是别名
fsdfdsffffff 2010-11-26
  • 打赏
  • 举报
回复
不知道你用的什么数据库,这是oracle的分页

//合成分页sql
String _sql=
"select * from ( select row_.*, rownum rownum_ from ("+
sql+//你的sql语句,可以在这里写入你的SQL
") row_ where rownum <= "+pageIndex*pageSize+") where rownum_ > "+(pageIndex-1)*pageSize;

当然不同的sql语句有不同的分页语句,下面是mysql的

/合成分页sql
String _sql=
"select * from ( select row_.*, rownum rownum_ from ("+
sql+//你的sql语句,可以在这里写入你的SQL
") row_ where rownum <= "+pageIndex*pageSize+") where rownum_ > "+(pageIndex-1)*pageSize;

以上的是通用分页方式,可以写成分页类调用,只需传入你的SQL就可以,只取你需要的数据
希望对你有帮助
loveajin 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dr_lou 的回复:]
可以内存分页的。
例如:你有1000条记录,每页显示10条。你可以一次性读入10*5(页)条,然后用户翻前5页都不用访问db了。
[/Quote]
抱歉,刚才没理解透,我这个帖问的就是如何实现你说的一次读入10*5条记录,用哪种方式好?
loveajin 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dr_lou 的回复:]
可以内存分页的。
例如:你有1000条记录,每页显示10条。你可以一次性读入10*5(页)条,然后用户翻前5页都不用访问db了。
[/Quote]
嗯,谢谢,这个我们目前已经实现了,现在就是想在后台分页,意思是不想一次性就把所有数据都读到内存,因为有些数据量实在庞大,几万条的也有可能出现。所以就想找个好点的,适合我们工程的方法
dr_lou 2010-11-26
  • 打赏
  • 举报
回复
可以内存分页的。
例如:你有1000条记录,每页显示10条。你可以一次性读入10*5(页)条,然后用户翻前5页都不用访问db了。
loveajin 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hahadiai101 的回复:]
你用jdbc来分页啊,那个是比较不好分啊
现在都是用hibernate来实现分页的,那里边有两个方法.setFirstResult() .setMaxResult();
前面一个是从第几个数据开始往出拿,后面的那个方法是从第一个数据开始拿多少个
你只人传两个参数就可以了
最好写个分页实体类最好
[/Quote]
你好,因为我们的工程大部分功能都是调用存储过程来处理数据,所以基本没用hibernate,请问你知不知道hibernate实现的机制呢?或许对我有帮助
hahadiai101 2010-11-26
  • 打赏
  • 举报
回复
你用jdbc来分页啊,那个是比较不好分啊
现在都是用hibernate来实现分页的,那里边有两个方法.setFirstResult() .setMaxResult();
前面一个是从第几个数据开始往出拿,后面的那个方法是从第一个数据开始拿多少个
你只人传两个参数就可以了
最好写个分页实体类最好
安心逍遥 2010-11-26
  • 打赏
  • 举报
回复
不懂。帮顶,祝你好运

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧