欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-04 13:05:39
...

数据伪列指的是用户不需要处理的列,而是由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;

 

示例:显示第三页的内容,currentPage=3,lineSize=10;

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

  

 

ROWID

ROWID表示的是每一行数据保存的物理地址的编号。例如,观察如下的查询:

SELECT ROWID, deptno , dname, loc FROM dept;

 


Oracle 数据伪列ROWNUM、RUMID介绍与示例
            
    
    博客分类: Oracle rownumrownidoracledb 
  


每一条记录ROWID都不会重复,所以即便表中所有列的数据内容都重复了,ROWID也是不会重复的,而且以一个ROWID为例,说明ROWID组成,例如:

AAAR3qAAEAAAACHAAB

<!--[if !supportLists]-->·      

        示例:删除表中的重复记录

 现在项目之中由于管理不善,所以导致出现了许多重复记录

 先按照查询的方式做,首先找到所有重复的数据,重复的数据就比较容易,按照部门名称及位置分组,之后统计个数,如果告诉大于1,则表示重复

        数据插入的早,ROWID就小

        表示按照部门名称及位置分组,取出每一个最小的ROWID

        

select min(rowid) from dept group by dname, loc;

 

 

以上的数据是不删除的,所以下面编写DELETE语句:

DELETE FROM dept
WHERE ROWID NOT IN(
SELECT MIN(ROWID)
FROM dept
GROUP BY dname, loc
);
 
COMMIT;

 

在使用PL/SQL Developer更新手动修改数据时,添加ROWID查询则可以手动修改

SELECT t.*,ROWID FROM TABLE_NAME

另一种方式:

select ... from TABLE_NAME for update 

 则是悲观锁定,将表锁住,这种方式不推荐使用

  • Oracle 数据伪列ROWNUM、RUMID介绍与示例
            
    
    博客分类: Oracle rownumrownidoracledb 
  • 大小: 6 KB