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

SQL> select dbms_rowid.rowid_object('AAAM+rAAGAAAACUAAJ') object_id#,dbms_rowid.rowid_relative_fno('AAAM+rAAGAAAACUAAJ') rfile#,dbms_rowid.rowid_block_number('AAAM+rAAGAAAACUAAJ') block#,dbms_rowid.rowid_row_number('AAAM+rAAGAAAACUAAJ') row# from dual;

 

OBJECT_ID#     RFILE#     BLOCK#       ROW#

--------------- ---------- ---------- ----------

          53163          6        148          9

 

test1表中第10行记录就是第53163个对象、第6号文件、第148个块的第10条记录(0->9)

 

如果我们要获取test1表中的前5条记录,那么可以用如下的方法:

 

SQL> select object_id,object_name from test1 where rownum<=5;

 

 OBJECT_ID OBJECT_NAME

---------- ------------------------------

        20 ICOL$

        44 I_USER1

        28 CON$

        15 UNDO$

        29 C_COBJ#

 

或者

 

SQL> 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机制的解释:

1 Oracle executes your query.

2 Oracle fetches the first row and calls it row number 1.

3 Have we gotten past row number meets the criteria? If no, then Oracle discards the row, If yes, then Oracle return the row.

4 Oracle fetches the next row and advances the row number (to 2, and then to 3, and then to 4, and so forth).

5 Go to step 3.


当你使用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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fb114b4e2126a9987bbbb6af660ba61c.html