我有一个名为points的表。我执行了下面的查询,并期望得到一个ROWID的字典排序列表,但这并没有发生。Order by rowid如何对行进行排序?
select rowid from points order by rowid
我有过类似的争吵
- AAAE6MAAFAAABiSAAA
- AAAE6MAAFAAABi+AA
第二行在字典上比第一行小。那么,如果不是毒理学分类,那么分类标准是什么呢?
您看到的只是用于显示目的的表示。
实际的rowid包含关于数据块、块中的行、块所在的文件和表的内部对象id的二进制信息(有关详细信息,请参阅手册)
使用order by rowid
时,Oracle会根据(内部)信息而不是"字符串表示"对行进行排序。
如果您将查询更改为:
select rowid,
dbms_rowid.rowid_relative_fno(rowid) as rel_fno,
dbms_rowid.rowid_row_number(rowid) as row_num,
dbms_rowid.rowid_block_number(rowid) as block_num,
dbms_rowid.rowid_object(rowid)
from points
order by rowid
您很可能会看到行号排序背后的逻辑。
请注意,dbms_rowid.rowid_object()
的值将始终相同。如果表中只有两行,那么rowid_block_number()
的值也很可能相同
rowid的序列是不保证的。这取决于您如何设置NLS设置。另外,rowid表示该行在数据库中的物理分配。rowid被认为是不可变的(不会改变),但如果删除一行并再次插入,它就会改变。
如果删除一行,Oracle可能会将其rowid重新分配给新行稍后插入。