当前位置:  数据库>oracle

使用rowid和rownum获取记录时要注意的问题

    来源: 互联网  发布时间:2017-06-11

    本文导语: 10 rows selected.  

我们知道,rowid和rownum在Oracle中都是可以被当做伪劣使用的,主要用来定位表中特定的记录,但它们是有区别的,rowid是和行记录的物理地址对应的,而rownum则不是,是通过返回的记录集来判断首条记录,即rownum=1的记录,然后再去fetch之后的记录,rownum=2、rownum=3……,以此类推。下面来看实验:
 
SQL> conn zlm/zlm
Connected.
SQL> create table test1 as select object_id,object_name from dba_objects where rownum col object_name for a30
SQL> select * from test1;
 
 OBJECT_ID OBJECT_NAME
---------- ------------------------------
        20 ICOL$
        44 I_USER1
        28 CON$
        15 UNDO$
        29 C_COBJ#
         3 I_OBJ#
        25 PROXY_ROLE_DATA$
        39 I_IND1
        51 I_CDEF2
        26 I_PROXY_ROLE_DATA$_1
 
10 rows selected.
 
用*来表示全部列,此时并不会显示出rowid,rownum这2个伪列,这也就是“伪列”这个名词的由来,是假的,fake的,我们可以使用它,但并不作为数据存储在表中
 
SQL> select rowid,rownum,object_id,object_name from test1;
 
ROWID                  ROWNUM  OBJECT_ID OBJECT_NAME
------------------ ---------- ---------- ------------------------------
AAAM+rAAGAAAACUAAA          1         20 ICOL$
AAAM+rAAGAAAACUAAB          2         44 I_USER1
AAAM+rAAGAAAACUAAC          3         28 CON$
AAAM+rAAGAAAACUAAD          4         15 UNDO$
AAAM+rAAGAAAACUAAE          5         29 C_COBJ#
AAAM+rAAGAAAACUAAF          6          3 I_OBJ#
AAAM+rAAGAAAACUAAG          7         25 PROXY_ROLE_DATA$
AAAM+rAAGAAAACUAAH          8         39 I_IND1
AAAM+rAAGAAAACUAAI          9         51 I_CDEF2
AAAM+rAAAACU      10         26 I_PROXY_ROLE_DATA$_1
 
10 rows selected.
 
把列名全部显示指定,可以看到,rowid和rownum这两列的内容也都显示了。那我们能不能用rowid列来作为查找条件呢?当然是可以的,但前提是你要知道rowid值是怎么分布的
 
SQL> select rowid,object_id,object_name from test1 where rowid col name for a45
SQL> select file#,name from v$datafile;
 
     FILE# NAME
---------- ---------------------------------------------
         1 /u01/app/oracle/oradata/ora10g/system01.dbf
         2 /u01/app/oracle/oradata/ora10g/undotbs01.dbf
         3 /u01/app/oracle/oradata/ora10g/sysaux01.dbf
         4 /u01/app/oracle/oradata/ora10g/users01.dbf
         5 /u01/app/oracle/oradata/ora10g/example01.dbf
         
 
zlm用户默认的表空间就是zlm,其对应的数据文件就是zlm01.dbf,可以看到,
 
我们还可以用Oracle提供的来根据rowid的值来获取object_id#,rfile#,block#,row#这些具体的值:
 
SQL> select dbms_rowid.('AAAM+rAAGAAAACUAAJ') object_id#,dbms_rowid.('AAAM+rAAGAAAACUAAJ') rfile#,dbms_rowid.('AAAM+rAAGAAAACUAAJ') block#,dbms_rowid.('AAAM+rAAGAAAACUAAJ') row# from dual;
 
OBJECT_ID#     RFILE#     BLOCK#       ROW#
--------------- ---------- ---------- ----------
         
 
test1表中第10行记录就是
 
如果我们要获取test1表中的前5条记录,那么可以用如下的方法:
 
SQL> select object_id,object_name from test1 where rownum select object_id,object_name from test1 where rownum!=6;
 
 OBJECT_ID OBJECT_NAME
---------- ------------------------------
        20 ICOL$
        44 I_USER1
        28 CON$
        15 UNDO$
        29 C_COBJ#
 
对于第一种写法,大家都可以理解,那么为什么rownum!=6这个条件,返回的也是前5条记录呢?是不是觉得不可思议,7-10条记录也满足!=6啊,为什么不会显示呢?
 
来看一下官方关于rowid机制的解释:


当你使用rownum作为查询条件是,Oracle的SQL引擎总是会先去找row number 1这条记录,如果没有找到,那么就直接丢弃这些row,直到找到为止,然后才会有row number 2,row number 3……不断地循环这个过程,直到结束不符合条件为止
 
