本文针对OracleSql分页原理进行研究学习,如有不对欢迎指正
Oracle的表中,除了开发者自己拟定的字段外还有一些,Oracle自动生成的虚拟字段(伪列),常用的有:
sysdate, systimestamp,RowNum ,RowID, CURRVAL, NEXTVAL,UID, USER,Level,ORA_ROWSCN
分页中常用RowNum进行分页;
建表:
按需添加记录:
通过可以查出
ROWNUM伪列是Oracle首先进行查询获取到结果集之后在加上去的一个伪列
ROWID可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。
按照一般分页思想
假设需要查询的记录的页码为2,每页显示3条记录,则需要显示出上面查询记录的ROWNUM在4-6的记录
就有了:
显示结果:
发生了什么!?
首先我们要知道:ROWNUM是Oracle查询出结果集之后再自动加上去的伪列
在进行
查询结果是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。在判断第一条记录也就是ROWNUM是否>=4时,第一条记录不符合条件被删除,第二条记录的ROWNUM变成了1,重复循环就永远没有满足条件的记录了;
解决方法是将查询出的结果集的ROWNUM作为数据另存到结果集中,不随结果集变化而产生变化就能解决了
由于ROWNUM不能使用>,可以改造查询语句
结果一致,没有问题
在java程序中的分页语句:
SELECT * FROM (SELECT ROWNUM rn,c.* FROM cource c WHERE ROWNUM<=pageNum*pageSize) WHERE (pageNum-1)*pageSize
全文结束,谢谢大家