Oracle ROWID 值

Posted

技术标签:

【中文标题】Oracle ROWID 值【英文标题】:Oracle ROWID values 【发布时间】:2014-06-12 12:12:42 【问题描述】:

我试图使用以下查询从表中获取最后一条记录。

SELECT *
  FROM TABLE1
 WHERE ROWID IN (SELECT MAX (ROWID) FROM TABLE1);

当我检查ROWID时,

值为AAAZA5eAFAAA7AAAA

还有MIN(ROWID) 的一些其他值。

这个pseudocolumn 是如何在这里得到评估的?它还提到 Oracle 数据库不保证这些列的值是有效的 rowids。所以 ROWID 值在模式中不一定是唯一的?

根据文档: 数据库中的每一行都有一个地址。您可以通过查询伪列 ROWID 来检查行地址。该伪列的值是表示每行地址的字符串。这些字符串的数据类型为 ROWID。您还可以创建包含具有 ROWID 数据类型的实际列的表和集群。 Oracle 数据库不保证这些列的值是有效的 rowid。

【问题讨论】:

【参考方案1】:

无法通过此方法获取表中的最后一行。 rowid can change,这意味着它将不一致,Oracle从不保证它们是以任何顺序创建的。

获取表格最后一行的唯一可靠方法是to use the data in that table。

要真正回答您的问题,正在以与您的 NLS_SORT 参数一致的方式评估伪列:

select value
  from nls_session_parameters
 where parameter = 'NLS_SORT';

VALUE
------------------------------
BINARY

在我的例子中,它是二进制的,这意味着数据库正在执行二进制排序,以便确定任何一个值是否比另一个值“更大”。把它想象成ASCII table; A 的十进制 ASCII 值是 65,u 的值是 117。这意味着 A 排在 u 之上。

【讨论】:

以上是关于Oracle ROWID 值的主要内容,如果未能解决你的问题,请参考以下文章

oracle中rowid怎么用?

Oracle ROWID具体解释

oracle 学习笔记2

oracle数据库:去除重复记录 rowid

关于ORACLE 1410:invalid ROIWD,然后借着机会学习了一波ROWID。

informix/oracle rowid 问题