在第2个查询中,由于rownum=1符合了!=6这个条件,那么会依次fetch下去,直到取到了rownum=5,都是符合的记录,然后就会返回一个结果,而由于中间断档了,那么当找到第6条记录的时候,显然不符合!=6这个条件,那么刚才的一轮循环就结束了,而之后的第7条记录,由于其中不再包含row numer 1这个必要条件,因此直接就丢弃了后面的查询,也就是说,8-10条记录也不会再去fetch了,因为没有一条可以获取到rownum=1

Oracle中rownum和rowid的理解

Oracle rowid

Oracle入门基础教程:rowid详解

Oracle 中ROWNUM用法总结,ROWNUM 与 rowid 区别

rowid走索引之嫌疑犯抓获

Oracle利用rownum和rowid分页

Oracle 10g 中的ROWID详解 

更多详情见请继续阅读下一页的精彩内容:


    
 
 

您可能感兴趣的文章:

  • linux不用命令方式读文件获取网络流量,如何使用C函数调用获取网络流量信息?
  • 急,,,怎样获取远程系统的CPU和内存使用率
  • curl不使用文件存取cookie php使用curl获取cookie示例
  • 怎么写个CGI程序获取远程linux主机的信息,如cpu使用率,内存使用等?
  • 如何获取客户端浏览器所使用的语言,特别是要区分简繁体!
  • 使用ps命令,如何使用系统命令根据进程名称获取进程和子进程的ID?除了ps,还有其它系统命令的办法吗?谢谢。
  • 使用Jquery获取带特殊符号的ID 标签的方法
  • sql server 使用ntile获取数据的例子
  • c语言在unix系统下,如何获取cpu使用率
  • hp_ux下如何使用java获取top信息
  • 怎样使用FTP递归获取文件夹下的所有文件及子文件夹?
  • [求助]如何获取一个程序所使用的系统调用和参数?
  • jquery使用$(element).is()来判断获取的tagName
  • ASP.NET使用Subtract方法获取两个日期之间的天数
  • 哪位编程高手知道如何编程实现获取进程的内存使用量信息(linux)
  • 多网卡多IP情况下如何通过脚本获取当前登录终端使用的ip?
  • 使用标准SAX解析XML文档如何获取文档编码信息及约束它的dtd文件路径.
  • linux中,获取系统的CPU、内存、硬盘使用情况该用什么函数?
  • 如何使用c语言获取当前系统的时间,就是那个秒数?
  • 请问,怎样通过程序方式,获取AIX系统当前的CPU, 内存使用情况?
  • jquery的live使用注意事项
  • sql server中使用Unicode字符时要注意的问题
  • 如何使用shell命令取到本机ip,注意只有本机ip的字符串 ,比如“xxx.xxx.xxx.xxx”
  • css display:none使用注意事项小结
  • Oracle SQL使用时注意自己的输入
  • java switch语句使用注意的四大细节
  • 刚要开始使用linux应该安装什么版本,看些什么书,注意一些什么问题,多谢大家知道,谢谢。
  • 刚要开始使用linux应该安装什么版本,看些什么书,注意一些什么问题,多谢大家知道,谢谢。 iis7站长之家
  • php递归函数中使用return的注意事项
  • 想搞嵌入式驱动的开发,请大虾给个简单例程(通过SPI读写外扩存储芯片),以及开发步骤及应注意的地方,怎么加入内核和使用该驱动?谢谢
  • 送分!送分!!!请讲解一下BEA的WebLogic和IBM的websphere以及其他的WEB应用服务器软件的优、缺点。还有前两者使用过程中应该注意的问题细节!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • rhel as 4.7的sendmail使用中mx记录的问题
  • 使用存储过程实现循环插入100条记录
  • Linux系统会不会把一个工作中的进程的cpu使用情况记录在文件中?
  • 请问如何使用snmp给一个表添加、修改记录?
  • 使用完ejb对象,快速释放出它占用的空间,而不删除数据库记录,是用的那条语句?
  • 用来记录登录后使用命令的shell脚本
  • 使用php记录用户通过搜索引擎进网站的关键词
  • 在Servlet中使用Jdbc-odbc连接access数据库,为什么模糊查询查不出记录啊,求救!!
  • 查询返回多条记录是不是就不能使用Entity Bean了?
  • 使用mysql的disctinct group by查询不重复记录
  • MySql中having字句对组记录进行筛选使用说明
  • 使用SQL Server 获取插入记录后的ID(自动编号)
  • 使用SQL查询昨天、今天、明天和本周等记录的语句
  • 求一个使用tcp协议传送类似数据库表的二维数组的例子。每条记录上的字段数据类型不一定一样。
  • jquery.validate.js插件使用经验记录
  • SQL Server遍历表中记录的2种方法(使用表变量和游标)
  • 使用Linux下script工具记录Oracle输出
  • 使用distinct在mysql中查询多条不重复记录值的解决办法
  • 实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法
  • 使用mss2sql工具将SqlServer转换为Mysql全记录
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,