日期:2014-05-16  浏览次数:20423 次

Oracle 数据伪列ROWNUM、RUMID介绍与示例

数据伪列指的是用户不需要处理的列,而是由Oracle自行维护的数据列,在Oracle之中有两个数据伪列:ROWNUMRUMID

?

ROWNUM

? ? ? ?ROWNUM从单词含义上讲应该是行号,实际上ROWNUM为每一个显示的记录都会自动随着查询生成行号,例如,通过两个代码观察:

?

SELECT  ROWNUM ,empno, ename, job, hiredate, sal FROM emp;

?? ? ? ?

?

此时的ROWNUM行号并不是永久固定的;

?

SELECT  ROWNUM ,empno, ename, job, hiredate, sal FROM emp WHERE deptno = 30;

?

?

? ? ? ? ROWNUM是每次动态重新生成的,即让有ROWNUM之后,下面就可以实现数据的部分显示

示例:查询前5条记录

?

SELECT ROWNUM,empno , ename ,job, hiredate, sal FROM emp WHERE ROWNUM<=5;

?

?

示例:查询610记录

按照正常思维肯定是直接进行BETWEEN…AND的判断;

SELECT ROWNUM empno, ename, job, hiredate ,sal FROM emp WHERE ROWNUM BETWEEN 6 AND 10;

?

这个时候并没有返回任何的数据,因为ROWNUM不是真实列,而要想真正的实现这种查询思路是:先查询前10条记录,之后再显示后5条记录,要依靠子查询完成

SELECT * FROM(
   SELECT ROWNUM rn,empno,ename,job,hiredate,sal FROM emp
   WHERE ROWNUM<=10) temp
WHERE temp.rn>5; //temp.rn>5表示显示5条后的数据

?

如果现在按照这个思路,下面就可以给出分页程序中所需要的功能实现

示例:显示前5条记录

? ? ? ??当前所在页(currentPage)为1

? ? ? ??每页显示的记录长度(lineSize)为5

第一页:

SELECT * FROM(
   SELECT ROWNUM rn, empno, ename, job, hiredate, sal FROM emp
   WHERE ROWNUM<=5) temp
WHERE temp.rn>0;

?

范例:显示中间的5条记录

当前所在页(currentPage)为2

? ? ? ?每页显示的记录长度(lineSize)为5

第二页:

SELECT * FROM(
   SELECT ROWNUM rn,empno,ename,job,hiredate,sal FROM emp
   WHERE ROWNUM<=10) temp
WHERE temp.rn>5;